1. Nginx 介绍

1.1 Nginx 是什么

Nginx(“engine x”)是一个开源的,支持高性能,高并发的WWW服务和代理服务软件。它是由俄罗斯人lgor Sysoev开发的,最初被应用在俄罗斯的大型网站www.rambler.cn上。后来作者将源代码以类BSD许可证的形式开源出来提供全球使用。

Nginx因具有高并发(特别是静态资源),占用系统资源少等特性,且功能丰富而逐渐流行起来。

在功能应用方面,Nginx不但是一个优秀的Web服务软件,还具有反向代理负载均衡功能和缓存服务功能。在反向代理负载均衡功能方面,它类似于大名鼎鼎的LVS负载均衡及Haproxy等专业代理软件,但是Nginx部署起来更为简单,方便;在缓存服务功能方面,它又类似于Squid等专业的缓存服务软件。

Nginx 可以运行在UNIX,Linux,BSD,MAC OS x,Solaris,以及Microsoft Windows等操作系统中。随着Nginx在国内很多大型网站中的稳定高效运行,近两年也逐渐被越来越多的中小型网站所使用。当前流行的Nginx Web组合被称为LNMP或LEMP(即Linux Nginx MySQL PHP),其中LEMP里面的E取自于Nginx(“engine x”)

1.2 Nginx 软件的使用排名

lua修改nginx响应体 lua nginx应用_Web

根据上图可以看出,到目前为止,Nginx已经成为全球使用数量排名第二的Web服务软件,其中2012年Nginx市场占有率为12.6%,2013年市场占有率为14.5,截止作者写作时,市场占有率达到了23.3%,可以看出Nginx的市场占有率由逐年快速递增的趋势

lua修改nginx响应体 lua nginx应用_lua修改nginx响应体_02

1.3 Nginx的重要特性及应用场合

1.3.1 Nginx的重要性

Nginx在诞生之初的功能较弱,随着近几年各种功能特性逐渐增多并日趋成熟,很多大型网站也写了一些功能模块并开源出来,这使得Nginx变得越来越强大了.Nginx具备如下基本特性.

  • 可针对静态资源高速并发访问及缓存
  • 可使用反向代理加速,并且可进行数据缓存
  • 具有简单负载均衡,节点健康检查和容错功能
  • 支持远程FastCGI服务的缓存加速
  • 支持FastCGi,Uwsgi,SCGI,Memcached Servers的加速和缓存
  • 支持SSL,TLS,SNI
  • 具有模块化的架构:过滤器包括gzip压缩,ranges支持,chunked响应,XSLT,SSL及图像缩放等功能.在SSL过滤器中,一个包含多个SSL的页面,如果经由它所具备的其它WWW服务特性如下:
  • 支持基于名字,端口及IP的多虚拟主机站点
  • 支持Keep-alive和pipelined连接
  • 可进行简单,方便,灵活的配置和管理
  • 支持修改Nginx配置,并且在代码上线时,可平滑重启,不中断业务访问
  • 可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志.
  • 可利用信号控制Nginx进程
  • 支持3xx-5xx HTTP状态码重定向
  • 支持rewrite模块,支持URL重写及正则表达式匹配
  • 支持基于客户端IP地址和HTTP基本认证的访问控制
  • 支持PUT,DELETE,MKCOL,COPY及MOVE等较特殊的HTTP请求方法
  • 支持FLV流和MP4流技术产品应用
  • 支持HTTP响应速率限制
  • 支持同一IP地址的并发连接或请求数限制
  • 支持邮件服务代理

1.3.2 Nginx HTTP服务器的特色及优点

  • 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
  • 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
  • 可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能.
  • 具备Squid等专业缓存软件等的缓存功能
  • 支持异步网络I/O事件模型epoll(Linux 2.6+)

1.3.3 Nginx软件的主要企业功能应用

作为Web服务软件

Nginx是一个支持高性能,高并发的Web服务软件,它具有很多优秀的特性,作为Web服务器,与Apache相比,Nginx能够支持更多的并发连接访问,但占用的资源却更少,效率更高,在功能上也强大了很多,几乎不逊色于Apache

反向代理或负载均衡服务

