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

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

原文地址:https://blog.csdn.net/s827292890/article/details/129519489

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_33804.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注