如何配置Nginx反向代理转发请求至Docker应用容器
问题解决:Nginx反向代理路径调整与Docker配置检查
一、Nginx配置核心问题修正
你的配置有两个关键错误导致转发失败:
- 两个
server块同时监听80端口,Nginx只会加载第一个生效的server配置,第二个/app-two的规则完全不会被执行。 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相关配置检查
- 网络连通性:你的Docker Compose配置没问题,proxy服务和app-one、app-two默认处于同一个bridge网络,通过服务名
app-one、app-two可以直接访问容器,无需额外端口暴露(容器内部端口只要服务监听即可)。 - 服务端口验证:必须确保
app-one容器内的服务确实监听1111端口,app-two监听2222端口,否则会出现连接超时。 - 冗余环境变量:
proxy服务中的NGINX_PORT=80在当前配置中未被使用,可以直接删除,避免冗余。
内容的提问来源于stack exchange,提问作者TheBohne
相关产品推荐
相关产品推荐

