Nginx 作为高性能的反向代理服务器,可以通过多种算法实现负载均衡,将客户端请求分发到多个后端服务器上。以下是详细的实现方法和配置示例:
在 nginx.conf
的 http
块中定义 upstream
模块,然后在 server
块中通过 proxy_pass
引用。
http {
upstream backend {
# 定义后端服务器列表(支持IP、域名、端口)
server 192.168.1.100:80;
server 192.168.1.101:80;
server backend.example.com:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend; # 指向upstream名称
proxy_set_header Host $host;
}
}
}
Nginx 支持多种负载均衡策略:
轮询(Round Robin)
默认算法,按顺序分配请求。
upstream backend {
server 192.168.1.100;
server 192.168.1.101;
}
加权轮询(Weighted Round Robin)
通过 weight
分配权重,权重越高分配的请求越多。
upstream backend {
server 192.168.1.100 weight=3; # 3/5的请求
server 192.168.1.101 weight=2; # 2/5的请求
}
IP哈希(IP Hash)
根据客户端IP固定分配到同一后端,适合会话保持。
upstream backend {
ip_hash;
server 192.168.1.100;
server 192.168.1.101;
}
最少连接(Least Connections)
优先分配给当前连接数最少的后端。
upstream backend {
least_conn;
server 192.168.1.100;
server 192.168.1.101;
}
基于响应时间(Fair,需第三方模块)
按后端服务器的响应时间分配请求(需安装 nginx-upstream-fair
模块)。
健康检查
Nginx 被动检查(默认):
upstream backend {
server 192.168.1.100 max_fails=3 fail_timeout=30s; # 30秒内失败3次标记为不可用
server 192.168.1.101 backup; # 备用服务器(其他服务器不可用时启用)
}
主动检查需通过
nginx_upstream_check_module
或集成 Nginx Plus。
长连接优化
复用与后端的连接,减少开销:
upstream backend {
server 192.168.1.100;
keepalive 32; # 保持的连接数
}
会话保持(Sticky Session)
使用 sticky
模块(需安装 nginx-sticky-module
):
upstream backend {
sticky;
server 192.168.1.100;
server 192.168.1.101;
}
http {
upstream backend {
least_conn;
server 192.168.1.100:80 weight=2;
server 192.168.1.101:80 max_fails=3 fail_timeout=30s;
server 192.168.1.102:80 backup;
keepalive 16;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
bash
nginx -t
bash
nginx -s reload
access_log
和 error_log
或工具如 ngxtop
观察请求分发情况。proxy_pass
改为 https://backend
。nginx
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
通过以上配置,Nginx 可以高效地分散流量到多个后端服务器,提升系统的可用性和性能。