upstream模块必须定义在http块内,不可置于server、location或events等其他块中,否则nginx启动时报“upstream directive is not allowed here”错误;其名称需全局唯一、大小写敏感,供proxy_pass引用。

upstream 模块必须定义在 Nginx 配置文件的 http 块内,不能放在 server、location 或其他嵌套块中。
这是硬性语法要求,Nginx 启动时会校验上下文(context),如果写错位置,会直接报错:"upstream" directive is not allowed here。
正确的位置结构示例
http {
# ✅ 正确:upstream 必须在 http 块一级下
upstream app_backend {
server 192.168.1.10:3000;
server 192.168.1.11:3000 weight=2;
server 192.168.1.12:3000 backup;
}
# ✅ 可以定义多个 upstream,彼此并列
upstream api_servers {
ip_hash;
server 192.168.1.20:8000;
server 192.168.1.21:8000;
}
# ✅ 在 server 块中引用它(通过 proxy_pass)
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://app_backend; # 引用上面定义的 upstream 名称
}
}
}
常见错误写法(会导致启动失败)
-
❌ 放在
server块里:server { upstream wrong_place { ... } # 报错!不允许 } -
❌ 放在
location块里:location / { upstream also_wrong { ... } # 报错! } -
❌ 放在
events块里(完全无关上下文):events { ... } upstream never_here { ... } # 报错!events 不支持 upstream
补充说明
-
upstream块名(如app_backend)是自定义标识符,后续在proxy_pass http://app_backend中引用,必须严格匹配大小写和拼写。 - 同一个
upstream名称在整个http块中只能定义一次;重复定义会引发警告或覆盖。 -
upstream支持混合后端类型:IP+端口、域名、UNIX socket(如unix:/var/run/backend.sock),都可共存于同一块中。
不复杂但容易忽略。











