线上报表的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 中,每个数据帧都有自己的大小限制,不需要额外设置缓冲区大小。
|