Nginx的简介


  1. Nginx是什么
    Nginx 是一个高性能的网页服务器,能够反向代理HTTP、HTTPS、SMTP、POP3、IMAP,也可以作为一个负载均衡器和 HTTP 缓存。是一个免费、开源、高性能的 HTTP 服务器。Nginx 以其高性能、稳定性、丰富的特性、以及简单配置和低资源消耗而著称。Nginx 是由 Igor Sysoev 开发设计来供俄罗斯的大型门户网站和搜索引擎Rambler的使用。此软件在BSD-like协议下发行,可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris和Microsoft Windows等操作系统中运行。

  2. Nginx的优势
    与传统的服务器不同,Nginx 不依赖线程来处理请求。相反,它使用了一个更具可扩展性的事件驱动(异步)体系结构。这种体系结构使用较小的内存量,但更重要的是,内存的使用量在有负载的时候更加可预测。即使你不希望同时处理数千个请求,但仍然可以从 Nginx 的高性能和小内存占用中受益。Nginx所有方向都可以扩展:从最小的VPS(Virtual Private Servers到大型的服务器集群。


Nginx的配置详解


1.Nginx的模块
Nginx 的配置文件的结构抽象成如下示意图

image.png

Nginx 的架构是以高度模块化为设计基础,除了非常少量的核心代码,其它的一切皆是模块。高度抽象的模块接口,结构的设计简单,使得 Nginx 十分的灵活与高效,默认情况下只会加载默认、必须的模块,其它的一些功能实现需要加载一些第三方的模块。而配置文件中的各个指令配置项其实便是对模块的一个功能配置。Nginx 在运行时至少需要加载几个核心的模块和一个事件类模块,这些模块运行时所支持的配置项称为基础配置,这样的配置项很多,一般将其分为四大类:

  • 调试配置项

  • 必备配置项

  • 优化配置项

  • 事件类配置项

在 Nginx 中有一个非常重要的核心模块就是 ngx_http_core_module 模块,它实现了静态 Web 服务器的主要功能,而其相关的配置项都放在 http{} 配置块中。

一个典型、完整的静态 Web 服务器还会包含多个 server 配置块和 location 配置块。

image.png

server 配置块类似于 Apache 中的 VirtualHost 配置块,用于配置虚拟主机。其中 location 用于匹配请求的 URI(URI 表示的是访问路径,除域名以外的内容),匹配的方式有多种:

  • 精准匹配

  • 忽略大小写的正则匹配

  • 大小写敏感的正则匹配

  • 前半部分匹配

其语法如下:

image.png

其中各个符号的含义:

=:用于精准匹配,需要请求的 uri 与 pattern 表达式完全匹配的时候才会执行 location 中的操作。

~:用于区分大小写的正则匹配。

~*:用于不区分大小写的正则匹配。

^~:用于匹配 URI 的前半部分。

2.Nginx实现负载均衡
负载均衡是优化资源的利用率、最大化吞吐量、减少延迟以及确保容错配置的常用技术。通过配置 Nginx 实现负载均衡,提高了 Web 应用程序的可伸缩性和可靠性。负载均衡的实现主要依赖于反向代理与upstream相关模块。

upstream 模块(模块名:ngx_http_upstream_module)是 Nginx 负载均衡的主要模块,它提供了实现后台服务器负载均衡的方法,还提供对后端服务器健康检查的功能。

Nginx 模块一般分为三类:handler、filter、upstream。upstream 模块本质上属于 handler 模块,但是它不会产生自己的内容,而是通过请求其它后端服务器得到需要的内容。

Upstream 模块,使 Nginx 跨越单机的限制,完成网络数据的接收、处理和转发。

数据转发功能,为 Nginx 提供了跨越单机的横向处理能力,使 Nginx 摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。

Nginx 有着很强大的高并发、高负载的能力。当客户端发出静态文件请求(例如前端页面)时,Nginx 会作为一个静态 web 服务器直接向客户端提供静态文件服务。当客户端发出不适合 Nginx 提供服务的动态请求时,Nginx 会作为一个反向代理服务器,将请求转发到上游服务器中处理,处理后返回的动态应答再由 Nginx 转发给客户端。

proxy_pass 便是 HTTP proxy module 中重要配置项,通过该配置项我们可以配置将请求转发给哪一台服务节点、或者哪一个服务群。当设置转发给某一个节点时,其格式为 proxy_pass http://ip或者域名:端口, 当需要转发给某一个服务器群时,需要结合 upstream 使用。

image.png

在默认的负载均衡上,nginx 还支持一些调度算法来配置:

1)最少连接负载均衡:下一个请求被分配给连接数最少的服务器。

