第1章 Nginx介绍
1.1 什么是nginx
Nginx(“engine X”)是一个开源的,支持高性能、高并发的www服务和代理服务软件。它是由俄罗斯人Igor Sysoev开发的,最初被应用在俄罗斯的大型网站www. rambler.ru上,后来作者将源代码以类BSD许可证的形式开源出来供全球使用。
Nginx因具有高并发(特别是静态资源)、占用系统资源少等特性,且功能丰富而逐渐流行起来。(静态小文件)
在功能应用方面,Nginx不但是是一个优秀的web服务软件,还具有反向代理负载均衡功能和缓存服务功能。在反向代理负载均衡功能方面,它类似于大名鼎鼎的LVS负载均衡及Haproxy等专业代理软件,但是Nginx部署起来更为简单方便;在缓存服务功能方面,他又类似于Squid等专业的缓存服务软件。
Nginx可以运行在UNIX、Linux、BSD、Mac OS X、Solaris,以及Windows等操作系统中。随着Nginx在国内很多大型网站中的稳定高效运行,近两年它也逐渐被越来越多的中小型网站所使用。当前流行的Nginx Web组合被称为LNMP或LEMP(即Linux/Nginx/Mysql/PHP),其中LEMP里的E取自Nginx(“engine X”)。
Nginx的官方介绍见http://nginx.org/en/。
1.2 Nginx的重要特性及应用场合
1.2.1 Nginx的重要特性
Nginx在诞生之初的功能较弱,随着近几年各种功能特性逐渐增多并且日趋成熟,很多大型网站也卸了一些功能模块并开源出来,这使得Nginx变得越来越强大了。
- Nginx具备如下基本特性:
- 可针对静态资源高速高并发访问及缓存
- 可使用反向代理加速,并且可进行数据缓存
- 具有简单的负载均衡,节点健康检查和容错功能
- 支持远程fastcgi服务的缓存加速
- 支持FastCGI、Uwsgi、SCGI、Memcached Servers的加速和缓存
- 支持SSL、TLS、SNI
- 具有模块化的架构:过滤器包括gzip压缩、ranges支持、chunked相应、XSLT、SSI及图形缩放等功能,在SSI过滤器中,一个包含多个SSI的页面如果经由FastCGI或反向代理处理,可被并行处理。
- 它所具备的其他www服务特性如下:
- 支持基于域名、端口和IP的多虚拟主机站点
- 支持Keep-alive和pipelined连接
- 可进行简单、方便、灵活的配置和管理
- 支持修改Nginx配置,并且在代码上线时可平滑重启,不中断业务访问
- 可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志
- 可利用信号控制Nginx进程
- 支持3xx-5xx HTTP状态码重定向
- 支持rewrite模块,支持URI重写及正则表达式匹配
- 支持基于客户端IP地址和HTTP基本认证的访问控制
- 支持PUT、DELETE、MKCOL、COPY及MOVE等较特殊的HTTP请求方法
- 支持FLV流和MP4流技术产品应用
- 支持HTTP响应速率限制
- 支持同一IP地址的并发连接或请求数限制
- 支持邮件服务代理
- 面试时回答Nginx HTTP服务器的特色及优点:
- 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
- 资源消耗少:在3万并发连接下,开启10个Nginx线程小号的内存不到200MB
- 可以做HTTP反向代理及加速缓冲,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能
- 具备Squid等专业缓存软件的缓存功能
- 支持异步网络I/O事件模型epoll(Linux 2.6+)
总结:高并发-->资源消耗少-->功能多样(web服务/负载均衡/支持缓存)-->通讯模型先进(epoll)
1.2.2 Nginx软件的主要企业功能应用
Nginx的三大功能(web服务、反向代理或负载均衡服务、前端业务数据缓存服务)是国内使用Nginx的主要场景,特别是前两个。
- 作为web服务软件
Nginx是一个支持高性能、高并发的web服务软件,它具有很多优秀的特性,作为web服务器与Apache相比:Nginx能够支持更多的并发连接访问,但占用的资源确更少,效率更高;在功能上也强大了很多,几乎不逊色于Apache。
- 反向代理或负载均衡服务
在反向代理或负载均衡服务方面,Nginx可以作为web服务、PHP等动态服务及Memcached缓存的代理服务器,它具有类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件(最早开发这个产品的目的之一就是作为邮件代理服务),同时Nginx 1.9.0版本后已开始支持TCP代理。
- 前端业务数据缓冲服务
在web缓冲服务方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能。
第2章 Nginx web服务
2.1 Nginx web服务介绍
Nginx安装简单,配置文件简洁,而且配置灵活,越来越多的网站开始使用,如淘宝、阿里、京东、小米、网易、新浪、赶集等。
- Nginx作为Web服务器的主要应用场景包括:
- 使用Nginx运行HTML、JS、CSS、小图片等静态数据(此功能类似Lighttpd软件)
- Nginx结合FastCGI运行PHP等动态程序(例如使用fastcgi_pass方式)
- Nginx结合Tomcat/Resin等支持Java动态程序(常用proxy_pass方式)
2.2 Nginx与其他web软件的对比说明
2.2.1 Nginx软件特点
- 基于异步网络I/O模型(epoll、kqueue)
- 具备支持高性能,高并发的特性,并发连接可达数万
- 对小文件(小于1MB的静态文件)高并发支持很好,性能很高
- 不支持类似Apache的DSO模式,扩展库必须编译进主程序(缺点)
- 进程占用系统资源比较低
- 支持web、反向代理、前端缓存三大重点功能,并且都很优秀
2.2.2 Apache软件特点
- Apache 2.2版本非常稳定强大
- Prefork模式取消了进程创建开销,性能很高
- 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在Apache上
- 高并发时消耗系统资源相对多一些
- 基于传统的select模型,高并发能力有限
- 支持扩展库,可通过DSO、apxs的方法编译安装额外的插件功能,不需要重新编译Apache
- 功能多,更稳定,更安全,插件也多
2.2.3 Lighttpd软件特点
- 基于异步网络I/O模型,性能、并发都与Nginx相近
- 扩展库是SO模式,比Nginx灵活
- 安全性没有Apache和Nginx好
- 通过插件(mod_secdownload)可实现文件URL地址加密(优点)
- 社区不活跃,市场份额较低
2.3 web服务产品性能对比测试
上图为web服务产品在静态数据访问性能上的对比,从上图可以看出:处理静态小文件(小于1MB)时,Nginx和Lighttpd比Apache更有优势,Nginx处理小文件的优势明显,Lighttpd综合最强。
上图为各类web服务器在动态数据性能上的对比,从上图可以看出:在处理动态数据时,三者的差距不大,Apache更有优势一点,这是因为处理动态数据的能力取决于PHP(Java)和后端数据库的服务能力,也就是说瓶颈不在web服务器上。一般情况下普通PHP引擎支持的并发连接参考值为300-1000,Java引擎和数据库的并发连接参考值为300-1500。
2.4 Nginx总体性能比Apache高的原因
Nginx使用最新的epoll(Linux 2.6 内核)和kqueue(freeBSD)异步网络I/O模型,而Apache使用的是传统的Select模型。目前Linux下能够承受高并发访问的Squid、Memcached软件采用的都是epoll模型,处理大量连接的读写时,Apache所采用的select网络I/O模型比较低效。
2.4.1 Select模型和epoll模型的区别
select的调用复杂度是线性的,即O(n)。select模型会将所有的网络I/O事件遍历一遍后,再将要处理的网络I/O事件进行处理,而epoll会定义一个“监控点”,当有网络I/O事件时,事件会被记录在“监控点”内,而epoll定期查看“监控点”,如果有要执行的事件则直接执行事件。因此epoll的这种机制能够高效地处理成千上万的并发连接,而且性能不会随着连接数增加而下降太多。
- Apache select和Nginx epoll的技术对比:
指标 | select | epoll |
性能 | 随着连接数的增加性能急剧下降,处理成千上万并发连接数时性能很差 | 随着连接数的增加,性能基本上没有下降,处理成千上万并发连接时性能很好 |
连接数 | 连接数有限制,处理的最大连接数不超过1024,如果要处理的连接数超过1024个,则需要修改FD_SETSIZE宏,并重新编译 | 连接数无限制 |
内在处理机制 | 线性轮询 | 回调callback |
开发复杂性 | 低 | 中 |
2.5 如何正确选择web服务器
在实际工作中我们要根据业务需求来选择合适的业务服务软件,建议如下:
- 静态业务:若是高并发场景尽量采用Nginx或Lighttpd,二者首选Nginx
- 动态业务:理论上采用Nginx和Apache均可,建议选择Nginx,为了避免相同业务的服务软件多样化,增减额外维护成本。动态业务可以由Nginx兼做前端代理,再根据页面元素的类型或目录转发到后端相应的服务器进行处理。
- 既有静态业务又有动态业务:采用Nginx
