上一回合,我们讨论学习了如何在Linux环境中搭建能够供.NET运行的环境,不知道各位读者是否已经完成了环境的搭建?不过,无论各位读者是采用我们上回合介绍的方法还是采用网上提供的其他方法搭建Linux.NET环境,选择哪个发行版的Linux,采用了那个版本的mono,都有一点非常重要的,就是:必须保证.NET能够在这上面正常的运行,换句话说就是要确保搭建的环境能够正常工作。所谓“三军未动粮草先行”,今后所有关于Linux.NET学习实验都是基于该环境进行的,如果连这个环境没办法正常的运作,那我们今后Linux.NET的学习与实验将会变得困难重重,甚至是无法进行下去。
好了,言归正传,当我们做好一个网站想要发布的时候,一般来说,我们都会把网站挂到服务器中,然后设置好服务器的公网IP、子网掩码、数据库的连接字串等相关参数,处于外网的用户就可以通过在浏览器地址栏中输入域名(如果有)或者直接输入IP地址的方式访问到我们的网站。而在这一连串发生的事件中,服务器软件充当了一个重要的角色,如果服务器软件无法正常的工作,处于外网的用户基本上是无法再通过浏览器的方式来访问你的网站的。
嗯,聪明的读者一定猜到了本回合要讨论学习的内容,对了,本回合我们讨论学习的内容就是:服务器软件Jexus。
由于Jexus需要讨论学习的知识比较多,为此我会把Jexus分开两个回合来讲解,分别是这个回合对于Jexus的一些概念性和基础配置的讲解,以及下一回合Jexus网站配置高级功能的演示与讲解。
本回合我们一起讨论学习的内容:
(1)、对Jexus的概念性理解:什么是Jexus
(2)、对上回合搭建环境时所遗留的问题进行辨析:为什么要选择Jexus
(3)、Jexus的基本操作
(4)、Jexus的整体配置
(5)、介绍并使用Jexus的进程守护工具jws.guard
1、什么是Jexus
“孔子门徒三千,成名七十二”,世界上存在着各种各样不同类型的服务器软件,当然也包括你当时写来玩玩没有发布的那款,而在这众多的软件中,比较著名的有:IIS、Apache、Nginx、LIgHttpd等。而Jexus作为这众多服务器软件的其中一员,现在的排名应该就是这三千名中的第七十三名,也就是还没“成名”的那一位。
的确,Jexus并没有出身在贵族之中,它没有像IIS一样拥有一个有钱有势有技术的托拉斯父亲帮它修饰与推广,也没有像Apache服务器软件一样成为“Apache基金会”的顶级项目被世界所认知,同样也没有像LigHttpd一样拥有高贵的普鲁士血种成为大家的新宠。百度百科中对于Jexus的介绍也只有仅仅的那么几行,(至写本文章为止)维基百科中直接就找不到Jexus的存在,很多读者对于Jexus还是比较陌生的,对于Jexus的认知或许也仅仅是“这东西可以在Linux中跑.NET”,甚至直接就不知道有这么一款软件存在。
孔子的弟子中,虽然只有七十二名的弟子被成为贤人,但是,谁又能说第一百七十二名就不是贤人呢?第七百二十名弟子就不优秀呢?在这剩下的两千多人中,其中也有很多弟子是很优秀的,只不过由于种种的原因而没有被其他人称作“贤人而已”。最近这两天,我跟群主(Jexus的作者)聊了不少东西,咨询了不少关于Jexus的情况,同时也感谢作者对我的一些ASP.NET的知识进行科普和扫盲,通过对Jexus的讨论,我体会到Jexus确实是一款优秀但却没太高名气的服务器软件,也就是那一位“优秀而没有成名的弟子”。
用一句话介绍Jexus:Jexus是一款国产的基于.NET环境的有条件开源的免费的Web服务器软件,目前支持的平台有:Linux、FreeBSD和龙芯(旧版的海支持Windows),由作者(宇内流云)一人独力开发并长期维护,官方的论坛为:Linux DotNet 大本营。
我们在看看Jexus有那些功能特点(摘抄自Jexus说明书)
(1)、高性能的ASP.NET处理能力。这是Jexus的核心功能。不管是稳定性、易用性还是并发承载能力、并行处理速度,Jexus对ASP.NET的支持都是非常优秀的;
(2)、支持Fast-CGI。通Fast-CGI,Jexus能支持包括PHP在内的所有拥有Fast-CGI服务功能的WEB应用;
(3)、具备基于正则表达式的强大的URL重写功能;
(4)、具有强劲的反向代理功能。支持多目标负载均衡,支持本地网站与远程网站无缝整合;
(5)、拥有强大的流媒体支持能力,支持FLV/F4V视频文件拖动播放,支持微软平滑流媒体技术;
(6)、支持“服务器推送”技术,配备了相应的服务器端、客户端开发接口,是开发现代WEB应用的利器;(注意,此功能在5.3版中已经除去,待到HTML5成熟并且大多数浏览器支持之后才重新推出)
(7)、具备可控的“ASP.NET前置缓存”,能最大限度地提高ASP.NET网站的承载能力和响应速度;
(8)、支持Https,具有SSL加密数据安全传输能力;
(9)、具有基础而实用的入侵检测功能,能自动终止已被识别的非法请求;
(10)、安装部署非常简便,操作使用极为简单。
Jexus凝聚了作者的智慧和心血,针对当前Linux.NET服务器软件的不足实行有针对性的开发,因此是为.NET量身定做的一款服务器软件,再加上它所拥有的丰富的功能,确实是一款不错的软件。
2、为什么选择Jexus
上回合,我们部署mono时,我们选择了Jexus作为服务器软件,同时也遗留了一个值得我们讨论的问题:为什么我们选择Jexus作为服务器软件而不是其他?下面我将会 通过两个主要方面的比较来推演出我们选择Jexus的原因:
(1)、Windows 与 Linux 服务器软件的对比
在上一回合的文章中,我阅读了所有读者给我的留言,其中有不少留言比较有趣的,当中有那么一则留言:“.NET在Linux中跑效率和稳定性要比在Windows Server 2003 中要好”,这时我就纳闷了.NET在WinServ03中还跑不过Linux?在自家做的环境中还比不上他人做的?此外,我也在Jexus的作者中得出那么一则消息:“在相同的物理环境中,IIS 6.0 跑不过 Jexus 4.X”。
上面的两幅图片是作者提供的关于IIS6.0 与 Jexus 4.3的简单性能测试,明显的看出Jexus 4.3的负载能力要比IIS 6 要强。当然,对于这片面的简单测试是远远不足以判定Jexus就比IIS性能强悍的,这需要通过更多更严格的系统性的测试,而且还要通过长期的实际使用才能对它们之间的性能对比作出判定。
同时,我这里还要重申一点:“IIS 绝对是一款性能优异的服务器软件”,至于为什么会出现IIS跑不过Jexus的这种情况(这里的讨论仅限于图中的这两个版本的对比,对于新版的IIS与Jexus,这里不作讨论),我想其中的原因更大是由于运作的平台中的不同。
IIS运行在Windows中,而Jexus则运行在Linux中,他们运行在不同的平台中,通过对比平台的差异,或许能够更容易的得出它们的差异。IIS6.0的性能低下(相对于Jexus4.3)很大程度上是由于Windows系统的拖累,为什么这么说?各位读者如果有兴趣的话可以右键点击计算机(我的电脑),然后打开它的服务列表,看看那庞大的列表中共有多少个服务,又有多少个服务是正在运行的(我刚刚自己手数了一下自己的电脑,共有178个服务,运行中的有92个,这里是普通系统,Server版本的当然没有这么多)。
在这众多的服务当中,各位读者能够认得多少个呢?又是否能够清楚的说出每一个服务是干嘛用的呢?我相信各位读者应该没有认得出多少个,在这众多正在运行中的服务,很多都是为Windows系统提供一些体验性的功能,我们即使关闭了也对系统的影响不大,这些服务虽然可有可无,但是在我们安装系统的时候却会自动的给我们装上,并且默认的开机运行,运行就意味着系统需要从CPU消耗计算能力,需要从内存中划分出空间,这都是会浪费我们服务器的资源的。相反的,我们再看看Linux,在安装系统的时候就可以定制软件包,定制服务,我们可以选择最小化安装,也可以只安装我们需要的服务,对于我们不需要的服务,我们可以完全的无视之。还记得一位做服务器管理的老师曾经说过:“对于运行的服务器,我们希望越轻越好,提供的服务越单一越好,开启的服务越少越不容易出错”。我们回过头来看Windows,不免会觉得:“Windows,你太重了”。
此外还有一点更重要,对Windows性能影响更大的,那就是Windows的图形界面。图形的处理会消耗大量的系统资源,而Windows在维持它的系统界面过程中就需要浪费服务器中大量的宝贵资源。我一直有这么一个观点:“Linux是不应该存在图形界面的”,同样,Server版的操作系统也不应该存在图形界面,正规的服务器是要被关在机房的,图形界面做得再好,画面再好看也不会有人去欣赏,尽管WinServ03的界面一点都不美观,但是丑归丑,维持这个界面还是要消耗大量的系统资源,安装CentOS6.4时内存如果没有1G,那图形的安装界面还起不了来,可见图形界面需要消耗多少的资源。同时,如果你是通过远程登陆到机房的服务器进行管理,网络问题同样会成为图形界面推送的一个瓶颈问题。
就这样,过多的服务,加上万恶的图形界面,服务器在真正投入生产之前已经浪费了一笔珍贵的系统资源,相同物理配置的服务器,看似配置相同的环境,实际能够提供给服务器软件支配的系统资源却不同,IIS 6.0跑不过 Jexus 4.3也不足为奇了。
(2)、同是Linux中.NET服务器软件的比较
同时Linux中,运行环境才是真正的相同,这个比Windows/Linux更有可比性。Linux中搭建.NEt环境除了mono+Jexus之外还有一种方式,那就是mono+XSP。XSP是一款.NET的解析容器,它能够对.NET程序进行解析并维持高效的运行,但是它却有一个缺点,就是对于静态资源的处理能力相当有限,而一个网站中,大部分都是图片、CSS、JS等静态文件,真正动态生成的东西并不多,在这种情况下XSP就会暴露出它的软肋,面对这种情况,XSP一般都会整合一个高效的服务器软件进行弥补它的不足。类似于Tomcat+Apache的这种情况。这就衍生出了:网上提供的搭建Linux.NET的另外一种方式Linux+Apache(Nginx)+mono这种方式,它们在Apache(Nginx)和mono之间都会有一个插件,原理实际上就跟XSP一样。
这里推荐一篇文章:《为什么说Jexus更适合打造基于Linux/Unix系统的企业级 ASP.NET平台》,该文章是Jexus的作者写的,里面有比较详细的对比了Linux采用Jexus的好处。阅读完这篇文章之后,相信读者也会明白为什么上回合搭建环境的时候直接选择了Jexus。
最求更稳定,性能更优秀,效率更高,这就是我们选择Jexus的原因。
3、Jexus的操作
经过两个章节关于Jexus的介绍,相信读者对于Jexus已经有了一个概念上的认识,从这个章节开始,接下来我们会对Jexus的使用进行实操,并通过操作Jexus时产生的现象进行讨论,从而进一步的了解并学会使用Jexus。
Linux软件包有一个做得非常好的地方,那就是对于这款软件的使用手册、帮助文档往往都会存在软件本身之中,像“有问题问男人”(man命令)、“--help”等命令都能够提供快速的使用方法查阅,同样,关于Jexus的使用方法我们也可以通过Jexus软件包中的“readme”查阅得到。
我们先看一下Jexus目录中有些什么东西:
里面也没有什么东西,包括四个文件夹(蓝色那种),六个脚本文件(绿色那种)和一些的其他文件(白色那种)。在这个章节里,我们介绍的是Jexus的操作,实际上就是对于Jexus脚本的操作和介绍。
Jexus提供了六个操作脚本(针对5.3之前的版本,5.3版本已把所有jws脚步融合到jws中,使用方法为./jws 参数),他们的名称和功能分别是:
jws.start: 启动Jexus;(如果需要开机自启动的,可以把脚本的全路径[包括脚步本身]添加到/etc/rc.local中;5.3中已改为:jws start)
jws.restart: 重启Jexus,如果命令后边加网站名作为参数,那么就表示启动或重启指定的网站;(5.3中已改为:jws restart)
jws.stop: 停止Jexus,如果命令后边加网站名作为参数,那么就表示停止指定的网站;(5.3中已改为:jws stop)
jws.regsvr: 注册jexus所需要的全局程序集(本命令只在安装或更新jexus后才用,而且必须用;5.3中已改为:jws regsvr)。
state.start: 启动Jexus提供的ASP.NET状态服务;(该脚本在Jesux 5.3 中已经除去,Jexus默认开启)
state.stop: 停止Jexus提供的ASP.NET状态服务;(该脚本在Jesux 5.3 中已经除去,Jexus默认开启)
此外,5.3中还增加以下功能:
jws status:检查Jexus的运行状态
jws -V:查看Jexus的版本
操作方法跟运行普通脚本一样./XXX,没有多少技术含量。这里值得注意的是,这些脚步文件的拥有者应该保证是root用户,并且有运行的权限。
4、Jexus的配置
Jexus的配置分为两个方面,一个是Jexus整体的配置(jws.conf),另外则是网站独立的配置(默认所有的网站配置文件都在siteconf文件夹中)。网站的独立配置可以调用很多Jexus的高级功能,我们把它当到下一回合再进行学习讨论,本章中我们主要进行Jexus的整站配置。我们用vi打开jws.conf看看里面有些什么设置项:
在这里,我解析一下每个选项的作用和注意事项:
(1)、SiteLogDir:这个设置项必须得存在并且开启,该设置项设置Jexus的运行日志记录、各网站运行的日志记录都会存放到该文件夹中。此外,当记录的日志文件大小达到一定程度的时候,Jexus会自动的把日志写到一个新的日志文件中,不会一直通过追加写的方式把所有的日志记录都写到同一文件中。
(2)、SiteConfigDir:这也是一个必须存在并且开启的设置项,这个设置项设置Jexus中各网站配置的存放地点,Jexus中默认的网站配置之所以存放在siteconf就是因为这里默认的值就为siteconf。此外值得注意的是,存放在该配置文件夹中的文件只能是网站的配置文件,其他任何的文件都不能存到到该目录(包括网站配置文件本身的备份文件),因为Linux系统所有的事物都是以文件的方式作为存储,因此无论你采用什么样的后缀,在Linux系统中都只当作普通文件来对待。
(3)、Runtime:该设置项用于配置Runtime的版本,除非有特殊需求需要改动Runtime的版本,一般情况下无需修改。
再来看一下一些高级点的设置项,这些设置项都是默认关闭的,
(4)、LLVM:是否开启LLVM编译器功能。开启LLVM可以把中间语言的编译交给LLVM编译器,这可以加快编译的速度,编译出来的代码性能或许会更优秀一些。不过值得注意的地方:并不是所有的Linux都带有LLVM编译器,并且mono自带的编译器编译效率和编译生成的代码性能上也不差什么,因此如果没有特殊的需要,这一项可以让他保持默认关闭。
(5)、httpd.processes:Jexus中默认的工作进程为1个,单个进程最大的并发数固定为1万个,通过开启多个工作进程可以提高Jexus处理并发的能力,开启多个进程的方式非常简单,只要修改httpd.processes的值并重启Jexus即可。不过这里有几点需要注意的地方:[1]Jexus最大支持的工作进程为4个,因此这里最大只能填写4;[2]如果开启了多个Jexus的工作进程,请注意网站的Session的保存方式,请通过修改网站config文件来修改Session的保存方式,避免采用进程的方式保存Session,否则将会造成Session的不同步,给网站的运作造成不必要的麻烦,Session的保存可以借助第三方的方式来保存(比如数据库,或者Jexus提供的强大的ASP.NET服务状态保存);[3]Jexus工作进程的设置跟服务器的CPU内核数和内存数有关,如果你的Cpu只有一个核,而你配置开启了两个进程,也只能达到一个容错的效果,能够承载的并发数是不会上去的。详细可以参考文章《让Jexus支持高并发请求的优化技巧》。
(6)、httpd.user:不知道各位读者用过Apache没有,在Apache中的httpd.conf有这么一项设置user=XXX:可以把Apache以某个用户的方式启动,相应的该用户的所拥有的操作权限都会赋给Apache进程。同样,httpd.user的作用也是跟Apache中的user是一样的,只要把一个已有的用户的用户名填写到httpd.user中,Jexus就会拥有该用户的操作权限。有什么用?嗯,举个例子吧,如果网站的运行会产生一些新文件的(比如做页面静态化),各位读者会采用什么办法解决呢?chmod 777?这可以解决,但是把目录的权限设置为777会存在安全性的问题,如果可以有一种解决方案:进程和某些用户可以对该目录进行读写操作,而其他用户不能,那就可以解决安全性问题了。嗯,对的,这个时候httpd.user就派上了用场,我们只要创建一个仅能供某个用户读写的目录,并把此用户的用户名填写到httpd.user中,就可以实现我们想要的功能了。
(7)、php-fcgi.set:此功能是用于让Jexus支持PHP,由于这里与.NET关系不大,这里就不做过多的介绍了,需要了解的读者可以参照这篇文章:《让Jexus V5.1支持PHP的操作步骤》。
(8)、CertificateFile 与 CertificateKeyFile:这个是让Jexus支持SSL的配置项,是用方法可以参照文章:《Linux+Apache安装生成配置SSL证书》和《如何让jexus 支持ssl》
在这八大Jexus的网站配置中,有一个终极的注意事项:每次配置后记得重启Jexus,否则刚才的配置是不会生效的!!!
5、Jexus进程守护工具jws.guard
一个运行中的进程,难免会因为各种各样的原因无缘无故的宕掉(比如网站瞬间的负载过高、内存不足等),而Jexus宕掉的后果往往只有一个:对外提供服务的网站无法访问了。因此,我们需要最大限度的保障我们的网站能够提供7*24小时的不间断访问,而一个网站或者一个进程宕掉的过程是瞬间的,也许前一秒还访问得好好的,下一秒就突然间报个404的错误,而从网站或进程挂掉到我们人工的发现并重启服务的过程是漫长的,除非该网站有应对单点故障的解决方案,否则在这漫长的时间之中,网站都处于一个无法访问的黑色时期。如果这个宕掉的网站是一个企业网站,这会造成企业信誉度的下降;如果是一个商城网站,这会造成经济和人气的损失;因此,我们需要让系统能够自动的检测出网站的运行状态,当出现进程服务死机的时候能够自动重启。
jws.guard的是一个python的脚本,工作原理也比较简单:根据设置好的预设值,每隔十秒钟访问一次访问一次指定的端口与文件,当三十秒内出现无法网站时就执行jws.restart进行重启网站。这里的三十秒指的是累计连续三次无法访问,防止因为检测时因为Jexus正忙而误判断重启,对网站进行误伤。
jws.guard的使用方法也比较简单,只要把 “tools/jws_guard” 目录中的 “guard.py” 和 “jws.guard” 两个脚本文件拷贝到Jexus的工作目录(跟jws.start同一目录),然后配置一下jws.guard 中的预设值即可。
我们首先把这两个文件拷贝出去
cd /usr/local/jexus/tools/jws_guard/
cp jws.guard guard.py /usr/local/jexus/
cd /usr/local/jexus/
我们已经把这两个脚本拷贝到工作目录中。
用vi打开并编辑jws.guard
把host、port、path改为我们需要的配置即可,它们分别代表主机地址,端口,检查的路径。一般情况下,如果Jexus采用80端口,这里可以不作修改直接使用,而如果Jexus采用的不是80端口,也只需要修改port,改为正确的端口并保存退出就可以了。host和path一般是不需要修改的,同时也不建议非必要的修改,因为修改jws.guard必须确保修改后修改的配置项是正确的,否则jws.guard就会因为无法访问配置后的网站而反复的重启Jexus,造成不必要的麻烦。
修改好了之后只需要执行./jws.guard即可启动这款Jexus的进程守护工具。
我们尝试性的把Jexus关掉。
……30秒之后……
Jexus又起来了。
通过jws.guard守护守护工具,我们可以很方便的让系统自动的发现Jexus进程宕机并快速的重启进程。同时我们只需要查阅Jexus的运行日志即可发现问题所在。
这里有三点需要提醒的:
(1)、如果需要关闭Jexus服务30秒以上的,请在关闭Jexus之前先执行./jws.guard stopg关闭jws.guard守护工具,以免守护工具自动的把Jexus又启动了起来。
(2)、jws.guard是使用python语言编写的脚本,需要运行该工具时请确保系统中已经安装了python,检查方式可以执行 python -V ,如果没有出现python的版本信息则说明系统中没有安装python,这是,各位读者可以通过yum或者其他方式安装上python之后再运行jws.guard。
(3)、再啰嗦一次,配置jws.guard时请确保配置的值是正确的。
新版的Jexus的稳定性已经非常强,加上jws.guard可以起到加固作用。
好的,至此Jexus的守护工具jws.guard就已经介绍完毕了。
这里补充一点,高版本的Jexus已经把此工具从版本包中剔除,相信是因为高版本的Jexus中抗压能力有了更大的提高,因此作者也放心的将jws.guard移除。如果各位读者想保留功能的,可以下载一个之前版本的Jexus(可以在第一篇的学习手记中找到下载地址),然后在里面把此脚本提取出来使用。【补充于:2014/03/29】
至此为止,本回合对于Jexus的基础讨论已经全部讲解完毕了。希望各位读者在阅读完本回合的文章之后能够对Jexus有一个基础性的了解,同时,如果各位读者有发现本回合中任何知识点的错漏、对本文章有任何的意见或者建议、对Linux.NEt的发展有任何的见解,都欢迎留言指教。
下一回合,我们将会对Jexus的高级功能:访问IP过滤、服务器的高速缓存、URL重写等功能进行深入的讲解并逐一的演示,同时,也希望没有搭建好Linux.NET的读者能够把环境搭建好,因为下回合所有的演示都是基于这个环境来进行实操。好吧,我们下回再见吧.