• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Nginx特性及原理介绍

Nginx 彭东稳 8年前 (2016-04-16) 26889次浏览 已收录 0个评论

一、Nginx介绍

2012 年, Nginx荣获年度云计算开发奖(2012 Cloud Award for Developer of the Year),并成长为世界第二大 Web 服务器。 全世界流量最高的前1000名网站中, 超过25%都使用Nginx来处理海量的互联网请求。Nginx已经成为业界高性能Web服务器的代名词。那么,什么是Nginx? 它有哪些特点? 我们选择 Nginx 的理由是什么? 如何编译安装Nginx? 这种安装方式背后隐藏的又是什么样的思想呢?后面一一介绍。

Nginx是什么?

人们在了解新事物时, 往往习惯通过类比来帮助自己理解事物的概貌。 那么, 我们在学习 Nginx 时也采用同样的方式, 先来看看 Nginx 的竞争对手—Apache、 Lighttpd、 Tomcat、Jetty、 IIS, 它们都是 Web 服务器, 或者叫做 WWW( World Wide Web) 服务器, 相应地也都具备 Web 服务器的基本功能 : 基于REST架构风格 , 以统一资源描述符(UniformResource Identifier, URI) 或者统一资源定位符( Uniform Resource Locator,URL)作为沟通依据, 通过 HTTP 为浏览器等客户端程序提供各种网络服务。 然而, 由于这些 Web 服务器在设计阶段就受到许多局限, 例如当时的互联网用户规模、 网络带宽、 产品特点等局限, 并且各自的定位与发展方向都不尽相同, 使得每一款Web服务器的特点与应用场合都很鲜明。

Tomcat和Jetty面向 Java 语言, 先天就是重量级的 Web 服务器, 它的性能与 Nginx 没有可比性, 这里略过。

IIS只能在 Windows 操作系统上运行。 Windows 作为服务器在稳定性与其他一些性能上都不如类 UNIX 操作系统, 因此, 在需要高性能 Web 服务器的场合下, IIS 可能会被“冷落” 。

Apache的发展时期很长, 而且是目前毫无争议的世界第一大 Web 服务器,Apache 有许多优点, 如稳定、 开源、 跨平台等, 但它出现的时间太长了, 在它兴起的
年代, 互联网的产业规模远远比不上今天, 所以它被设计成了一个重量级的、 不支持高并发的 Web 服务器。 在 Apache 服务器上, 如果有数以万计的并发 HTTP 请求同时访问, 就会导致服务器上消耗大量内存, 操作系统内核对成百上千的 Apache 进程做进程间切换也会消耗大量 CPU 资源, 并导致 HTTP 请求的平均响应速度降低, 这些都决定了Apache不可能成为高性能Web 服务器, 这也促使了Lighttpd和Nginx的出现。

Lighttpd和Nginx一样, 都是轻量级、 高性能的Web服务器, 欧美的业界开发者比较钟爱 Lighttpd,而国内的公司更青睐Nginx, Lighttpd使用得比较少。在了解了Nginx的竞争对手之后, 相信大家对Nginx也有了直观感受, 下面让我们来正式地认识一下Nginx吧。

