nginx location中 proxy_pass 要注意设置的路径

757 阅读1分钟

今天在部署一个项目后,接口访问都报404。

这个项目前端通过nginx直接访问,后端的api通过nginx代理转发到其他进程。

nginx配置如下:

server {
        listen      80;
        server_name  www.admin.com;

        location / {
            root   /opt/admin;
        }

        location /admin/ {
                proxy_pass  http://127.0.0.1:1887/;
                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   Cookie $http_cookie;
        }
    }

请求的url带有/admin的会转发到其他服务。

但请求http://www.admin.com/admin/user/user_detail接口时,api报404。

查看代码中的http部分的 路由配置是有admin/user/user_detail路径的,这就很奇怪了。

接下来使用dlv命令打断点排查bug时,又遇到dlv的报错:could not launch process: stub exited while waiting for connection,折腾一番dlv还是没办法用。

准备先把问题放一放,搞了2个小时了,还是没法定位问题。

突然想到可能是nginx proxy_pass的配置有问题,测试后,proxy_pass配置问题。

比如访问:http://www.admin.com/admin/user/user_detail

proxy_pass最后带斜杠的配置,转发的绝对路径:

location /admin/ {
      proxy_pass  http://127.0.0.1:1887/;
}

转发的路径是: http://127.0.0.1:1887/user/user_detail

proxy_pass最后不带斜杠的配置,转发的相对路径:

location /admin/ {
      proxy_pass  http://127.0.0.1:1887;
}

转发的路径是: http://127.0.0.1:1887/admin/user/user_detail

所以,把proxy_pass路径最后一个斜杠去掉就OK了。