Nginx 反向代理后,出现400的response_code

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 反向代理后,出现400的response_code相关的知识,希望对你有一定的参考价值。

参考技术A

现象

开发人员反馈,测试环境某个接口全是返回400,具体开始出现的时间未知了,但目前全是400

接口情况

浏览器--->nginx--> Java 进程

排查过程

使用负载均衡地址localhost:9090/server_single/xxx 能看到抓到的请求头如下

使用服务器真实地址 http://192.167.1.125:8070/xxx 能看到的请求头如下

查看到负载均衡模式下,请求头的Host: server_single 引起我的注意,猜想难道是因为Host 请求头的原因导致的400?,于是下面开始验证

接口如愿的返回了400的状态码,验证了我们的猜想
于是随便修改了几个 Host 字段常识,发现带下划线的都有问题,于是询问开发接口框架是否做了升级,回答说确实spring-boot 做了升级,所以基本确定就是这个原因。

解决办法
在nginx的location段增加配置 proxy_set_header Host $host ,修改反向代理nginx到真实Java接口请求时的Http header 。

结论
response_code = 400 表示客户端请求异常服务器,有可能是invalid hostname 也可能是其他 http header 导致服务器端无法正常解析。

nginx串联(一台反向代理,一台分发)引起问题

参考技术A 在工作中遇到nginx串联的502问题
由于历史原因会出现既有域名访问接口,也有ip+端口号访问接口,也有域名+端口号访问接口
简单介绍下大概架构如下(全是docker部署的)
一台nginx作为主机,用来反向代理域名到ip+端口号,并配置两个nginx连接池(一主一备)

proxy_params内容如下:

上面这样配置后会导致如下问题
1). 访问不存在的uri时并不会立即返回404,虽然后面的nginx会返回404,但主nginx会显示500
2). 偶尔会出现502 no live upstream while conneting to upstream,client: XXX.XXX.XXX.XXX,server:localhost,request:"GET uri HTTP/1.1", upstream:" http://WEB_NGINX_POOL/ " host:"host"

以上是关于Nginx 反向代理后,出现400的response_code的主要内容,如果未能解决你的问题,请参考以下文章

Nginx反向代理400错误

Nginx 使用域名反向代理报 400 Request Header Or Cookie Too Large 解决方案

Nginx反向代理400错误

nginx反向代理报错400

websocket使用nginx作为反向代理

nginx 日志出现400错误