2020-03-21 Nginx介绍

1. Nginx介绍

1.1 Nginx是什么

Nginx与Apache软件类似,Nginx(“engine x”)是一个开源的、支持高性能、高并发的WWW服务和代理服务软件。最初被应用在俄罗斯的大型网站www.rambler.ru上,后来作者将源代码以类BSD许可证的形式开源出来供全球使用。
Nginx因具有高并发(特别是静态资源)、占用系统资源少等特性且功能丰富而逐渐流行起来,到目前为止大有赶超Apache,而获得第一的趋势。
从软件大的功能应用方面来看,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)。

1.2 Nginx软件的使用排名

Web Server排行

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

1.3.1 Nginx的重要特性

Nginx具备如下基本特性:

  • 可针对静态资源高速高并发访问及缓存。
  • 可使用反向代理加速,并且可进行数据缓存。
  • 具有较完善的负载均衡、节点健康检查和容错功能。
  • 支持远程FastCGI服务的缓存加速。
  • 支持FastCGI、Uwsgi、SCGI、and 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地址的冰法连接或请求数限制。
  • 支持HTTP、TCP、UDP、邮件服务等多种协议服务代理能力。

企业面试时需要解答如下Nginx HTTP服务器的特色及优点:

  • 支持高并发:能支持几万并发连接(特别是静态小文件业务环境下)。
  • 资源消耗小:在3万并发连接下,开启10个Nginx线程消耗不到200MB内存。
  • 可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS功能。
  • 具备Squid等专业缓存软件等的缓存功能。
  • 支持异步网络IO事件模型epoll(Linux 2.6+)。
  • 最新版同时支持HTTP、TCP、UDP、邮件服务等多种协议服务代理能力。
1.3.2 Nginx软件的主要企业功能应用

(1)作为Web服务软件
Nginx是一个支持高性能、高并发的Web服务软件,它具有很多优越的特性,作为Web服务器,和Apache相比,Nginx能够支持更多的并发连接访问,而占用的资源却更少,效率更高,在功能上也强大了很多,几乎不逊色于Apache,而且Nginx更新频率更快,社区用户更火爆。
(2)反向代理或负载均衡服务
在反向代理或负载均衡服务方面,Nginx可以作为Web服务、PHP等动态服务及Memcached缓存的代理服务器,它具有类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件(最早开发这个产品的目的之一也是作为邮件代理服务),在Nginx的代理功能方面,已经支持TCP和UDP的代理,Nginx的代理功能已经越来越强大了。
(3)前端业务数据缓存服务
在Web缓存服务方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能。
Nginx的这三大功能(作为Web服务软件、反向代理或负载均衡服务、前端业务数据缓存服务)是国内用户使用Nginx的主要场景。

2. Nginx Web服务

2.1 Nginx Web服务介绍

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

  • 使用Nginx运行HTML、JS、CSS、小图片等静态数据(此功能类似Lighttpd软件)。
  • 使用Nginx运行MP4、FLV等视频流媒体服务。
  • Nginx结合FastCGI运行PHP等动态程序(常用fastcgi_pass方式)。
  • Nginx结合Tomcat/Resin等支持Java动态程序(常用proxy_pass方式)。
  • Nginx结合Uwsgi等支持Python动态程序(常用uwsgi_pass方式)。

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

Apache软件的特点如下:

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

Nginx软件的特点如下:

  • 基于异步网络I/O模型(epoll、kqueue)。
  • 具备支持高性能,高并发的特性,并发连接可达数万。
  • 对小文件(小于1MB的静态文件)高并发支持很好,性能很高。
  • 不支持类似Apache的DSO模式,扩展库必须编译进主程序(缺点)。
  • 进程占用系统资源比较低。
  • 支持动态Web、反向代理、缓存三大重点功能,并且都很优秀。
  • 市场份额在逐年快速增加,截至2020年3月已经升到31.8。

Lighttpd的特点如下:

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

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

下图为各种Web服务产品在静态数据访问性能上的对比,从图中可以看出,处理静态小文件(小于1MB)时,Nginx和Lighttpd比Apache更有优势,Nginx处理小文件优势明显,Lighttpd综合性最强。

主流Web服务静态数据性能对比图

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

主流Web动态数据性能对比图

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

Nginx使用最新的epoll(Linux2.6内核)和kqueue(freebsd)异步网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached软件都采用的是epoll模型。
处理大量连接的读写,Apache所采用的select网络I/O模型比较低效。下面用两个通俗的比喻来解释Apache采用的select模型和Nginx采用的epoll模型之间的区别。
1. 第一个比喻
假设你在大学读书,住的宿舍楼有很多间房间,你的朋友要来找你。“select版”宿管人员会带着你的朋友挨个房间去找,知道找到你为止。而“epoll版”宿管人员会先记下每位入住同学的房间号,当你的朋友来找你时,他只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满宿舍楼找人。如果同时来了100个人,都要找自己住在这栋楼的同学,select版和epoll版宿管人员,谁的效率更高,就很明显了。
2. 第二个比喻
select的调用复杂度是线性的,即O(n)。举个例子,一个保姆照看一群孩子,如果把孩子是否需要上厕所比作网络I/O事件,select的作用就好比这个保姆挨个询问每个孩子:你要上厕所吗?如果孩子回答是,保姆把孩子领出来放到另外一个地方。当询问完所有的孩子之后,保姆领着这些要上厕所的孩子去厕所(处理网络I/O事件)。
还是以保姆照看一群孩子为例,在epoll机制下,保姆不再需要挨个询问每个孩子是否需要上厕所。取而代之的是,每个孩子如果需要上厕所,自己主动去实现约定好的地方,而保姆的职责就是查看事先约定好的地方是否有孩子。如果有小孩,则领着孩子去厕所(网络事件处理)。因此,epoll的这种机制,能够高效地处理成千上万的并发连接,而且性能不会随着连接的增加而下降太多。
3. Apache select和Nginx epoll的区别

Apache select和Nginx epoll的区别

你可能感兴趣的:(2020-03-21 Nginx介绍)