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


59

我有一个相当大的和缓慢的(复杂的数据,复杂的前端)的Web应用程序建立RoR并担任Pumanginx作为反向代理。查看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. 如何删除[警告]并避免缓冲响应?关闭proxy_buffering还是将其设置proxy_max_temp_file_size为0 更好?为什么?

  2. 如果nginx缓冲响应:何时缓冲响应,向谁提供?为什么?

  3. 为什么默认情况下nginx打开proxy_buffering它,然后如果它实际上缓冲了响应,然后[警告]您呢?

  4. 响应何时触发该选项?服务响应需要几秒钟(几秒钟?)?这是可配置的吗?

TIA,ngw。


1
我感觉到您将缓冲与缓存混淆了。缓冲是允许加载比内存分配所允许的更多数据的过程。
斯拉夫

Answers:


74

1)如何删除[警告]并避免缓冲响应?最好关闭proxy_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警告与警告并不直接相关。优化代理操作通常需要使用它,关闭它会降低性能和吞吐量。

Nginx仅在响应不适合配置的内存缓冲区时警告您。如果可以的话,您可以忽略该警告。

4)响应何时触发该选项?何时需要几秒钟(几秒)来响应?这是可配置的吗?

当内存缓冲区已满时触发。请查看文档,对整个机制进行说明:http : //nginx.org/r/proxy_max_temp_file_size

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


5
对于#1,如何消除临时文件的大小限制如何防止出现缓冲警告?我不认为这是正确的,因为我将此指令设置为0并仍然收到警告。
菲尔(Phil)

这个答案是不够清晰,岂不是更好性能设置proxy_max_temp_file_size0或者这只是一种方式来删除警告?
Offir Pe'er

12

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

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

2
第二个指令是否是多余的,即16k第一行中的指令与第二行中的指令完全相同?
EoghanM '16

1
@EoghanM根据文档,没有。Proxy_Buffer_size(缓冲区,不是复数)适用于代理服务器响应的第一部分(即标头)Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header。Proxy_buffers用于其余的响应。
cde

2
你今天救了我一些头发。我将nginx从我们的服务器移至docker容器,并且开始变得非常慢。这个“固定”了。不确定我们服务器上的版本是否默认启用,但是容器中的版本肯定需要这些设置。
克里斯蒂安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.