nginx 配置报404 问题排查

Posted 小马reviewing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx 配置报404 问题排查相关的知识,希望对你有一定的参考价值。

大家好,我是小马,今天遇到一个问题,问题是这样的,我们开发了一个对接项目,我们会给对接方一个通知的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

好了,问题就这样结束了,关注我,下次分享更多的线上问题以及解决方案。

阿里云slb+nginx配置curl无法获取url问题小记

参考技术A 最近在做服务器迁移, 之前是直接使用阿里云的slb. 随着业务的发展以及稳定性要求, 决定对服务器进行升级, 同时对业务进行拆分, 经过多种考虑最后使用slb+nginx路由方案.

前端使用slb的tcp监听, 开启会话保持. ecs上配置nginx进行二次转发.

浏览器访问一切正常, 也没有用户报任何使用问题.

就这样无风无雨的过了一天, 第二天业务人员报微信支付数据异常, 转账成功, 转账标识显示失败.

开发人员开始进行排查, 发现服务器可以正常接收微信回调, 不过服务器间调用出现异常.

后台日志显示: java.net.ConnectException: Connection timed out

我开始查看nginx日志, 发现没有找到请求日志, 怀疑是nginx问题, 使用curl请求ecs, 返回值正常, 使用curl请求外网域名, curl无反馈, 看来问题出现在阿里云的slb上面.

去网上搜了搜, 还真有人遇到同样的问题, 只是标题是不是很一致.

解决方案是将slb的tcp监听改为http监听.

以下为阿里云给出的理由:

https://help.aliyun.com/document_detail/27680.html?spm=5176.doc27671.6.240.6lfhRY

注意: 当负载均衡从4层更换到7层之后, 虽然开启了获取真实ip, 程序获取真实ip还需要做一些特别的设置, 阿里云官方文档有详细描述:  负载均衡 7 层 HTTP 模式获取来访客户端真实 IP 的方法(IIS/Apache/Nginx/Tomcat)

附参考网址:  阿里云SLB负载均衡https协议的一点小问题

以上是关于nginx 配置报404 问题排查的主要内容,如果未能解决你的问题,请参考以下文章

运维排查篇 | 访问nginx出现403错误

nginx部署前端项目后刷新浏览器报错404

nginx部署前端项目后刷新浏览器报错404

python flask获取微信用户信息报404,nginx问题

请教关于nginx配置404错误页面

Docker + Nginx + PHP 访问403,404问题