今天在部署一个项目后,接口访问都报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了。