以现在用的 Nginx Proxy Manager 2.11.3 为例,Web 管理界面只提供:
没有界面化的:
所以,要在 同一个域名 上做“主服务 + 降级服务容灾”,只能用两类办法:
/data/nginx/custom/http_top.conf 定义 upstream(一次性手工)proxy_pass http://my_backend_servers; 引用换句话说:目前没有“纯点点点、不写配置片段”的图形化降级方案,你现在这套就是标准的高级用法。
主题:基于 Nginx Proxy Manager 的 Docker 容器做同域名多服务降级容灾
目标:同一个域名指向两个后端服务,主服务不可用时自动切换到降级服务(Failover),无需人工干预。
example.com主服务 A,例如 124.xxx.xxx.120:13210降级服务 B,例如 43.xxx.xxx.126:8001upstream my_backend_servers,包含主服务 & 降级服务。proxy_pass 替换为指向这个 upstream。max_fails / fail_timeout 等参数控制主服务的失效判定,通过 backup 标记降级服务。nginx-docker-app-1example.comhttp 或 https(视后端实际情况)124.xxx.xxx.12013210说明:这一步只是建立一个基础可用的 Proxy Host,后续我们会在其上“接管”转发逻辑。
在宿主机执行:
bashdocker exec -it nginx-docker-app-1 /bin/bash
bashcd /data/nginx/custom/
若目录不存在可创建:
bashmkdir -p /data/nginx/custom
cd /data/nginx/custom
你的 nginx.conf 已经包含:
nginxinclude /data/nginx/custom/http_top[.]conf;
所以我们需要创建的文件名必须是 http_top.conf(中括号在配置里是转义用的)。
安装编辑器(如未安装):
bashapt-get update && apt-get install -y vim
编辑/创建文件:
bashvim http_top.conf
写入内容(示例 IP & 端口按你的实际环境替换):
nginx# HTTP 顶层自定义配置:上游服务器组(主 + 降级) upstream my_backend_servers { # 主服务 A server 124.xxx.xxx.120:13210 max_fails=3 fail_timeout=10s; # 降级服务 B:仅在所有非 backup 服务器不可用时启用 server 43.xxx.xxx.126:8001 backup; }
保存退出
说明:
max_fails=3:在fail_timeout时间窗口内,连接失败 3 次即认为此后端暂时不可用。fail_timeout=10s:失败后 10 秒内不再尝试该后端,之后会重新探测。backup:将该后端标记为备用。只有所有非backup的 upstream 都失效时才会使用。
完成后退出容器:
bashexit
注:备用方式将配置写入 my_upstream.conf**
使用 cat 与 here-document 将内容直接重定向到文件:
bashcat <<'EOF' > my_upstream.conf
upstream my_backend_servers {
server 124.xxx.xxx.120:13210 max_fails=3 fail_timeout=10s;
server 43.xxx.xxx.126:8001 backup;
}
EOF
该方法不依赖任何文本编辑器即可生成或覆盖文件,适用于临时或脚本化场景。
here-document: 是一种将多行文本写入命令或文件的方式,使用
<<'EOF'语法可以避免变量展开;常用于批量写入配置。
如果希望在追加而不覆盖的情况下写入内容,也可使用 tee:
bashcat <<'EOF' | tee my_upstream.conf
upstream my_backend_servers {
server 124.xxx.xxx.120:13210 max_fails=3 fail_timeout=10s;
server 43.xxx.xxx.126:8001 backup;
}
EOF
tee 默认会输出到标准输出,同时写入目标文件;通过重定向符 < 可以控制覆盖或追加(如 tee my_upstream.conf 会覆盖)。
tee: 同时向标准输出和一个或多个文件写入数据的命令,常用于记录中间输出。
修改完配置后,使用 nginx -t 进行语法校验并重载:
bashnginx -t && nginx -s reload
先进行语法校验再重载能避免因配置错误导致 nginx 无法启动。
nginx -t: 用于测试配置文件语法是否正确,同时检查包含文件与语法逻辑;若语法无误则返回 OK。
nginxlocation / { proxy_pass http://my_backend_servers; proxy_set_header Host $host; }
说明:
- 这里不再使用
$forward_scheme://$server:$port,而是显式指定 upstream 名称my_backend_servers。- 如需保留源 IP 等头信息,可在此处进一步补充:
nginxproxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
在宿主机执行:
bashdocker restart nginx-docker-app-1
等待容器重启完成后,重新登录 NPM 管理台,目标 Proxy Host 应显示为 Online。
如需验证,可在容器内执行一次配置检查:
bashdocker exec -it nginx-docker-app-1 nginx -t
确保输出包含:
textnginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
正常场景验证
curl 访问 https://example.com/。降级场景验证
https://example.com/。若要取消同域名多服务降级容灾:
location /)。/data/nginx/custom/http_top.conf 中对应的 upstream 删掉或注释。docker restart nginx-docker-app-1。如有多个域名需要不同的主/备服务组合,可在 http_top.conf 中定义多个 upstream,例如:
nginxupstream app1_backends { ... } upstream app2_backends { ... }
然后在不同 Proxy Host 的 Advanced 区分别:
nginxlocation / { proxy_pass http://app1_backends; proxy_set_header Host $host; }
和
nginxlocation / { proxy_pass http://app2_backends; proxy_set_header Host $host; }
/data/nginx/custom/http_top.conf + Proxy Host Advanced 配置,可以在 不直接改主 nginx.conf 的前提下,实现同域名多服务降级容灾。