HTTP
负载均衡将负载分发到两台或多台HTTP
服务器。
在 Nginx
的 HTTP
模块内使用 upstream
代码块对 HTTP
服务器实施负载均衡:
upstream backend {
server 76.76.21.21:80 weight=1;
server app.trumanwl.com:80 weight=2;
server spare.trumanwl.com:80 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
该配置对端口为 80
的两台 HTTP
服务器实施负载均衡,然后再将另一台服务器定义为 backup
,以便在两台主服务器不可用时发挥作用。weight
参数指示 Nginx
向第二台 服务器传输两倍的请求,它的默认值为 1。
HTTP
的 upstream
模块控制着 HTTP
负载均衡。该模块定义了一个目标池 —— 它可以是 Unix
套接字、IP
地址和 DNS
(域名服务)记录的任意组合,也可以是它们的混 合使用配置。upstream
模块还定义了如何将任一个请求分发给任何上游upstream
服务器。 每个上游目标都通过server
指令在上游池中进行定义。server
指令接收 Unix
套接字、 IP
地址或 FQDN
(全限定域名)以及一些可选的参数。可选参数能够增强对请求路由 的控制。这包括均衡算法中服务器的 weight
参数(无论服务器处于待机模式、可用还 是不可用),以及确定服务器是否不可用的参数。
TCP
负载均衡将负载分发到两台或多台 TCP
服务器。
在 Nginx
的 stream
模块内使用 upstream
代码块对 TCP
服务器实施负载均衡:
stream {
upstream mysql_read {
server read1.trumanwl.com:3306 weight=5;
server read2.trumanwl.com:3306;
server 76.76.21.21:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_read;
}
}
此示例中的 server
代码块指示 Nginx
监听 TCP
端口 3306,并对两个 MySQL
数据库 读取副本实施负载均衡,同时将另一台服务器定义为 backup
,以便在主服务器崩溃时 传输流量。
此配置不会被添加到 conf.d
文件夹中,因为该文件夹包含在 http
代码块中;您应该另 行创建名为 stream.conf.d
的文件夹,打开 Nginx.conf
文件中的 stream
代码块,添加 新文件夹以支持 stream
配置。
示例见下。
在 /etc/Nginx/Nginx.conf
配置文件中:
user nginx;
worker_processes auto;
pid /run/nginx.pid;
stream {
include /etc/nginx/stream.conf.d/*.conf;
}
名为 /etc/Nginx/stream.conf.d/mysql_reads.conf
的文件可能包含以下配置:
upstream mysql_read {
server read1.trumanwl.com:3306 weight=5;
server read2.trumanwl.com:3306;
server 76.76.21.21:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_read;
}
http
和 stream
上下文之间的主要区别在于它们在 OSI
模型的不同层上运行。http
上下 文在应用层(七层)运行,stream
在传输层(四层)运行。这并不意味着 stream
上下 文不能通过一些巧妙的脚本获得应用感知能力,而是说 http
上下文是专门为了完全理解 HTTP
协议而设计的,stream
上下文默认情况下只能对数据包进行路由和负载均衡。
TCP
负载均衡由 Nginx
的 stream
模块定义。stream
模块与 HTTP
模块一样,允许您定 义上游upstream
服务器池并配置侦听服务器。在配置服务器侦听给定端口时,您 必须定义待侦听的端口或者地址加端口(可选)。然后您必须配置目标服务,无论这是连接另一个地址的直接反向代理还是上游资源池。
配置中有许多选项可以改变 TCP
连接反向代理的属性,包括 SSL/TLS
验证限制、超时和 keepalive
等。这些代理选项的一些值可以是(或者包含)变量,例如下载速率、 验证 SSL/TLS
证书时使用的名称等。
TCP
与 HTTP
负载均衡中的 upstream
指令非常相似,它们均将上游资源定义为服务器,配置格式同样为 Unix
套接字、IP
或 FQDN
,此外服务器 weight
参数、最大连接数、DNS
解析器、连接数缓增期以及判断服务器是激活状态、故障状态还是备用模式 的参数也都相似。
UDP
负载均衡将负载分发到两台或多台 UDP
服务器。
在 Nginx
的 stream
模块内使用 upstream
代码块(定义为 udp
)对 UDP
服务器实施负载均衡:
stream {
upstream ntp {
server ntp1.trumanwl.com:123 weight=2;
server ntp2.trumanwl.com:123;
}
server {
listen 123 udp;
proxy_pass ntp;
}
}
这部分配置对使用 UDP
协议的两台上游upstream
网络时间协议NTP
服务器实施了负载均衡。UDP
负载均衡的指定非常简单,只需使用 listen
指令中的 udp
参数便可。
如果进行负载均衡的服务需要在客户端和服务器之间来回发送多个数据包,则可以 指定 reuseport
参数。例如,OpenVPN
、互联网语音协议VoIP
、虚拟桌面解决 方案和数据报传输层安全DTLS
都是这种类型的服务。下面举例说明了如何使用 Nginx
处理 OpenVPN
连接并将其代理到本地运行的 OpenVPN
服务:
stream {
server {
listen 1195 udp reuseport;
proxy_pass 127.0.0.1:1194;
}
}
与 TCP
类似,您可以在 stream
模块中找到 UDP
负载平衡,并以同样的方式完成大部分配置。两者的主要区别在于,UDP
负载均衡的 listen
指令指定打开的套接字用于处 理数据报。此外,在处理数据报时,UDP
负载均衡还提供了 TCP
所没有的一些其他指 令,例如 proxy_response
指令,它向 Nginx
指定了可以从上游服务器发送多少预期 的响应。默认情况下,除非达到 proxy_timeout
限制,否则这一数量是无限的。proxy_ timeout
指令设置了在连接关闭之前,客户端或代理服务器连接连续进行两次读取或写 入操作之间的时间。
reuseport
参数指示 Nginx
为每个 worker
进程创建一个单独的侦听套接字。这允许 内核在 worker 进程之间分发传入的连接,以处理在客户端和服务器之间发送的多个 数据包。reuseport
功能仅适用于 Linux kernels 3.9
及更高版本、DragonFly BSD
、 FreeBSD 12
及更高版本。