TrumanWong

Nginx负载均衡配置

TrumanWong
6/20/2024

Nginx负载均衡配置

HTTP负载均衡

需求

将负载分发到两台或多台HTTP服务器。

解决方案

NginxHTTP 模块内使用 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。

详解

HTTPupstream 模块控制着 HTTP 负载均衡。该模块定义了一个目标池 —— 它可以是 Unix 套接字、IP 地址和 DNS(域名服务)记录的任意组合,也可以是它们的混 合使用配置。upstream 模块还定义了如何将任一个请求分发给任何上游upstream 服务器。 每个上游目标都通过server 指令在上游池中进行定义。server 指令接收 Unix 套接字、 IP 地址或 FQDN(全限定域名)以及一些可选的参数。可选参数能够增强对请求路由 的控制。这包括均衡算法中服务器的 weight 参数(无论服务器处于待机模式、可用还 是不可用),以及确定服务器是否不可用的参数。

TCP 负载均衡

需求

将负载分发到两台或多台 TCP 服务器。

解决方案

Nginxstream 模块内使用 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; 
}

详解

httpstream 上下文之间的主要区别在于它们在 OSI 模型的不同层上运行。http 上下 文在应用层(七层)运行,stream 在传输层(四层)运行。这并不意味着 stream 上下 文不能通过一些巧妙的脚本获得应用感知能力,而是说 http 上下文是专门为了完全理解 HTTP 协议而设计的,stream 上下文默认情况下只能对数据包进行路由和负载均衡。

TCP 负载均衡由 Nginxstream 模块定义。stream 模块与 HTTP 模块一样,允许您定 义上游upstream服务器池并配置侦听服务器。在配置服务器侦听给定端口时,您 必须定义待侦听的端口或者地址加端口(可选)。然后您必须配置目标服务,无论这是连接另一个地址的直接反向代理还是上游资源池。

配置中有许多选项可以改变 TCP 连接反向代理的属性,包括 SSL/TLS 验证限制、超时和 keepalive 等。这些代理选项的一些值可以是(或者包含)变量,例如下载速率、 验证 SSL/TLS 证书时使用的名称等。

TCPHTTP 负载均衡中的 upstream 指令非常相似,它们均将上游资源定义为服务器,配置格式同样为 Unix 套接字、IPFQDN,此外服务器 weight 参数、最大连接数、DNS 解析器、连接数缓增期以及判断服务器是激活状态、故障状态还是备用模式 的参数也都相似。

UDP 负载均衡

需求

将负载分发到两台或多台 UDP 服务器。

解决方案

Nginxstream 模块内使用 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 BSDFreeBSD 12 及更高版本。