1.3 选择Nginx的理由
选择Nginx有如下一些理由。
1.3.1 它可以高并发连接
官方测试Nginx能够支撑5万并发连接,在实际生产环境中可支撑2~4万并发连接数。这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache使用的则是传统的select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所消耗的CPU等服务器资源要比Nginx高得多。
笔者曾完成6台Web Server从Apache到Nginx服务器的迁移(这6台Web Server搭建的是一个日均2500万PV的分类信息网站,迁移前每台服务器的平均系统负载为50~60、CPU使用率为70%~90%,迁移后平均系统负载为1~4,CPU使用率为20%~40%,见图1-2。
图1-2 迁移到Nginx后的系统负载与CPU使用率图
由此可见,处理大量连接的读写,Apache所采用的select网络I/O模型非常低效。
Libevent(一个事件触发的网络库,适用于Windows、Linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制)的一张测试结果图,对select、epoll、kqueue等作了清晰的对比,结果自然是epoll(Linux 2.6内核)和kqueue(freebsd)胜出,见图1-3。
图1-3 epoll、kqueue、select等网络I/O模型性能测试对比图
图1-4显示了在实际的生产环境中,Nginx支撑高达28000的活动并发连接数。
图1-4 生产环境下的Nginx活动并发连接数据统计图
1.3.2 内存消耗少
Nginx + PHP(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150MB内存(15MB×10=150MB),开启的64个php-cgi进程消耗1280MB内存(20MB×64=1280MB),加上系统自身消耗的内存,总共消耗不到2GB的内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500MB。用Webbench做压力测试,在3万并发连接下,访问Nginx + PHP(FastCGI)服务器的PHP程序,运行速度仍然飞快。
在实际的生产环境下,两台Nginx + PHP5(FastCGI)服务器运行多个复杂性一般的纯PHP动态程序,从Nginx的日志可以统计出,单台Nginx + PHP5(FastCGI)服务器处理PHP动态程序的能力已经超过“700次请求/秒”(见图1-5),相当于每天可以承受6000万(700×60×60 ×24=60480000)的访问量,而服务器的系统负载也不算高(见图1-6)。
图1-5 生产环境下的Nginx+PHP动态程序处理速度统计图
图1-6 生产环境下的Nginx+PHP系统负载与CPU使用率图
以下是这两台服务器的配置清单及运行的程序说明:
服务器①:DELL PowerEdge 1950(两个Intel(R) Xeon(R) 双核CPU 5120 @ 1.86GHz,4GB内存)。
服务器②:DELL PowerEdge 1950(一个Intel(R) Xeon(R) 双核CPU 5140 @ 2.33GHz,4GB内存)。
Web服务器:CentOS Linux 4.4 + Nginx 0.5.35 + PHP 5.2.6RC2(300 FastCGI Procees, unix-domain socket, with XCache)。
PHP程序内容:大量Memcached读写操作,少量MySQL读操作,大量文件队列写操作。
请求数统计方式:从Nginx访问日志中,统计每分钟的第15秒共有多少条日志记录。
同等硬件环境下,Nginx的处理能力相当于Apache的5~10倍。
1.3.3 成本低廉
购买F5 BIG-IP、NetScaler等硬件负载均衡交换机需要十多万甚至几十万人民币。而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费使用,并且可用于商业用途。
BSD开源协议是一个给使用者很大自由的协议。协议指出可以自由使用、修改源代码,也可以将修改后的代码作为开源或专有软件再发布。当你发布使用了BSD协议的代码,或者以BSD协议代码为基础做二次开发时,须满足三个条件:
(1)如果再发布的产品中包含源代码,则源代码中必须带有原来代码中的BSD协议。
(2)如果再发布的是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
(3)不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD代码鼓励代码共享,但须尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件,并进行发布和销售,因此它是对商业集成很友好的协议。很多的公司、企业在选用开源产品的时候都会首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或二次开发。
Nginx所采用的2-clause BSD-like license衍生自BSD协议,也就是删掉了BSD协议的第3个条件——“不可以用开源代码的作者/机构名字和原来产品的名字做市场推广”。、
1.3.4 其他理由
配置文件非常简单
网络跟程序一样通俗易懂,即使非专业系统管理员也能看懂。
支持Rewrite重写规则
能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组。
内置的健康检查功能
如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问。
节省带宽
支持GZIP压缩,可以添加浏览器本地缓存的Header头。
稳定性高
用于反向代理,宕机的概率微乎其微。
支持热部署
Nginx支持热部署。它的启动特别容易,并且几乎可以7天×24小时不间断地运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行升级。