Hello World

吞风吻雨葬落日 欺山赶海踏雪径

0%

nginx 请求头过大问题

线上报表的http中转服务302到错误页面问题排查记录。

首先还是debug了java应用,发现controller正常返回,怀疑是 nginx 的问题,查看nginx错误日志。
错误日志线上好几种分隔方法,先确定如何组织的,查看Nginx的 error_log 配置

1
error_log   "pipe:/opt/install/cronolog/sbin/cronolog logs/cronolog/%Y/%m/%Y-%m-%d-error_log" warn;

按年月分隔的目录,日志文件到天。查看当天的错误发现有报错:

1
upstream sent too big header while reading response header from upstream

看上去是请求头太大了,看了下报错的url的确参数带了200多个,再加上前端喜欢在cookie里面放各种信息,导致整个请求头过大。

知道问题就好解决了,在http模块中增加配置调大请求头(实际情况是驳回了调大的方案,前端传参不合理)

1
2
3
proxy_buffer_size  64k;
proxy_buffers 32 64k;
proxy_busy_buffers_size 128k;

proxy_buffer_size

  • 语法: proxy_buffer_size the size
  • 默认值:proxy_buffer_size 4k/8k
  • 上下文: http,server,location

该指令设置缓冲区大小,从代理后端服务器取得的第一部分的响应内容,会放到这里.小的响应header通常位于这部分响应内容里边.默认来说,该缓冲区大小等于指令 proxy_buffers所设置的;但是,你可以把它设置得更小.

ChatGPT

1
2
3
4
5
6
7
8
9
10
在 Nginx 中,proxy_buffer_size 是一个用于配置代理缓冲区大小的参数。它指定了单个连接的代理缓冲区大小,通常用于控制 Nginx 与代理服务器之间的数据传输速度,以及控制 Nginx 缓冲数据的行为。

当 Nginx 作为代理服务器(即使用 proxy_pass 指令转发请求)时,如果代理服务器返回的响应数据较大,Nginx 会将响应数据分成多个缓冲区进行传输,并在接收完所有缓冲区后再将它们合并起来。而 proxy_buffer_size 参数就是用于控制这些缓冲区的大小。

具体来说,proxy_buffer_size 参数控制了单个缓冲区的大小,即控制了每次从代理服务器读取数据的最大量。如果代理服务器返回的数据超过了 proxy_buffer_size 指定的大小,Nginx 将会在接收到第一个缓冲区后就开始将数据发送给客户端,然后将接下来的缓冲区数据存储在内存中,直到所有缓冲区的数据都被接收完毕后再将它们合并起来。

需要注意的是,proxy_buffer_size 参数不适用于使用 HTTP/2 协议的代理连接,因为在 HTTP/2 中,每个数据帧都有自己的大小限制,不需要额外设置缓冲区大小。

在实际使用中,可以根据代理服务器返回的数据大小和网络带宽等情况来调整 proxy_buffer_size 参数的大小,以达到最优的性能和可靠性。通常情况下,可以将 proxy_buffer_size 设置为比较大的值,以便提高数据传输的效率。但是,如果服务器的处理能力较低或者网络带宽较小,可能需要将 proxy_buffer_size 设置为较小的值,以防止过度消耗服务器资源或者发生数据丢失的情况。

proxy_buffers

  • 语法:proxy_buffers 数量 大小
  • 默认值:proxy_buffers 8 4k/8k
  • 上下文:http,server,location

该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。

ChatGPT

1
2
3
4
5
6
7
8
9
10
11
12
13
在 Nginx 中,proxy_buffers 是一个用于设置代理缓冲区数量和大小的参数。它可以控制 Nginx 与后端代理服务器之间的数据传输速度和缓冲区的使用方式。

当 Nginx 作为代理服务器时,如果后端代理服务器返回的响应数据较大,Nginx 会将响应数据分成多个缓冲区进行传输,并在接收完所有缓冲区后再将它们合并起来。而 proxy_buffers 参数就是用于控制这些缓冲区的数量和大小。

具体来说,proxy_buffers 参数由两部分组成:缓冲区的数量和每个缓冲区的大小。例如: proxy_buffers 4 256k;

上述配置表示 Nginx 会使用 4 个大小为 256KB 的缓冲区来存储代理传输的数据。

当代理服务器返回的响应数据超过一个缓冲区的大小时,Nginx 会将响应数据分成多个缓冲区进行传输,并在接收完所有缓冲区后再将它们合并起来。如果代理服务器返回的数据较小,则只会使用一个缓冲区。如果缓冲区不足以存储完整的响应数据,Nginx 将会分多次传输数据,直到所有响应数据都被接收完毕。

需要注意的是,proxy_buffers 参数只在使用 HTTP/1 协议的代理连接中起作用,不适用于使用 HTTP/2 协议的连接。当使用 HTTP/2 时,每个数据帧都有自己的大小限制,不需要额外设置缓冲区大小。

在实际使用中,可以根据代理服务器返回的数据大小和网络带宽等情况来调整 proxy_buffers 的数量和大小,以达到最优的性能和可靠性。通常情况下,可以将 proxy_buffers 设置为较大的值,以便提高数据传输的效率。但是,如果服务器的处理能力较低或者网络带宽较小,可能需要将 proxy_buffers 设置为较小的值,以防止过度消耗服务器资源或者发生数据丢失的情况。

proxy_busy_buffers_size

  • 语法:proxy_busy_buffers_size 大小
  • 默认值:proxy_busy_buffers_size proxy_buffer_size*2
  • 上下文:http,server,location

nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。

ChatGPT

1
2
3
4
5
6
7
8
9
10
11
proxy_busy_buffers_size 是 Nginx 的一个代理模块参数,用于控制代理缓冲区的使用方式。

在 Nginx 作为代理服务器的情况下,代理服务器返回的响应数据可能会非常大,因此 Nginx 会将响应数据分成多个缓冲区进行传输,然后将这些缓冲区合并起来。proxy_busy_buffers_size 参数用于控制 Nginx 何时将缓冲区标记为“繁忙”,以便将缓冲区交给其他请求使用。

具体来说,proxy_busy_buffers_size 参数指定了缓冲区的最大可用内存大小,当缓冲区的内存使用超过了这个值时,Nginx 将会标记该缓冲区为“繁忙”,表示该缓冲区正在被使用中,不能被其他请求使用。这样可以防止缓冲区被错误地重用,从而避免数据传输中的错误和数据丢失。

需要注意的是,当缓冲区被标记为“繁忙”时,Nginx 不会立即释放该缓冲区,而是等到该缓冲区的所有数据都被传输完毕后才会释放。

在实际使用中,可以根据服务器的处理能力和网络带宽等因素来调整 proxy_busy_buffers_size 的大小。如果代理服务器返回的响应数据较大且处理能力较强,可以将 proxy_busy_buffers_size 设置为较大的值,以提高数据传输的效率。但是,如果代理服务器处理能力较弱或者网络带宽较小,可能需要将 proxy_busy_buffers_size 设置为较小的值,以避免过度消耗服务器资源或者发生数据丢失的情况。

需要注意的是,proxy_busy_buffers_size 参数仅在使用 HTTP/1 协议的代理连接中起作用,不适用于使用 HTTP/2 协议的连接。在 HTTP/2 中,每个数据帧都有自己的大小限制,不需要额外设置缓冲区大小。