You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Nginx反向代理转发请求至Docker应用容器

问题解决:Nginx反向代理路径调整与Docker配置检查

一、Nginx配置核心问题修正

你的配置有两个关键错误导致转发失败:

  1. 两个server块同时监听80端口,Nginx只会加载第一个生效的server配置,第二个/app-two的规则完全不会被执行。
  2. proxy_pass的路径匹配逻辑错误:当location为/app-one时,直接转发到http://app-one:1111会把请求路径/app-one/ping完整传递,变成http://app-one:1111/app-one/ping,而你需要的是去掉前缀后的/ping。

修正后的Nginx配置(二选一即可)

方法1:利用proxy_pass末尾斜杠自动截断前缀

worker_processes 1;
  
events { worker_connections 1024; }

http {
    sendfile on;

    # 可选:保留upstream定义,方便后续扩展多实例
    upstream app-one {
        server app-one:1111;
    }

    upstream app-two {
        server app-two:2222;
    }

    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-Host $server_name;
    
    server {
        listen 80;
 
        # ^~ 表示优先匹配该规则,避免被其他正则location干扰
        location ^~ /app-one/ {
            # 末尾加斜杠,Nginx会自动把/app-one/后面的路径拼到目标地址
            proxy_pass http://app-one/;
            proxy_redirect off;
        }

        location ^~ /app-two/ {
            proxy_pass http://app-two/;
            proxy_redirect off;
        }

        # 可选:处理不带末尾斜杠的请求,自动重定向
        location = /app-one {
            return 302 /app-one/;
        }

        location = /app-two {
            return 302 /app-two/;
        }
    }
}

方法2:用rewrite手动截断前缀

worker_processes 1;
  
events { worker_connections 1024; }

http {
    sendfile on;

    upstream app-one {
        server app-one:1111;
    }

    upstream app-two {
        server app-two:2222;
    }

    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-Host $server_name;
    
    server {
        listen 80;
 
        location /app-one {
            # 正则匹配/app-one开头的路径,将/app-one替换为空,保留后续部分
            rewrite ^/app-one(.*)$ $1 break;
            proxy_pass http://app-one:1111;
            proxy_redirect off;
        }

        location /app-two {
            rewrite ^/app-two(.*)$ $1 break;
            proxy_pass http://app-two:2222;
            proxy_redirect off;
        }
    }
}

二、Docker相关配置检查

  1. 网络连通性:你的Docker Compose配置没问题,proxy服务和app-one、app-two默认处于同一个bridge网络,通过服务名app-one、app-two可以直接访问容器,无需额外端口暴露(容器内部端口只要服务监听即可)。
  2. 服务端口验证:必须确保app-one容器内的服务确实监听1111端口,app-two监听2222端口,否则会出现连接超时。
  3. 冗余环境变量:proxy服务中的NGINX_PORT=80在当前配置中未被使用,可以直接删除,避免冗余。

内容的提问来源于stack exchange,提问作者TheBohne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:23:11