You need to enable JavaScript to run this app. 基于Docker的Rundeck服务结合Nginx反向代理配置求助
优惠活动
大模型
产品
解决方案
定价
更多

基于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 network connect app-net funny_beaver
    # 将Rundeck容器接入自定义网络
    docker network connect app-net rundeck
    
    注:如果Nginx是直接安装在虚拟机系统内、不是以容器形式运行的,不需要加入Docker网络,直接在宿主机上执行docker 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 08:27:05