如何强制NGINX切换使用upstream备用节点及切回主节点?
可行的简化方案
下面是三种不同复杂度的实现方式,你可以根据自己的运维场景选择:
方案1:拆分上游配置+自动化脚本(推荐,无需修改Nginx编译配置)
这是成本最低的改造方式,完全兼容你现有的配置逻辑:
- 把
upstream backend的配置单独抽离为独立文件,比如/etc/nginx/conf.d/backend_upstream.conf,主配置里直接include该路径即可 - 提前准备两份固定的上游配置模板:
primary_active.conf对应主节点优先的配置:
upstream backend { server primary.local.net:80; server backup.local.net:80 backup; }backup_active.conf对应备节点优先的配置:
upstream backend { server primary.local.net:80 backup; server backup.local.net:80; } - 写一个一键切换脚本,比如
/usr/local/bin/switch_backend.sh:#!/bin/bash if [ $1 == "backup" ]; then cp /path/to/backup_active.conf /etc/nginx/conf.d/backend_upstream.conf elif [ $1 == "primary" ]; then cp /path/to/primary_active.conf /etc/nginx/conf.d/backend_upstream.conf else echo "invalid parameter, use 'primary' or 'backup'" exit 1 fi # 先校验配置合法性再重载,避免配置错误导致服务中断 if nginx -t; then nginx -s reload echo "switched to $1 node success" else echo "nginx config invalid, rollback" exit 1 fi - 给脚本加执行权限后,以后切换只需要执行一行命令:
- 切到备节点:
switch_backend.sh backup - 切回主节点:
switch_backend.sh primary
- 切到备节点:
方案2:动态上游模块(无需重载Nginx,适合高并发场景)
如果你的业务对Nginx reload操作敏感,可以编译安装第三方开源模块ngx_http_dyups_module,支持通过HTTP接口实时修改上游配置,完全不需要重载服务:
- 编译Nginx时添加该模块,配置文件中开启dyups接口(限制仅本地访问即可)
- 切换时直接调用接口即可生效:
- 切到备节点:
curl -d "server backup.local.net:80; server primary.local.net:80 backup;" http://127.0.0.1/dyups/upstream/backend - 切回主节点:
curl -d "server primary.local.net:80; server backup.local.net:80 backup;" http://127.0.0.1/dyups/upstream/backend
- 切到备节点:
方案3:njs模块实现标记文件控制(无需修改配置文件)
如果你的Nginx已经安装了njs模块,可以通过读取本地标记文件的状态动态决定上游优先级,切换时仅需要修改标记文件内容,不需要修改Nginx配置:
- 配置njs读取
/var/lib/nginx/backend_state文件的内容,根据内容返回对应的上游地址 - 切换时只需要执行
echo "backup" > /var/lib/nginx/backend_state或者echo "primary" > /var/lib/nginx/backend_state即可生效,不需要重载Nginx
内容的提问来源于stack exchange,提问作者T-Regex
相关产品推荐
相关产品推荐

