通过linux curl 命令和php脚本的curl请求一个接口地址,返回的json数据比较大,结果只获取到部分数据,并且linux curl终端还报了个错,如下:
curl: (18) transfer closed with outstanding read data remaining
怀疑服务端有异常,查看nginx日志发现
nginx[warn]:an upstream response is buffered to a temporary
虽然是个warn,但出现问题的时候也一样要警示。
于在nginx.conf 的http 里加入如下一段:
fastcgi_buffer_size 4k;
fastcgi_buffers 8 128;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
加大buffer的配置,居然没管用
后经查,负载均衡采用的nginx反向代理,于是到nginx代理服务器上,http里加入如下一段:
proxy_buffering on;
proxy_buffer_size 4k; //响应头的缓冲区
proxy_buffers 8 128; //由缓冲区数量和缓冲区大小组成的。总的大小为number*size。
proxy_busy_buffers_size 128k; //在没有完全读完后端响应的时候就开始向客户端传送数据所需要用的缓冲区
proxy_temp_file_write_size 128k; //一次访问能写入的临时文件的大小
问题解决。
分析:
Nginx 的 buffer 机制,对于来自 FastCGI Server 的 Response,Nginx 将其缓冲到内存中,然后依次发送到客户端。缓冲区的大小由 fastcgi_buffers 和 fastcgi_buffer_size 两个值控制。fastcgi_buffer_size 则是处理 Response 时第一个缓冲区的大小,不包含在fastcgi_buffers中,如上配置
最大内存缓冲区大小是 8 * 128 + 4 = 1028K
当 Response的内容 小于等于 1028K 时,所有数据当然全部在内存中处理。如果 Response 大于 1028K ,多出来的数据会被临时写入到文件中,放在fastcgi_temp目录下面。此时会在看到类似如下 warning:
- an upstream response is buffered to a temporary *
这个值太小,Nginx 会频繁读写硬盘,影响性能,太大也不好,会吃掉内存,所以根据实际Response的内容大小来定。