上游响应被缓冲到临时文件

我有一个相当庞大而慢的(复杂的数据,复杂的前端)Web应用程序在RoR中构build,由Puma以nginx作为反向代理服务。 看看nginx错误日志,我看到了很多条目,例如:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, client: 5.144.169.242, server: engagement-console.foo.it, request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", host: "ec.reputationmonitor.it", referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3" 

我觉得它很好奇,因为这个页面对于不同的用户和不同的用户交互是不一样的,我不认为缓冲盘上的响应是必要的/有用的。

我知道proxy_max_temp_file_size并将其设置为0,但在我看来,我有点尴尬(我的代理尝试缓冲,但没有文件在哪里缓冲…怎么会更快?)。

我的问题是:

1)如何删除[警告]并避免缓冲响应? closuresproxy_buffering或者将proxy_max_temp_file_size设置为0会更好吗? 为什么?

2)如果nginx在缓冲响应的时候缓冲了一个响应,谁又为什么?

3)为什么nginx默认打开proxy_buffering,然后[警告]你是否实际缓冲了一个响应?

4)响应何时触发该选项? 何时需要超过几秒钟(多less次?)才能提供响应? 这是可configuration的吗?

TIA,恩

1)如何删除[警告]并避免缓冲响应? closuresproxy_buffering或者将proxy_max_temp_file_size设置为0会更好吗? 为什么?

您应该将proxy_max_temp_file_size设置为0才能将其删除。 proxy_buffering指令与警告没有直接关系。 你可以把它关掉以停止任何缓冲,但是这通常不被推荐(除非Comet需要它)。

2)如果nginx在缓冲响应的时候缓冲了一个响应,谁又为什么?

它立即服务,但客户端通常连接速度非常慢,不能像应用程序产生的那样快速地使用响应数据。 Nginx尝试缓冲整个响应,以尽快释放您的应用程序。

另见: http : //aosabook.org/en/nginx.html

3)为什么nginx默认打开proxy_buffering,然后[警告]你是否实际缓冲了一个响应?

正如我已经提到的, proxy_buffering与警告没有直接关系。 通常需要优化代理操作并将其closures,从而降低性能和吞吐量。

Nginx只在响应不符合configuration的内存缓冲区时才会发出警告。 如果你没有问题,你可以忽略这个警告。

4)响应何时触发该选项? 何时需要超过几秒钟(多less次?)才能提供响应? 这是可configuration的吗?

当内存缓冲区满时触发。 请看文档,整个机制解释: http : //nginx.org/r/proxy_max_temp_file_size

您可能需要增加内存缓冲区。

以下configuration在我的服务器上正常工作。

 proxy_buffers 16 16k; proxy_buffer_size 16k;