image.png

2)加权负载均衡:通过使用权重,来实现负载均衡。

image.png

3) ip-hash 负载均衡:将客户端的 IP 地址用作哈希键,以决定服务器组中应该为客户端请求选择什么服务器。此方法可确保来自同一客户端的请求将始终定向到同一服务器,除非此服务器不可用。

image.png

3.反向代理
反向代理(Reverse Proxy)是指:代理服务器接受来自客户端的请求,然后将请求转发到内部网络上的服务器,并将服务器的响应返回给客户端。与之对应的是正向代理,具体的内容将在后面的实验中详细介绍。
image.png

反向代理服务器在网络拓扑中所处的位置(如上图所示)正好是负载均衡设备所在的位置,因此我们常常使用反向代理服务器作为负载均衡设备。反向代理服务器根据当前后端服务器的负载情况,将请求转发给一台合适的服务器,并将处理结果返回给用户,这就是反向代理负载均衡。

其它常见的 Web 负载均衡方式包括:DNS 轮询、IP 负载均衡、HTTP 重定向负载均衡等。

4.正向代理
正向代理服务器是一个位于客户端和目标服务器之间的服务器,即下图中的服务器 Proxy ,它通常和客户端在同一局域网(也有可能不是)。客户端为了从目标服务器 Server 取得它想要的内容,它首先向代理服务器发送一个请求并指定目标(即要访问的目标服务器),然后代理服务器 Proxy 向目标服务器 Server 转交请求并将获得的内容返回给客户端。

image.png

正向代理的用途:

隐藏客户端的信息:客户端通过代理服务器访问目标服务器,因此目标服务器只知道请求来自哪个代理服务器,而不清楚来自哪个具体的客户端,隐藏了真实的客户端信息。

访问限制:代理服务器可以对客户端进行控制管理,提高安全性。

缓存优化、提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。

正向代理服务器与反向代理服务器两者的相同点是:所处的位置都是客户端和服务器之间,都是将客户端的请求转发给服务器,再把服务器的响应转发给客户端。两者不同的是:

反向代理是服务器的代理,有负载均衡、安全防护等功能;正向代理是客户端的代理,帮助客户端访问其无法访问的服务器资源,解决访问限制问题。

正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。

1)请求头处理
proxy_set_header 用于修改或设置请求头中某个字段 field 的值 value,重定义发往后端服务器的请求头。

proxy_set_header field value;

常用的有以下两种:

proxy_set_header Host $http_host;

在 Nginx 代理向后端服务器(即我们访问的 Web 服务器)发送的 http 请求头中加入 Host 字段信息,用于后端服务器识别是哪个主机访问。

proxy_set_header X-Forwarded-For $remote_addr;

在 Nginx 代理向后端服务器发送 http 请求头加入 X-Forwarded-For 字段信息,用于后端服务器中的服务程序记录真实的客户端 IP,而不是代理服务器的 IP。

配置请求头:

image.png

2)连接时间优化
设置超时时间是为了保证一个请求占用固定的时间,超出之后返回给客户端一个状态码:504 Gateway Time-out(充当网关或代理的服务器,未及时从远端服务器获取请求),可以防止出现一个请求占用过长时间的现象。这里介绍四个关于超时时间设置的指令,分为两大类:

