模式切换
负载均衡
Nginx 的负载均衡
Nginx 是一个非常高效的反向代理服务器,支持多种负载均衡策略,能够将请求分发到多个后端服务器(服务器集群),提高服务的可用性、处理能力和扩展性。负载均衡使得系统可以横向扩展,通过增加后端服务器的数量来应对更大的并发量。
Nginx 的负载均衡分发请求到多个后端服务器,常用于 Web 服务器集群、API 服务集群等场景。
Nginx 支持的负载均衡策略
Nginx 提供了多种负载均衡策略,适用于不同的应用场景:
轮询(Round Robin)
- 默认策略,按照顺序依次将请求分发给后端服务器。
- 简单易用,适用于大多数场景。
nginx
upstream backend {
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
权重轮询(Weighted Round Robin)
- 允许为后端服务器设置不同的权重,权重越高,服务器接收到的请求越多。
- 适合后端服务器性能不一致的场景。
nginx
upstream backend {
server 192.168.0.101:8080 weight=3; # 权重为3
server 192.168.0.102:8080 weight=1; # 权重为1
}
最少连接数(Least Connections)
- 将请求分发给当前活动连接数最少的后端服务器。
- 适合服务器处理时间不一致或负载波动较大的情况。
nginx
upstream backend {
least_conn; # 启用最少连接数策略
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
IP 哈希(IP Hash)
- 将相同 IP 地址的客户端请求分配到同一个后端服务器,适合需要保持会话一致性的场景(如登录状态、购物车等)。
nginx
upstream backend {
ip_hash; # 启用 IP 哈希
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
公平负载均衡(Fair Load Balancing)(需要第三方模块)
- 根据后端服务器的响应时间,将请求分发给响应速度最快的服务器。
- Nginx 开源版不支持该功能,但可以通过第三方模块实现。
如何实现服务器集群和负载均衡
实现服务器集群和负载均衡的步骤如下:
定义后端服务器集群
在 Nginx 配置文件中,使用 upstream
指令定义后端服务器集群。每个服务器都指定 IP 地址或域名,Nginx 将根据设置的负载均衡策略分发请求。
nginx
http {
upstream backend_servers {
server 192.168.0.101:8080;
server 192.168.0.102:8080;
server 192.168.0.103:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers; # 将请求转发到后端服务器集群
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
upstream backend_servers
:定义一个名为backend_servers
的服务器集群,包含三个后端服务器。proxy_pass http://backend_servers;
:将所有请求转发到服务器集群,实现负载均衡。
测试配置并重启 Nginx
检查 Nginx 配置是否正确:
bashsudo nginx -t
重启 Nginx 使配置生效:
bashsudo systemctl restart nginx
健康检查和服务器故障处理
负载均衡中的一个重要方面是健康检查。Nginx 需要定期检查后端服务器是否健康(可用),如果某个服务器出现故障,Nginx 会自动跳过该服务器,将流量分发给其他可用服务器。
基础的被动健康检查
Nginx 开源版支持被动健康检查,即当 Nginx 检测到某个后端服务器返回 502、503、504 错误时,会自动将其标记为不可用,并停止将请求转发给该服务器。你可以通过 max_fails
和 fail_timeout
参数来配置这一机制。
nginx
upstream backend_servers {
server 192.168.0.101:8080 max_fails=3 fail_timeout=30s;
server 192.168.0.102:8080;
}
max_fails=3
:如果服务器连续失败 3 次,标记为不可用。fail_timeout=30s
:服务器在 30 秒内如果失败超过max_fails
次,将被移除,30 秒后重新尝试连接。
主动健康检查(Nginx Plus)
Nginx 开源版不提供主动健康检查功能,Nginx Plus 支持主动健康检查功能,即定期向后端服务器发送健康检查请求(如 HTTP 请求),确认服务器的状态。如果某个服务器健康检查失败,Nginx Plus 会自动将其移除出负载均衡池,直到服务器恢复正常。
主动健康检查配置(Nginx Plus 示例)
nginx
upstream backend_servers {
server 192.168.0.101:8080;
server 192.168.0.102:8080;
# 主动健康检查配置
health_check interval=5s fails=2 passes=2;
}
interval=5s
:每 5 秒进行一次健康检查。fails=2
:如果服务器连续失败 2 次,标记为不可用。passes=2
:如果服务器连续成功 2 次,标记为可用。
自定义错误页面和故障处理
为了提升用户体验,当某个服务器发生故障时,可以配置自定义的错误页面,或将用户重定向到备用的服务器。
nginx
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
error_page 502 503 504 /custom_50x.html; # 自定义错误页面
}
location = /custom_50x.html {
root /usr/share/nginx/html;
}
}
error_page 502 503 504
:当后端服务器返回 502、503 或 504 错误时,使用/custom_50x.html
页面。
总结
- 负载均衡策略:Nginx 支持多种负载均衡策略,包括轮询、权重轮询、最少连接数、IP 哈希等,满足不同应用场景的需求。
- 服务器集群:通过
upstream
指令定义后端服务器集群,并结合proxy_pass
实现负载均衡。 - 健康检查:Nginx 开源版支持被动健康检查,Nginx Plus 支持主动健康检查,可以自动检测后端服务器的健康状态并移除不可用的服务器,保障系统的稳定性。
- 故障处理:通过自定义错误页面和备用服务器配置,提升系统的容错性和用户体验。