Nginx 的负载均衡主要由两部分组成:
- upstream 块:定义后端服务器集群(在 http 块内)。
- server 块中的 proxy_pass:将请求转发到定义的 upstream 组。
基础模板 (nginx.conf)
bash
http {
# ==========================================
# 1. 定义后端服务器集群 (Upstream)
# ==========================================
upstream my_backend_pool {
# 默认策略:轮询 (Round Robin)
server 192.168.1.101:8080;
server 192.168.1.102:8080;
# 其他策略参数见下文详解
}
# ==========================================
# 2. 配置虚拟主机 (Server)
# ==========================================
server {
listen 80;
server_name example.com; # 域名或 IP
location / {
# 将请求转发到上面定义的 upstream 集群
proxy_pass http://my_backend_pool;
# 重要:传递真实用户 IP 给后端
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_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
}
}
2. 常用负载均衡策略
在 upstream 块中,通过添加不同指令来切换策略。
A. 加权轮询 (Weighted Round Robin) - 最常用
根据服务器性能分配权重,权重越高,分配的请求越多。
bash
upstream weighted_pool {
server 192.168.1.101:8080 weight=3; # 性能强,承担 3/4 流量
server 192.168.1.102:8080 weight=1; # 性能弱,承担 1/4 流量
}
B. IP 哈希 (IP Hash) - 会话保持
同一个 IP 的请求始终转发到同一台服务器,解决 Session 共享问题。
bash
upstream ip_hash_pool {
ip_hash; # 开启 IP 哈希
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
C. 最少连接 (Least Connections)
将新请求转发给当前连接数最少的服务器,适合长连接场景。
bash
upstream least_conn_pool {
least_conn; # 开启最少连接
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
D. 备用服务器 (Backup)
当主服务器全部不可用时,才使用备用服务器。
bash
upstream backup_pool {
server 192.168.1.101:8080;
server 192.168.1.102:8080 backup; # 仅在主节点故障时启用
}
- 高级优化配置 (健康检查与超时)
在生产环境中,建议配置故障检测参数,自动剔除坏掉的节点。
bash
upstream optimized_pool {
# 正常节点
server 192.168.1.101:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;
# 参数解释:
# max_fails=3: 失败 3 次后标记为不可用
# fail_timeout=30s: 标记不可用后,暂停分发 30 秒,30 秒后再尝试探测
# 长连接复用 (提升性能)
keepalive 32;
}
server {
location / {
proxy_pass http://optimized_pool;
# 配合 keepalive 使用,必须设置 HTTP/1.1 并关闭 Connection 头
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}