Nginx [engine x]来自俄罗斯的Igor Sysoev在为Rambler Media(http://www.rambler.ru/)工作期间,使用C语言开发了Nginx。Nginx作为Web服务器,一直为俄罗斯著名的门户网站 Rambler Media 提供着出色、稳定的服务。 Igor Sysoev将Nginx的代码开源,并且赋予其最自由的2-clause BSD-like license许可证。 由于 Nginx 使用基于事件驱动的架构能够并发处理百万级别的 TCP 连接, 高度模块化的设计和自由的许可证使得扩展 Nginx 功能的第三方模块层出不穷, 而且优秀的设计带来了极佳的稳定性, 因此其作为Web服务器被广泛应用到大流量的网站上, 包括腾讯、新浪、网易、淘宝等访问量巨大的网站。

Nginx是一个HTTP服务器和反向代理服务器,另外它也可以作为MAIL邮件代理服务器。Nginx的流行度就不用多说了,据Netcraft统计,在2012年8月份,世界上最繁忙的网站中有11.48%使用Nginx作为其服务器或者代理服务器。亚洲最大的在线交易平台淘宝都是使用Nginx,只不过淘宝对Nginx做了二次开发,增加了很多不错的特性,并命名为Tengine。对于tengine目前在国内也有很多站点在使用,具体Tengine对Nginx做了那些变更,有兴趣可以看Tengine官网变更列表: http://tengine.taobao.org/changelog_cn.html。 另外Nginx虽然是开源的,但是也有其商业版本为Nginx Plus,2011年7月,Nginx正式成立公司,由 Igor Sysoev担任CTO,立足于提供商业级的Web服务器。你懂得,商业版提供技术支持,另外在某些特性上可能更专注于商业应用等。

二、为什么选择Nginx?

传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。生成一个新的进程/线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用CPU,而且过多的进程/线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。 

在设计的最初阶段,nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在nginx中,连接请求由为数不多的几个仅包含一个线程的进程worker以高效的回环(run-loop)机制进行处理,而每个worker可以并行处理数千个的并发连接及请求。

在nginx内部,进程间的通信是通过模块的pipeline或chain实现的;换句话说,每一个功能或操作都由一个模块来实现。例如,压缩、通过FastCGI或uwsgi协议与upstream服务器通信,以及与memcached建立会话等。

下面简单说一说Nginx的特性。

1. 模块化设计

Nginx采用了高度模块化设计,使得具有较好的扩展性,Nginx的模块分为核心模块、邮件模块和第三方模块。但是Nginx早期版本中模块不支持动态扩展,也就是说在编译安装时如果没有选择特定功能的模块,想要使用时就必须重新编译Nginx。但Tengine支持动态扩展模块(DSO)。

Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过,大多跟协议相关的功能和某应用特有的功能都是由Nginx的非核心模块实现的,这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。

具体模块类型大概分为以下几类:

核心模块(core modules): 核心模块分为标准模块和可选模块,标准模块就是只要你编译了Nginx就必须会编译的模块,不可选择;可选模块就是编译的时候可以选择用或者不用。

邮件模块(Mail modules): Nginx不光是一个web服务器,还是一个后端代理服务器,且可以为邮件相关的服务进行代理,所以如果需要此功能就可以装载邮件模块即可。

第三方模块(3rd party modules): Nginx还支持许多第三方模块,这些第三方模块我们在编译时要手动指明加载方式进行加载。

2. 高可靠性

高可靠性是指服务可靠性,Nginx采用一个主进程(master)和N个工作进程(worker)的工作模式,而worker进程才是真正复制相应用户请求的进程。配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。 

3. 支持热部署

由于Nginx使用主进程和工作进程的机制,使得Nginx支持热部署,这个热部署包括不停止服务更新配置文件、更新日志文件、以及更新服务器程序版本;有人也称这位平滑升级。 

4. 低内存消耗

Nginx对于内存的消耗是非常小的,特别是对于非活动连接,官方数据在持久连接模式下10000个非活动连接只需要占用2.5M内存。Nginx对于非活动连接是指,当我们开启持久连接功能时,用户连接不再发送数据后就会立即转为非活动连接,直到持久连接超时时间到达,即销毁。

5. 高扩展性

Nginx 的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。 因此,当对某一个模块修复 Bug 或进行升级时,可以专注于模块自身,无须在意其他。而且在HTTP模块中,还设计了 HTTP过滤器模块 : 一个正常的HTTP模块在处理完请求后,会有一串HTTP过滤器模块对请求的结果进行再处理。这样,当我们开发一个新的HTTP模块时, 不但可以使用诸如HTTP核心模块、events 模块、log 模块等不同层次或者不同类型的模块, 还可以原封不动地复用大量已有的HTTP过滤器模块。这种低耦合度的优秀设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。Nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块一样具备极其优秀的性能,充分利用 Nginx 的高并发特性,因此,许多高流量的网站都倾向于开发符合自己业务特性的定制模块。

6. 其他

Nginx支持磁盘异步I/O(AIO)、内存映射机制(MMAP)、事件驱动机制(Event-driven)、单线程N请求等等。所以支持高并发请求解决C10K(并发连接10000)问题而这些都是其他服务器无法支持的,Apache从2.4版本开始才支持事件驱动机制。

三、Nginx基本功能

Nginx除了上面说到的一些独有的特性除外,其主要提供两个方面的功能。

第一种:静态资源的web服务器

1)处理静态资源,如图片、视频、html、css等。

2)能够缓存打开文件的元数据,对于http来说能够大大加快文件打开速度。

3)支持反向代理,如FastCGI(与php-fpm交互)、uwsgi(与Python web框架交互)、SCGI协议,因此可以把web请求代理到后端的应用程序服务器。

