nginx配置报404问题排查解决
作者:小马reviewing
前言
今天遇到一个问题,问题是这样的,我们开发了一个对接项目,我们会给对接方一个通知的url,以通知我们订单的变更,但是我们给的通知url是线上的,测试环境的配置并没有给对方,并且对方没有测试环境,所以只能用线上测试。
我们代码开发完毕后,想测试通知接口,但想着通知他们把线上接口更改成测试环境,流程比较复杂,以后版本上线还得切换成线上环境,多此一举。所以我们想到用nginx做反向代理。
由于我们线上环境nginx 配置比较复杂,我就简化写下当时的nginx配置:
测试环境:
server { listen 80; server_name test.xxxxx.cn location /notice { include proxy.conf; proxy_pass http://127.0.0.1:8899; } }
生产环境:
server { listen 80; server_name www.xxxxx.cn location /notice { include proxy.conf; proxy_pass http://test.xxxxx.cn; } }
这样我们在访问www.xxxxx.cn/notice 的时候一直报404,根据nginx访问日志查,我们看到生产环境域名的access.log 是有记录,而且返回404,但测试环境域名的access.log并没有日志。
一开始我们以为是不是斜杠拼错了,排查了许久,但发现也不是,下篇我会再讲一下nginx使用斜杠注意事项。
后面找了下架构师,姜还是老的辣,才查出问题出在哪里。
nginx将请求的标头字段"Host",也就是
蓝色部分,以确定应将请求路由到哪个服务器,如果它的值不匹配任何服务器名称,或者请求根本不包含这个头字段,那么 nginx 将把请求路由到这个端口的默认服务器。
在上面的配置中访问www.xxxxx.cn/notice,请求到生产的时候,由于生产环境配置 server_name www.xxxxx.cn所以可以请求到,但是代理到test.xxxxx.cn时候因为请求中的Host还是www.xxxxx.cn,所以在测试环境的nginx并没有匹配到www.xxxxx.cn server_name,所以返回404。
那解决方案就是配置Host
生产环境:
server { listen 80; server_name www.xxxxx.cn location /notice { include proxy.conf; proxy_set_header Host test.xxxxx.cn; proxy_pass http://test.xxxxx.cn; } }
具体文档可以参考:
https://nginx.p2hp.com/en/docs/http/request_processing.html
好了,问题就这样结束了,关注我,下次分享更多的线上问题以及解决方案。
总结
到此这篇关于nginx配置报404问题排查解决的文章就介绍到这了,更多相关nginx配置404解决内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!