基于Docker的Rundeck服务结合Nginx反向代理配置求助
同虚拟机多服务Nginx反向代理配置排错指南
核心故障原因定位
- Nginx与Docker容器通信链路不通:当前Nginx配置中写的
proxy_pass http://rundeck:4440、proxy_pass http://example-app:5000,默认依赖系统主机名解析,但既没有在宿主机hosts文件中配置容器IP的静态指向,也没有将Nginx与业务容器加入同一Docker自定义网络,Docker内置DNS无法解析rundeck、example-app这两个主机名,反向代理路由完全无法生效。 - Rundeck代理路径适配缺失导致登录失败:Rundeck默认以根路径
/为运行上下文,当通过/rundeck/路径反向代理访问时,Rundeck返回的静态资源链接、表单提交地址、跳转路径均不携带/rundeck前缀,会直接跳转回根路径导致404;同时没有给Rundeck配置对应代理上下文参数,提交登录信息后会出现跳转错乱无法进入系统的问题。 - 未定义路由规则触发Nginx错误:配置中写入的
auth_request /auth/;规则没有对应的/auth/location块实现,会直接导致所有/rundeck/的请求被Nginx返回500错误,无法正常访问。
分步修复操作
1. 打通Nginx与Docker容器的通信链路
- 新建Docker自定义网络,避免容器间通信依赖宿主机端口映射
执行命令创建独立网络:docker network create app-net - 将现有运行的Nginx容器、Rundeck容器接入该网络,接入后容器之间可直接通过容器名作为主机名互相访问,无需配置hosts指向:
注:如果Nginx是直接安装在虚拟机系统内、不是以容器形式运行的,不需要加入Docker网络,直接在宿主机上执行# 将Nginx容器接入自定义网络 docker network connect app-net funny_beaver # 将Rundeck容器接入自定义网络 docker network connect app-net rundeckdocker inspect rundeck命令查到Rundeck容器的网桥IP,将proxy_pass地址替换为容器IP+对应端口即可;接入自定义网络后若容器间无法连通,重启对应容器即可恢复。
2. 修正Nginx配置文件错误
- 删除不存在的
auth_request /auth/;规则,补上Rundeck路径转发的特殊处理,替换原有/rundeck/配置块为:# 配置Rundeck路由 location /rundeck/ { rewrite ^/rundeck(/.*)$ $1 break; proxy_pass http://rundeck:4440; proxy_set_header Host $host; proxy_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; proxy_set_header X-Forwarded-Prefix /rundeck; # 处理Rundeck返回的静态资源路径 sub_filter '/assets/' '/rundeck/assets/'; sub_filter '/user/login' '/rundeck/user/login'; sub_filter_once off; } - 修正Flask应用的Host头配置,原有
proxy_set_header Host $host/example-app;为非法格式,会导致Flask收到的请求头识别错误,替换为:location /example-app/ { rewrite ^/example-app(.*) /$1 break; proxy_pass http://example-app:5000; proxy_set_header Host $host; proxy_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; } - 配置修正后执行校验命令,确认无语法错误后重载Nginx:
nginx -t && systemctl reload nginx
3. 调整Rundeck容器配置适配代理路径
- 停止现有Rundeck容器,重新启动时追加环境变量,指定应用运行的上下文路径为
/rundeck,避免路径跳转错乱:# 移除原有Rundeck容器 docker stop rundeck && docker rm rundeck # 重新启动容器并加入自定义网络 docker run -d --name rundeck --network app-net \ -e SERVER_CONTEXTPATH=/rundeck \ jacekkow/rundeck - 链路验证顺序:先在Nginx容器内部执行
curl http://rundeck:4440/rundeck/,确认能返回Rundeck页面的HTML内容,再通过浏览器访问https://vmHostname.domain.corp/rundeck/,测试登录流程。
常见注意事项
- 接入自定义Docker网络后,不需要将Rundeck的4440端口映射到0.0.0.0暴露在外,仅允许Nginx容器内部访问即可,降低安全风险。
- 当前使用的nginx1.10.3默认内置sub_filter模块,若提示模块不存在,直接使用官方镜像的Nginx替换系统原生Nginx即可,保持和Docker自定义网络的配置兼容。
- 排障时逐层做连通性测试,不要直接从浏览器端排查,先确认Nginx到业务容器的网络连通性,再排查Nginx配置、应用本身的路径适配问题。
内容的提问来源于stack exchange,提问作者zealousSloth
相关产品推荐
相关产品推荐