4)模块化的架构,支持过滤器,把特定资源过滤出来进行处理,支持gzip压缩、支持SSI(服务器端包含)机制以及图像缩放等等。

5)支持SSL、TLS等协议。 

支持的其它WEB基本功能

1)支持基于名称的虚拟主机。

2)支持Keepalive和pipelined连接。

3)支持自定义访问日志格式、且支持基于日志的缓冲提高其性能以及快速日志轮转

4)支持URL Rewirte(URL重写),使用正则表达式改变URI。

5)支持路径别名。

6)支持3xx-5xx错误代码重定向。

7)支持http refer验证,防止被盗链。

8)支持基于IP及用户的访问控制机制。

9)支持速率限制及并发数限制,来自同一地址的同时连接数或请求数的限制,避免资源被某一个连接大量占用。

10)PUT/DELETE/MKCOL/COPY/MOVE方法。

11)支持FLV流和MP4流。

第二种:反向代理服务器(负载均衡)

Nginx除了被当做一个静态资源的web服务器之外,还提供http协议的反向代理服务器(七层代理服务器),也是比较常用的功能;Nginx使用缓存加速反向代理,简单负载均衡以及容错和后端健康状况检查。除此之外还支持pop3、smpt、imap4等协议的反向代理,但是在国内很少听说会拿Nginx做邮件相关协议的反向代理。 

三、Nginx基本架构阐述

下面提供一张图,基本可以说明Nginx的工作模式。

Nginx特性及原理介绍

从上图可以看出Ningx启动一个主进程Master和多个工作进程worker,工作进程以非特权用户运行。

Master进程的主要工作如下:

  • 读取并验正配置信息;
  • 创建、绑定及关闭套接字;
  • 启动、终止及维护worker进程的个数;
  • 无须中止服务而更新程序;
  • 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
  • 重新打开日志文件,实现日志滚动;
  • 编译嵌入式perl脚本; 

Worker进程主要工作如下:

  • 接收、传入并处理来自客户端的连接,可以是http或者是https协议;
  • 提供反向代理功能,根据不同的协议提供给后端真正的应用程序服务器处理请求,如http协议,说明nginx可以自己处理静态请求,也可以代理到后端的web服务器处理静态请求;基于fastcgi协议把用户的动态请求代理到后端的php-fpm服务器;同时还可以根据memcache协议把用户请求提交给后端的memcached服务器进行缓存。Nginx支持的后端存储还有很多,比如mongofs协议,与mongofs这样的分布式存储进行交互,当然这需要装载第三方模块。
  • 每个worker进程内部组合了多个模块,如http的核心模块、http协议的负载均衡模块、http的反向代理模块、fastcgi模块等等;事实上worker用到什么模块就会自动装载进来的,用户请求就是在这里模块之间流动。
  • 另外面向客户端请求时,每一个worker进程是如何响应客户端的呢?上图也有说明,nginx支持各种客户端连接处理方法,特定方法的有效性取决于所使用的平台上。在支持的几种方法中,nginx通常会自动选择最有效的方法根据其平台。然而,如果需要的话,一个连接处理方法,可以明确地使用use指令指定连接处理方法,前提是此方法必须编译进Nginx。支持的方式(事件驱动模型)有: 如FreeBSD系统支持的kqueue、Linux2.6+支持的epoll、Solaris系统支持的/dev/poll等机制实现进程复用,因此一个进程可以处理N个请求。
  • 与本地磁盘进行交互时,Nginx支持高级I/O机制、支持sendfile、sendfilev、sendfile64(sendfile是一种当用户请求一个文件时进程发起系统调用内核到硬盘加载文件可以直接响应给用户;不需再回应给用户空间进程,而进程再通过内核TCP/IP协议栈发送给用户节约了时间;sendfile64支持大文件);支持文件AIO(使用AIO必须开启DIRECTIO);支持MMAP等机制。
  • 一般反向代理时,Nginx支持直接在本地缓存的机制,当启用缓存功能后,为了能够管理缓存中的缓存对象,需要经常对缓存进行装载和清理等工作。这就需要两个助类的进程来管理,一个叫cache loader、一个叫cache manager。Cache loader进程主要工作是检查缓存存储中的缓存对象,使用缓存元数据建立内存数据库;而Cache manager进程主要工作是缓存的失效时间及过期检验等。

如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (6)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!