Nginx日志报错an upstream response is buffered to a temporary file

 1.nginx错误日志:warn:an upstream response is buffered to a temporary file

解决办法:增加fastcgi_buffers 8 4K;     fastcgi_buffer_size 4K;

实际配置:

    fastcgi_buffer_size         512k;
    fastcgi_buffers             6 512k;
    fastcgi_busy_buffers_size   512k;
    fastcgi_temp_file_write_size        512k;
    fastcgi_intercept_errors    on;

 

2. nginx错误日志 a client request body is buffered to a temporary file

这个错误的意思是每个请求的请求体缓存太小了,缓存(内存)放不下上传的文件,就写到文件系统里。不调整这个缓存大小也不会影响功能。但是每次上传一张较大的照片,nginx就要写一次文件系统。在批量上传照片的场景,nginx的io太多了。

 

解决办法:增加client_max_body_size 20m;     client_body_buffer_size 20m;

 

Nginx 的 buffer 机制:

对于来自 FastCGI Server 的 Response,Nginx 将其缓冲到内存中,然后依次发送到客户端浏览器。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制。

比如如下配置:

fastcgi_buffers      8 4K;
fastcgi_buffer_size  4K;

 

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:

 

2010/03/13 03:42:22 [warn] 3994#0: *1 an upstream response is buffered to a temporary file
/usr/local/nginx/fastcgi_temp/1/00/0000000001 while reading upstream, 
client: 192.168.1.111,
server: www.xxx.cn,
request: "POST /test.php HTTP/1.1",
upstream: "fastcgi://127.0.0.1:9000", 
host: "xxx.cn",
referrer: "http://xxx.cn/test.php"

 

显然,缓冲区设置的太小的话,Nginx 会频繁读写硬盘,对性能有很大的影响,但也不是越大越好,没意义.

赞赏

微信赞赏支付宝赞赏

故障案例

memory locking requested for elasticsearch process but memory is not locked

2019-12-4 9:26:02

故障案例

docker容器:Failed to get D-Bus connection: Operation not permitted

2020-2-24 9:37:55

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索