upstream模块必须定义在http块内且不可嵌套于server或location中,其名称须与proxy_pass中引用的名称严格一致(含大小写),server行需显式指定非标准端口,并建议配置weight、max_fails和fail_timeout以实现健康检查与权重调度。

upstream 模块必须写在 http 块内,不能放在 server 或 location 里,这是硬性语法要求。它定义的是后端服务器集群,和 proxy_pass 配合使用才能生效。
位置必须正确:只能在 http 块一级
常见错误是把 upstream 块误写进 server 块中,Nginx 启动时会直接报错:
nginx: [emerg] "upstream" directive is not allowed here因为 upstream 是全局作用域指令,只允许出现在 http { ... } 的顶层。正确结构示例如下:
- http {
- upstream backend {
- server 192.168.1.101:8080;
- server 192.168.1.102:8080;
- }
- server {
- location / {
- proxy_pass http://backend;
- }
- }
- }
名称要与 proxy_pass 地址严格一致
upstream 后面的名称(如 backend)必须和 proxy_pass 中的协议+名称完全匹配,包括大小写:
- upstream MyApp { ... }
- proxy_pass http://MyApp; ✅
- proxy_pass http://myapp; ❌(大小写不一致会导致 502)
如果后端服务监听非标准端口(比如 9000、8001),server 行必须显式写出端口,不能省略。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
基础参数建议配齐:weight + max_fails + fail_timeout
光设 weight 不等于真能分更多流量——若后端响应慢或超时,没健康检查机制,Nginx 仍会持续发请求过去,最终堆积失败。
- server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;
- server 192.168.1.102:8080 weight=1 max_fails=3 fail_timeout=30s;
含义:连续失败 3 次后,该节点在 30 秒内不再接收新请求;weight 控制轮询权重比例,不是绝对能力值。
调度算法按需选择
默认是轮询(round-robin),其他常用选项有:
- ip_hash:按客户端 IP 哈希,保证同一 IP 总打到同一台后端(适合有状态会话)
- least_conn:优先分给当前连接数最少的后端(适合长连接场景)
- hash $request_uri consistent:按 URI 哈希,常用于缓存一致性
注意:ip_hash 和 hash 类算法不支持 weight,开启后 weight 参数会被忽略。

