设置解析超时时间:

resolver_timeout 指令。

解析超时时间使用指令 resolver_timeout 来设置。这个时间是指 Nginx 连接 DNS 解析服务器的时间,如果在指定时间内没有连接上 DNS 解析服务器,则判定为连接超时。

代理连接超时时间:

proxy_connect_timeout 指令。

proxy_connect_timeout 指令用于设置正向代理服务器与 Web 服务器连接的超时时间(即发起 TCP 握手等候的超时时间)。如果在指定时间内没有与 Web 服务器建立 TCP 连接,则判定为超时。

proxy_send_timeout 指令。

proxy_send_timeout 指令用于设置 Nginx 代理服务器向 Web 服务器传输请求的超时时间。这个时间是指相邻两次写操作之间的最长时间间隔,而不是整个请求传输完成的最长时间。如果 Nginx 代理服务器在超时时间段内没有发送任何数据,TCP 连接将被关闭。

proxy_read_timeout 指令。

proxy_read_timeout 指令用于设置 Nginx 代理服务器从 Web 服务器获取响应信息的超时时间。连接建立成功后,Nginx 等待 Web 服务器的响应,如果在指定的时间内 Web 服务器没有发送数据,那么 Nginx 会断开 TCP 连接。

比如设置解析超时时间为 5 分钟,配置中应该这么写:resolver_timeout 5m;

3)缓冲优化
Nginx 正向代理服务器是客户端和后端服务器沟通的桥梁,后端服务器的响应必然会返回给 Nginx 正向代理服务器,然后 Nginx 代理服务器再将响应传递给客户端。因为客户端的连接速度往往是不同的,甚至可能速度差距十分大。如果客户端是缓慢的,在有缓冲的情况下,Nginx 代理会将后端服务的响应临时存储到缓冲区,然后按客户端的连接速度发送给客户端。如果客户端连接速度很快,缓冲可以关闭,使数据尽快到达客户端。在本实验中,我们配置有缓冲的 Nginx 代理服务器。Nginx 代理服务器将响应临时存储到缓冲区中,但是临时缓冲区是会预设空间大小的,如果超出设定的大小时,缓冲就会写入到磁盘中。缓冲优化主要是要合理设置缓冲区大小,尽量避免缓冲到硬盘时的情况。

缓冲相关指令:

proxy_buffering on | off

proxy_buffering 的作用是配置是否启用 Proxy Buffer。

proxy_buffer_size

proxy_buffer_size 指令配置从被代理服务器获取的第一份响应数据的大小。这个响应数据中一般包含了 http 响应头,Nginx 通过它来获取响应数据和被代理数据的一些必要信息。

proxy_buffers

proxy_buffers 指令用于配置接受一次响应的 buffer 个数和每个 buffer 的大小。缓冲区总的大小为 number*size。若某些请求的响应过大,则超过 buffer 的部分将被缓冲到硬盘(缓冲目录由 proxy_temp_path 指令指定,但一般都选择关闭磁盘缓冲),如果数据缓冲到硬盘会使响应的速度减慢,影响用户体验。

proxy_busy_buffers_size

Nginx 会在没有完全读完后端响应的时候就开始向客户端传送数据,所以它会划出一部分缓冲区来专门向客户端传送数据(这部分的大小是由 proxy_busy_buffers_size 来控制的),然后它继续从后端取数据,缓冲区满了之后就写到磁盘的临时文件中。proxy_busy_buffers_size 指令用于配置处于 busy 状态的 Proxy Buffer 的总大小,一般设置为 proxy_buffers 中单个缓冲区大小的 2 倍。

proxy_max_temp_file_size

proxy_max_temp_file_size 用于配置所有临时文件的总体积大小。(临时文件是指缓冲区满了之后存放到硬盘的文件)

打赏
支付宝 微信
上一篇 下一篇