在反向代理或负载均衡服务方面,Nginx可作为Web服务,PHP等动态服务及Memcached缓存的代理服务器,它具有类似专业反向代理(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件(最早开发的这个产品的目的之一就是作为邮件代理服务),但是Nginx的代理功能还是相对简单了些,特别是不支持TCP的代理,但是在Nginx 1.9.0已发布,已开始支持TCP的代理了,看来Nginx的代理功能也在逐渐增强

前端业务数据缓存服务

在Web缓存服务方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能

Nginx的这三大功能(web服务,反向代理或负载均衡服务,前端业务数据缓存服务)是国内使用Nginx的主要场景,特别是前两个.

2. Nginx Web 服务

2.2 Nginx Web服务介绍

Nginx安装简单,配置文件简洁,而且配置灵活.近两年来,Nginx在国内互联网领域的使用日趋火热,越来越多的网站开始使用,如淘宝,阿里,京东,小米,网易,新浪,赶集等.

Nginx作为Web服务器的主要应用场景包括:

  • 使用Nginx运行HTML,JS,CSS,小图片等静态数据(此功能类似Lighttpd软件)
  • Nginx结合FastCGI运行PHP等动态程序(例如使用fastcgi_pass方式)
  • Nginx结合Tomcat/Resin等支持Java动态程序(常用proxy_pass方式)

2.2 Nginx与其它Web软件产品的对比说明

先来看看Apache软件的特点,如下:

  • Apache2.2 版本非常稳定强大,据官方说,Apache2.4版本性能更强
  • Prefork模式取消了进程创建开销,性能很高
  • 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在Apache上
  • 高并发时消耗系统资源相对多一些
  • 基于传统的select模块,高并发能力有限
  • 支持扩展库,可通过DSO,apxs方法编译安装额外的插件功能,不需要重新编译Apache
  • 功能多,更稳定,更安全,插件也多
  • 市场份额在逐年递减

再来看看Nginx软件的特点,如下:

  • 基于异步网络I/O模型(epoll,kqueue)
  • 具备支持高性能,高并发的特性,并发连接可达数万
  • 对小文件(小于1MB的静态文件)高并发支持很好,性能很高
  • 不支持类似Apache的DSO模式,扩展库必须编译进主程序(缺点)
  • 进程占用系统资源比较低

最好是Lighttpd的特点,如下:

  • 基于异步网络I/O模型,性能,并发都与Nginx相近
  • 扩展库是SO模式,比Nginx灵活
  • 目前国内的使用率比较低,安全性没有apache和Nginx好
  • 通过插件(mod_secdownload)可实现文件URL地址加密(优点)
  • 社区不活跃,市场份额较低

2.3 Web 服务产品性能对比测试

各种Web服务产品在静态数据访问性能上的对比,从图中可看出,处理静态小文件(小于1MB)时,Nginx和Lighttpd比Apache更有优势,Nginx处理小文件的优势明显,Lighttpd综合最强.由于测试环境等差异,结论会有误差;

lua修改nginx响应体 lua nginx应用_Web_03

各类Web服务器在动态数据性能上的对比,从图中可以看出.在处理动态数据时,三者的差距不大,Apache更有优势一点.这是因为处理动态数据的能力取决与PHP(Java)和后端数据库的服务能力,也就是说瓶颈不在Web服务器上.一般情况下普通PHP引擎支持的并发连接参考值为3001000,Java引擎和数据库的并发连接参考值侧为3001500.业务场景及网站架构不同,并发连接数也会有上下浮动;

2.4 为什么Nginx总体性能比Apache高

Nginx使用最新的epoll (Linux 2.6内核)和kquecue(freebsd)异步网络I/O模型,而Apache使用的是传统的select模型.目前Linux下能够承受高并发访问的Squid,Memcached软件采用的都是epoll模型.

处理大量连接的读写时,Apache所采用的select网络I/O模型之间的区别.

第一个比喻:假设你在大学读书,住的宿舍楼有很多放假,你的朋友要来找你.select版宿管大妈就会带着你的朋友到各个放假挨个去找,直到找到你为止.而epoll版宿管大妈,会先记下每位入住同学的房间号,你的朋友来找你时,只需告诉你的朋友你住那个放假即可,不用亲自带着你的朋友满宿舍找人了.如果同时来了100个人,都要找自己住这栋楼的同学,select版和epoll版宿管大妈,谁的效率更高,就很明显了.

lua修改nginx响应体 lua nginx应用_Web_04

第二个比喻:select的调度复杂度是线性的,即O(n).举个例子,一个保姆照看一群孩子,如果把孩子是否需要尿尿比作网络I/O事件,select的作用就好比这个保姆挨个询问每个孩子"你要尿尿吗?"如果孩子回答是,保姆领着这些要尿尿的孩子去上厕所(处理网络I/O事件).在epoll机制下,保姆不再需要挨个询问每个孩子是否需要尿尿.取而代之的是,如果孩子需要尿尿,他就自己主动站到事先约定好的地方,而保姆的职责就是查看事先约定好的地方是否有孩子.如果有小孩,则领着孩子去上厕所(网络事件处理).因此,epoll的这种机制,能够高效地处理成千上万的并发连接,而且性能不会随着连接数增加而下降太多.

Apache select和Nginx epoll的技术对比如下:

lua修改nginx响应体 lua nginx应用_Web_04

2.5 如何正确选择Web服务器

虽然国内很多人都在使用Nginx,但是Apache,Lighttpd这两个Web服务器同样非常强大而实用,尤其是Apache,到目前为止仍是全球使用最广泛的Web服务软件.

在实际工作中,我们需要根据业务需求来选择合适的业务服务软件,有关Web服务,选择建议如下:

  • 静态业务: 若是高并发场景,尽量采用Nginx或Lighttpd,二者首选Nginx.
  • 动态业务: 理论上采用Nginx和Apache均可,建议选择Nginx,为了避免相同业务的服务软件多样化,增加额外维护成本.动态业务可以由Nginx兼做前端代理,再根据页面元素的类型或目录,转发到后端相应的服务器进行处理.
  • 既有静态业务又有动态业务:采用Nginx

此外,如果并发不是很大,又对Apache很熟悉,采用Apache也是可以的,Apache2.4版本也很强大,并发连接数也有所增加。总的来说,在满足需求的前提下,首先选择自己最擅长的软件,若发现更好的软件,可在掌握软件之后逐步替换。虽然动态和静态业务都倾向于选择Nginx,但是大前提是自己要熟练掌握Nginx。切记,在工作中不要盲目选择软件,这可能最终会导致自己无法控制局面,从而给企业带来灾难性的损失。