Nginx通过include指令将upstream块抽离至独立文件(如/etc/nginx/upstreams/*.conf)实现模块化管理,必须置于http{}块内引入,支持通配符、绝对/相对路径,配合nginx -t验证和reload热更新,提升可维护性与环境分治能力。

直接在主配置里堆砌大量 upstream 定义,会让 nginx.conf 越来越臃肿、难维护、易出错。用 include 把 upstream 集群抽离到独立文件,是生产环境的标准做法——既保持主配置干净,又支持按业务、环境或团队分治管理。
把 upstream 块单独写进外部文件
在 /etc/nginx/ 下新建专用目录和文件,比如:
-
/etc/nginx/upstreams/—— 存放所有 upstream 定义 -
/etc/nginx/upstreams/static.conf:静态资源集群 -
/etc/nginx/upstreams/api.conf:API 动态服务集群 -
/etc/nginx/upstreams/admin.conf:后台管理系统集群
每个文件只写一个或一组逻辑相关的 upstream,例如 static.conf 内容为:
upstream static_servers {
server 192.168.1.10:80;
server 192.168.1.11:80 weight=2;
keepalive 32;
}注意:这些文件本身不包含 http{} 或任何外层块,只写纯 upstream 块,Nginx 会原样注入到所在位置。
在 http 块中用 include 引入
打开 /etc/nginx/nginx.conf,定位到 http { ... } 块内部(必须在 http 块内,不能在 events 或全局域),添加:
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
<pre class="brush:php;toolbar:false;"># 批量引入所有 upstream 定义
include /etc/nginx/upstreams/*.conf;
# 或按需单个引入(更可控)
# include /etc/nginx/upstreams/static.conf;
# include /etc/nginx/upstreams/api.conf;
server {
listen 80;
location / {
proxy_pass http://static_servers;
}
}}
路径支持通配符 *,也支持绝对路径和相对路径(相对路径以 nginx 配置根目录为基准)。
配合 reload 实现热更新与灰度切换
抽离后,修改某个 upstream 不再需要动主配置。只需:
- 编辑对应文件,比如改
/etc/nginx/upstreams/api.conf中的服务器地址或权重 - 运行
sudo nginx -t验证语法(Nginx 会自动加载 include 的内容) - 执行
sudo systemctl reload nginx生效,零中断
还可结合软链接做环境切换:建 upstreams-prod.conf 和 upstreams-staging.conf,用 ln -sf 切换当前生效的文件,适合多环境部署。
进阶:用变量 + map 实现动态 upstream 选择
如果想根据请求头、域名或参数决定走哪个 upstream,可在 include 文件中定义多个 upstream,再用 map 指令生成变量,最后在 proxy_pass 中引用:
# 在 http 块中(可放在 include 后面)
map $host $backend_group {
~^api\. example\.com$ api_servers;
~^static\.example\.com$ static_servers;
default api_servers;
}
<p>server {
location / {
proxy_pass <a href="https://www.php.cn/link/093d559928d57fc466488f5176506e29">https://www.php.cn/link/093d559928d57fc466488f5176506e29</a>;
}
}这样就把“路由逻辑”和“服务器列表”彻底解耦,upstream 文件只管“有哪些机器”,map 和 location 管“什么时候用哪组”。


















