Loading... <div class="tip share">请注意,本文编写于 3412 天前,最后修改于 1708 天前,其中某些信息可能已经过时。</div> 今天早上在查看线上服务器的日志时,发现nginx出现大量如下报错: >2015/07/20 09:56:55 [warn] 15437#0: *39 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/6/00/0000000006 while reading upstream, client: 183.195.233.189, server: blog.90.vc, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "blog.90.vc" ## 问题分析 先简单的说一下 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: ``` 2015/07/20 09:55:58 [warn] 13328#0: *223 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/8/04/0000000048 while reading upstream, client: 183.60.35.29, server: blog.90.vc, request: "GET /assets/js/common/global-cdd99274.js HTTP/1.1", upstream: "http://127.0.0.1:5000/assets/js/common/global-cdd99274.js", host: "blog.90.vc", referrer: "http://blog.90.vc/assets/js/common/global-cdd99274.js" ``` 显然,缓冲区设置的太小的话,Nginx 会频繁读写硬盘,对性能有很大的影响,但也不是越大越好,需根据网站的页面大小进行调整。 ## 问题解决 在nginx.conf 的http 里加入如下一段得到解决 ``` fastcgi_buffer_size 128k; fastcgi_buffers 8 128; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; ``` 另,如果nginx以proxy模式运行,则需更改上面一段为如下内容: ``` proxy_buffer_size 128k; proxy_buffers 8 128; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; ``` 最后修改:2020 年 03 月 19 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