论Web服务器的运行速度,谁与Nginx争锋!(2)

Apache安装起来很容易。我差点儿要写成“太”容易了;但是如果你光有一身胆量,只晓得“Apache是托管运行网站的某种软件”,就想动手安装Apache,那么恐怕面临需要摸索学习的一个过程。不过,我在网上只搜索了一两个小时以寻求帮助,钻研Apache的配置文件,就建好了网站,它还是放在互联网上的!几个月后,Ars刊登了一篇文章,介绍如何获得免费的SSL/TLS证书()。我立马想试一下——倒不是由于我真的很需要该证书,而是就想看看证书是如何工作的。此文刊登后没过一天,我就为自己的域获得了一份2级通配符SSL/TLS证书,我的Web服务器就有了https。

系统就这样顺利运行了好几年;但是当我开始进一步折腾Web服务器时,这一点开始显露无遗:我安装的系统尽管运行顺畅,但可以做得更好。尤其是,为Web服务器添加了Tectonicus后,我发现系统并非处于最佳运行状态。Tectonicus是一款沙盘游戏《Minecraft》地图渲染工具,可以生成数以百万讲的小图片,并且使用类似谷歌地图(Google Maps)的界面,将众多小图片拼接起来。即使在我的本地网络上,Apache也很难以相当快的速度来显示地图。该Web服务器的硬件配置是双核AMD E-350、2GB内存和Vertex 2固态硬盘,理应会立即显示网站的静态图像。但是htop工具显示,只要一显示Tectonicus地图,Apache进程就疯狂地占用处理器资源;屏幕慢慢填满小图片时,两个处理器核心的使用率都达到了100%。

此外,我开始在同一套服务器设备上运行一个小型维基。这使用Dokuwiki(),该维基服务器可以使用皮肤,非常像MediaWiki,但是将数据存储在平面文件中,并不需要数据库。Dokuwiki需要PHP,这种广泛使用的脚本语言用在全球数量众多的Web服务器上,所以这意味着我需要将某种PHP软件包安装到我目前的环境中。

可以选择的道路有好多条。由于我轻而易举地将Apache安装到Ubuntu上——只需输入“sudo aptitude install apache2”,就得到了所谓的Apache MPM Prefork版本。这是最常安装的Apache版本,其工作方式如下:创建许多独立的Apache进程,以处理Web请求。它不是使用多个线程,而是把任务划分给多个子Apahce进程。想好好了解进程与线程的区别,请参阅关于该话题的这篇Ask Ars特写文章()。prefork是默认的Apache安装,因为Apache是一款可以扩展的Web服务器,它可以进行定制,只要添加模块,就能执行各种实用的操作;而人们可能想要安装的一些模块以多进程方式运行时无法顺畅运行。

用进程来处理每项任务的缺点是,Apache的prefork模式比较占用内存,在负载状态下更是如此。Apache的另一种预编译版本Apache MPM worker可以作为替代方案来安装。worker有别于prefork的地方在于,worker的进程是多线程的,因而它们能够以较少的系统资源来满足更多请求的需要。这就相当于以较少的内存和处理器资源更快地提供网页。不过,由于一些Apache模块在多线程Apache环境下运行时未必能顺畅地运行,你得特意选择该版本,使用软件包管理器安装到Ubuntu以及其他GNU/Linux发行版上。

稍微搜索一下,就发现Apache worker对于使得Tectonicus更快地显示无数小图片大有帮助,但是更换后会引起PHP方面出现一些问题。内置的Apache PHP模块“mod_php”属于以多线程方式运行可能有问题的那些模式。我面临这个难题:丢弃并更换不少软件,才能从mod_php改为独立的PHP。

不过,Ars论坛成员Blacken00100的一个帖子(?p=22241073#p22241073)完全给了我新的方向。Apache结合独立式PHP也许远不如像Nginx这些占用资源少的事件驱动型Web服务器结合独立式PHP来得好。我的想法开始转变。我想,只要我做好一些基本工作,也许可以一路过来,看看能不能安装被广泛认为是当今世界上运行速度最快的Web服务器:Nginx。

后起之秀

Nginx是一款占用资源少的Web服务器,以超快的运行速度超快而出名。它与Apache根本不一样:Apache是进程和线程驱动型的应用软件,而Nginx是事件驱动型的应用软件。这种设计上的差异所带来的实际影响是,少量的Nginx“worker”进程就能处理一大堆的请求,进程之间不用等待对方,也不用同步;它们只要“闭上眼睛”,就能尽快地一口一口地吃掉大象(喻指繁重任务)。

相比之下,Apache处理大量请求的方式是,生成更多的进程来处理请求,这种做法通常耗用大量的内存。Apache看到大象后,边吃边想大象有多大,有时Apache望着面前的沉重任务会有点发愁。另一方面,Nginx完全开始吞吃。

Chris Lea在为什么使用Nginx?网页()上简明扼要地概括了两者的区别:“Apache好比是微软Word,它有100万个选项,但是你只需要其中6个。Nginx就处理那6项任务,但处理其中5项任务时速度比Apache快50倍。”

Nginx在提供静态文件时——比如Tectonicus地图图片图像,表现尤为出色。对比较大的网站来说,它常常被用作前端Web服务器,以便迅速地提供没有变化的网页内容,同时将针对动态内容的请求转交给其他地方运行的更复杂的Apache Web服务器。不过,我感兴趣的是它纯粹作为一台快速运行的Web服务器。

与本文中提到的其他Web服务器一样,只要用简单的“sudo aptitude install Nginx”,很快就能从Ubuntu软件包存储库获得Nginx。我停掉Apache后,很快安装好了Nginx。遵照Blacken的建议,我还改而安装了php5-fpm,这是一款经过大量改动的PHP软件包,内置了FastCGI功能。Blacken之所以建议选用php5-fpm,而不是比较旧、比较有名的php5-cgi套件,是因为fpm能够根据服务器负载的需要来开启或关闭新的PHP进程,因而这是智能化程度高得多、功能强得大的软件包;它所消耗的资源比较少,同时在负载状态下可以透明地扩展、保持速度。

如果你的要求很简单,就像我这样,那么用php5-fpm安装可实际运行的PHP很容易。主配置文件(/etc/php5/fpm/php-fpm.conf under Ubuntu 11.10)根本不需要改动,池配置文件(/etc/php5/fpm/pool.d/www.conf)只需要稍微调整一下。池配置文件定义了php5-fpm将如何接受来自Web服务器的CGI请求。默认情况下,php5-fpm监听TCP端口9000,检查来自Web服务器的请求,但我对此作了更改,改而使用Unix套接字文件,因为让CGI请求通过本地TCP端口进来稍稍带来了一点延迟。除非你的网站在生成大量网页,否则这可能不会有什么影响;但是我想用采取“正确”的做法。另外,池配置文件让你可以指定池进程以哪个用户和用户组来运行——将这设成与Web服务器所使用的用户和用户组一模一样是个好主意。

最重要的是,池配置文件让你可以指定如果php-fpm配置成“动态”模式下,可以生成的PHP进程的最小数量和最大数量。这让你开始时可以只用一两个活动进程来满足PHP请求,但你可以指令php-fpm:根据需要,生成更多的进程。唯一的实际限制是所能抽出来的内存和处理器数量。至于我这个小型网站,我将php-fpm设成一开始只有一个进程,最多可以生成10个进程。最后,池配置文件让你可以指定传统的PHP配置数值,比如最大内存使用量、最大上传文件大小、Sendmail二进制文件的位置,等等。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/psxgd.html