Skip to content

Nginx 介绍

Nginx(engine X)是一个开源的轻量级的 HTTP 服务器,能够提供高性能的 HTTP 和反向代理服务。与传统的 Apache 服务器相比,在性能上 Nginx 占用系统资源更小、支持高并发,访问效率更高;在功能上,Nginx 不仅作为 Web 服务软件,还适用于反向代理、负载均衡等场景;在安装配置上,Nginx 更为简单、灵活。Nginx 因为并发性能和资源占用上的优势,已经广泛用于大中型互联网企业。

1. Nginx 特点

支持高并发:Nginx 是专门为性能优化而开发的,采用内核 Poll 模型,单机能够支持几万以上的并发连接;

低资源消耗:Nginx 采取了分阶段资源分配技术,使得 CPU 与内存的占用率非常低。一般 1 万个非活跃的 HTTP Keep-Alive 连接在 Nginx 中仅消耗几 MB 内存;

高拓展性:设计极具扩展性,由多个不同功能、不同层次、不同类型且耦合度极低的模块组成;

高可用性:Nginx 支持热部署,其中的 master 管理进程与 worker 工作进程的分离设计;启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到 7x24 小时不间断地运行;

丰富的使用场景:可以作为 Web 服务端、HTTP 反向代理、负载均衡和前端缓存服务等业务场景使用;

开源协议:使用 BSD 许可协议,免费使用,且可修改源码。

2. Nginx 使用场景

2.1 反向代理

代理服务器一般指代局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端。代理服务器是介于客户端和 Web 服务器之间的服务器,客户端首先与代理服务器创建连接,然后根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或则获得目标服务器的指定资源。

正向代理

为了从原始服务器取的内容,客户端向代理发送一个请求并指定目标(Web 服务器),然后代理向 Web 服务器转交请求并将获得的内容返回给客户端,客户端必须要进行一些特别的设置才能使用正向代理。

  • 像 VPN 就是正向代理,一般在浏览器中配置代理服务器的相关信息。

  • 正向代理中代理的对象是客户端,代理服务器和客户端属于同一个 LAN,对服务器端来说是透明的。

反向代理

客户端发送请求到代理服务器,由代理服务器转发给相应的 Web 服务器进行处理,最终返回结果给客户端。

  • 像 Nginx 就是反向代理服务器软件,对客户端暴露的其实是一个 VIP,不是真实的 Web 服务器的 IP。

  • 反向代理的是对象是 Web 服务器端,代理服务器和 Web 服务端属于同一个 LAN,对客户端来说是透明的。

使用反向代理的好处是客户端不需要任何配置就可以访问,对外暴露的是代理服务器的地址隐藏了真实服务器的地址,客户端只需要把请求发送给代理服务器,由代理服务器去选择后端的 Web 服务器,获取到数据后再返回给客户端。

2.2 负载均衡

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

简而言之,单个 Web 应用服务器不能承受日益增长的并发量请求,因此需要不断扩展 web 服务器来支撑高并发请求,根据不同的负载均衡策略将请求分配到各个服务器上。Nginx 支持三种不同的负载均衡策略:

  • 轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉能够被自动剔除。轮询算法适合服务器配置相当,无状态且短平快的服务使用。

  • weight 权重:指定轮询的几率,weight 和后端的访问比例成比例,weight 权重越高比例越大。通常用于后端服务器配置不均的情况。

  • ip_hash:上面两种算法存在一个问题是就是无法做到会话保持,当用户登录到服务器上后,第二次请求的时候会被定位到服务器集群中的某一个,那么已经登录到某个服务器上的用户会重新定位到另一台,之前的登录信息会丢失。ip_hash 算法可以解决这个问题,当用户再次访问请求时,会通过 hash 算法自动定位到已经登录的服务器上,这样每个客户端可以固定在某个 web 服务器上,解决客户端 session 的问题。

2.3 动静分离

动静分离技术是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,将静态文件放在一个单独的 web 服务器上,加快解析速度,降低原来单个服务器的压力。在 Nginx 的配置中,在 server{} 段中加入带正则匹配的 location 来指定匹配项针对 PHP 的动静分离:静态页面交给 Nginx 处理,动态页面交给 PHP-FPM 模块或 Apache 处理。

3. Nginx 功能模块

Nginx 由内核和模块组成,其中内核在设计上非常简洁,完成的工作非常简单,仅仅通过查找配置文件将客户端请求映射到一个 location block,而在这个 location 中所配置的每个指令将会启动不同的模块去完成相应的工作。

3.1 Nginx 模块分类

Nginx 的模块从结构上分为核心模块、基础模块和第三方模块,其中用户根据自己的需要开发的模块都属于第三方模块:

  • 核心模块:HTTP 模块、EVENT 模块和 MAIL 模块;

  • 基础模块:HTTP Access 模块、FastCGI 模块、Proxy 模块和 Rewrite 模块;

  • 第三方模块:HTTP Upstream Request Hash 模块、Notice 模块和 Access Key 模块。

3.2 Nginx 模块功能

Nginx 模块常规的 HTTP 请求和响应的过程如上图所示,Nginx 模块从功能上分为以下三类:

  • Handlers 处理器模块:此类模块直接处理请求,并进行输出内容和修改 headers 信息等操作。Handlers 处理器模块一般只能有一个。

  • Filters 过滤器模块:此类模块主要对其他处理器模块输出的内容进行修改操作,最后由 Nginx 输出。

  • Proxies 代理类模块:此类模块是 Nginx 的 HTTP Upstream 之类的模块,这些模块主要与后端一些服务比如 FastCGI 等进行交互,实现服务代理和负载均衡等功能。

Nginx 本身处理的工作很少,当它接到一个 HTTP 请求时,通过查找配置文件将此次请求映射到一个 location block,而此 location 中所配置的各个指令则会启动不同的模块去完成工作。