基本结构
upstream 定义后端服务器组,proxy_pass 引用该组名:
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
server {
location / {
proxy_pass http://backend;
# ... 其他 proxy 配置
}
}
四种均衡策略
轮询(默认):依次分配请求,适合无状态服务:
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
ip_hash:同一客户端 IP 固定打到同一台服务器,适合有 Session 的服务:
upstream backend {
ip_hash;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
weight(加权轮询):按权重比例分配流量:
upstream backend {
server 192.168.1.10:8000 weight=4;
server 192.168.1.11:8000 weight=2;
server 192.168.1.12:8000 weight=1;
}
least_conn(最少连接):新请求优先分配给当前连接数最少的服务器,适合耗时不均匀的服务(如 AI 推理、文件处理):
upstream backend {
least_conn;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
健康检查
max_fails 次失败后暂时摘除节点,fail_timeout 秒后重试:
upstream backend {
server 192.168.1.10:8000 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8000 max_fails=3 fail_timeout=30s;
}
错误:upstream directive is not allowed here
[emerg] "upstream" directive is not allowed here in vhosts/xxx.conf:24
原因:upstream 只能放在 http {} 块内,不能放在 server {} 或 location {} 内。
PHPStudy 等面板生成的 vhosts 文件是 server {} 块,不能在里面定义 upstream。
解决方案:在主 nginx.conf 的 http {} 块中定义:
# nginx.conf
http {
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
}
include vhosts/*.conf; # vhosts 文件只包含 server{} 块
}
配置验证与重载
nginx -t # 检查配置语法
nginx -s reload # 平滑重载(不中断现有连接)