使用Docker化Nginx代理同端口Docker服务遇parser服务访问问题求助
解决方案
问题出在你的Nginx配置是基于域名区分服务(engine.app、parser.app),但你实际是通过服务器IP+路径前缀(/engine、/parser)访问,两者不匹配导致parser服务无法正常路由。
以下是修正后的完整Nginx配置,直接替换原配置即可:
upstream engine.app { server engine:8000; } upstream parser.app { server parser:8000; } server { listen 80; # 用下划线匹配所有访问(包括IP直接访问) server_name _; # 处理engine服务的路径请求 location /engine/ { # 末尾加斜杠,会把/engine/xxx转发到上游的/xxx proxy_pass http://engine.app/; proxy_set_header Host "localhost"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; } # 兼容不带末尾斜杠的访问(比如server_ip/engine) location = /engine { return 301 /engine/; } # 处理parser服务的路径请求 location /parser/ { # 同样加末尾斜杠,确保路径正确转发 proxy_pass http://parser.app/; proxy_set_header Host "localhost"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; } # 兼容不带末尾斜杠的访问(比如server_ip/parser) location = /parser { return 301 /parser/; } }
关键修改说明:
- 合并server块:把原来两个独立的server整合为一个,用
server_name _;匹配所有IP/域名访问,符合你用服务器IP直接访问的场景。 - 路径前缀的正确代理:在
proxy_pass末尾添加斜杠/,这样Nginx会把/engine/route1这类请求转发为上游服务的/route1,避免上游收到/engine/route1这种不存在的路径。 - 兼容无斜杠访问:添加
location = /engine和location = /parser的规则,把不带末尾斜杠的请求重定向到带斜杠的路径,避免路径匹配异常。
修改后,你就可以通过server_ip/parser和server_ip/parser/xxx正常访问parser服务了,和engine的访问方式保持一致。
内容的提问来源于stack exchange,提问作者omer
相关产品推荐
相关产品推荐

