添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
2021/0/0 0:0:0 [warn] 29888#0: *2989423 an upstream response is buffered to a temporary file /usr/local/nginx/tmp/proxy/*/*/* while reading upstream, client: *.*.*.*, server: www.1987619.com request: "GET /*.jpg HTTP/1.1", upstream: "http://*.jpg", host: "www.1987619.com", referrer: "https://www.1987619.com/"
1
2
3
4
5
6
7
2021 / 0 / 0 0 : 0 : 0 [ warn ] 29888 #0: *2989423 an upstream response is buffered to a temporary file /usr/local/nginx/tmp/proxy/*/*/* while reading upstream,
client : * . * . * . * ,
server : www . 1987619.com
request : "GET /*.jpg HTTP/1.1" ,
upstream : "http://*.jpg" ,
host : "www.1987619.com" ,
referrer : "https://www.1987619.com/"

fastcgi_buffers 控制 nginx 最多创建 8 个大小为 4K 的缓冲区,而 fastcgi_buffer_size 则是处理 Response 时第一个缓冲区的大小,不包含在前者中。所以总计能创建的最大内存缓冲区大小是 8*4K+4K = 36k。而这些缓冲区是根据实际的 Response 大小动态生成的,并不是一次性创建的。比如一个 8K 的页面,Nginx 会创建 2*4K 共 2 个 buffers。

当 Response 小于等于 36k 时,所有数据当然全部在内存中处理。如果 Response 大于 36k 呢?fastcgi_temp 的作用就在于此。多出来的数据会被临时写入到文件中,放在这个目录下面。同时你会在 error.log 中看到一条类似 warning:

2021/0/0 0:0:0 [warn] 3994#0: *1 an upstream response is buffered to a temporary file /usr/local/nginx/fastcgi_temp/*/*/* while reading upstream, client: *.*.*.*, server: www.1987619.com request: "GET /*.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.1987619.com", referrer: "https://www.1987619.com/"
1
2
3
4
5
6
7
2021 / 0 / 0 0 : 0 : 0 [ warn ] 3994 #0: *1 an upstream response is buffered to a temporary file /usr/local/nginx/fastcgi_temp/*/*/* while reading upstream,
client : * . * . * . * ,
server : www . 1987619.com
request : "GET /*.php HTTP/1.1" ,
upstream : "fastcgi://127.0.0.1:9000" ,
host : "www.1987619.com" ,
referrer : "https://www.1987619.com/"

显然,缓冲区设置的太小的话,Nginx 会频繁读写硬盘,对性能有很大的影响,但也不是越大越好,可能造成内存占用过多.

改了以后,报错没有减少.忽然看了下写入的临时文件目录.网上的是访问的php,upstream走的是php-fpm监听端口或者是sock,而且fastcgi_buffers是用来控制fastcgi模式的缓存模块的..我的业务是一个反向代理,所以应该不是这个问题.然后又查了proxy的buffer找到了对应的问题.

1. proxy_buffering

作用:该指令开启从后端被代理服务器的响应body缓冲。
如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。(大于proxy_buffers)
如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。nginx不尝试计算被代理服务器整个响应body的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的。
对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。
但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的

2. proxy_buffers

作用:设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小。
具体的意思是说,开辟256个长度为8k大小的read_buf用来存储body,当然不是连接建立初始化时就开辟256个,而是当当前buf不够存响应body时才会新申请一个,最多申请256个buf。

3. proxy_buffer_size

作用:Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。

4. proxy_busy_buffer_size

作用:proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。
nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。
proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。

1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给客户端;
2)如果完整数据大小不小于busy_buffer大小,则装满busy_buffer后,马上传给客户端;

5. proxy_temp_path

因为代理的图片很多都超过8k,基本在几十上百kb.所以写了256kb如果超过这个尺寸的文件.已经就写入硬盘行proxy缓存临时目录里.

改了以后重启nginx,然后报错日志就基本没有了..个人认为nginx的buffer不足导致写入磁盘缓存的报错都是一个样式.所以直接查报错提示可能会无法解决问题.所以还是要看具体的upstream和报错文件路径是哪个buffer使用的,然后去对应的http,server,location里修改参数.这个看需要控制到哪一级.写到对应的位置就好.

最后忽然想到如果buffer满了会如何,搜了一下网上有些的还不错的.分享一下: 实例浅析Nginx Buffer机制

3,521