Nginx 502 问题:too big header
Nginx 502 问题:too big header问题排查问题怎么解决问题补充知识问题接口报错出现 Nginx 502 Bad Gateway排查问题既然是 Nginx 报错,那么我们就查看 Nginx 服务器错误日志:[error] 12917#0: *62380774 upstream sent too big header while reading response head...
问题
接口报错出现 Nginx 502 Bad Gateway
排查问题
既然是 Nginx 报错,那么我们就查看 Nginx 服务器错误日志:
[error] 12917#0: *62380774 upstream sent too big header while reading response header from upstream.
也就是接口请求发送的 header 头过大,可以想到是前端请求到 Nginx 的请求头带的信息太多,超过了 Nginx 设置的大小。
极有可能是前端使用的 Cookie 太大了。
怎么解决问题
- 前端尽量使用少量的 Cookie 存储数据。
- 后台 Nginx 的 header 大小配置改大。
方法1就不多说了,需要前端改代码,可能还得改业务逻辑。
直接说说怎么修改 Nginx 配置,简单方便快捷。
- 进入 Nginx 服务器 Nginx 安装目录。
- 修改Nginx 配置文件 nginx.conf。
vim nginx.conf
在http模块中,增加:
proxy_buffer_size 128k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 128k;
补充知识
Nginx 默认的 header 长度上限是4k,如果超过了这个值,就会报错。
如果header头信息请求超过了,Nginx 会直接返回400错误
可以通过以下2个参数来调整 Nginx 的 header 上限
client_header_buffer_size 16k;
large_client_header_buffers 4 16k;
下面讲讲这两个参数以及他们之间的关联关系:
对nginx处理header时的方法:
- 先处理请求的
request_line
,之后才是request_header
。 - 这两者的
buffer
分配策略相同。 - 先根据
client_header_buffer_size
配置的值分配一个buffer
,如果分配的buffer
无法容纳request_line
/request_header
,那么就会再次根据large_client_header_buffers
配置的参数分配large_buffer
,如果large_buffer
还是无法容纳,那么就会返回414(处理request_line
)/400(处理request_header
)错误。 - 如果你的请求中的
header
都很大,那么应该使用client_header_buffer_size
,这样能减少一次内存分配。 - 如果你的请求中只有少量请求header很大,那么应该使用large_client_header_buffers,因为这样就仅需在处理大header时才会分配更多的空间,从而减少无谓的内存空间浪费。
针对get请求,解决请求串过长的问题:
针对get请求,我们可以通过修改另外两个配置来解决请求串超长的问题:
client_header_buffer_size
语法:
client_header_buffer_size size
默认值:1k使用字段:http, server这个指令指定客户端请求的http头部缓冲区大小绝大多数情况下一个头部请求的大小不会大于1k不过如果有来自于wap客户端的较大的cookie它可能会大于1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers
里面设置。
large_client_header_buffers
语法:
large_client_header_buffers number size
默认值:large_client_header_buffers
4 4k/8k使用字段:http, server指令指定客户端请求的一些比较大的头文件到缓冲区的最大值,如果一个请求的URI大小超过这个值,服务器将返回一个"Request URI too large" (414),同样,如果一个请求的头部字段大于这个值,服务器将返回"Bad request" (400)。缓冲区根据需求的不同是分开的。默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,如果一个连接请求将状态转换为keep-alive
,这个缓冲区将被释放。
那么有人就会觉得奇怪了,为什么修改http header
的大小就能解决GET
请求串过长的问题呢,这就要从HTTP
协议的GET
请求说起了,其实GET
提交,请求的数据会附在URL
之后(就是把数据放置在HTTP
协议头中)。
更多推荐
所有评论(0)