nginx 不支持 upstream 中直接用 include 导入动态权重列表,但可通过拆分配置文件实现:将 server 行(含 weight)写入独立文件并用绝对路径 include;支持多环境节点文件管理;需注意语法合法、无注释、reload 生效。

Nginx 本身不支持直接在 upstream 块中用 include 导入“权重列表”这种动态结构,但可以通过合理拆分配置文件 + 静态定义的方式,实现按需导入不同代理节点及其权重——关键在于把 upstream 的 server 行写进独立文件,再用 include 引入。
1. 将 upstream 节点定义拆到单独文件中
比如创建一个专门存放后端节点的目录和文件:
/etc/nginx/upstreams/api_nodes.conf内容如下(每行一个 server,含 weight):
server 10.0.1.10:8080 weight=3; server 10.0.1.11:8080 weight=2; server 10.0.1.12:8080 weight=1;
注意:不能只写 IP 和权重,必须是完整 server ...; 语法,且每行结尾要有分号。
2. 在主 upstream 块中 include 这个文件
在你的站点配置或 http 块中定义 upstream 时,直接引用:
upstream backend_api {
include /etc/nginx/upstreams/api_nodes.conf;
keepalive 32;
}
这样 Nginx 启动时会把文件内容原样插入到 upstream 块内,等效于手动写了所有 server 行。
3. 按环境/服务类型维护多个节点文件
你可以为不同用途建多个文件,例如:
- /etc/nginx/upstreams/web_nodes.conf —— 前端服务节点
- /etc/nginx/upstreams/api_v2.conf —— v2 接口专用节点
- /etc/nginx/upstreams/staging.conf —— 预发环境节点
然后在对应 upstream 块里 include 对应路径即可,便于灰度、隔离和复用。
4. 注意事项和常见问题
- 路径必须绝对:include 只接受绝对路径,相对路径会报错
-
语法必须合法:被 include 的文件不能有注释(# 开头会被当作非法指令),如需说明建议用
/* ... */块注释(部分版本支持)或放在外部文档中 -
reload 生效:修改节点文件后,执行
nginx -t && nginx -s reload即可生效,无需重启 - 不支持变量或逻辑:include 是纯文本包含,无法根据条件加载不同文件(如按 hostname 切流),这类需求需用 Lua 或 OpenResty











