我在RoR中构建了一个相当大而缓慢的(复杂数据,复杂前端)Web应用程序,并由Puma提供服务,并以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"


我很好奇,因为对于不同的用户和不同的用户交互,页面不太可能保持相同,并且我认为不必在磁盘上缓冲响应/ useful。

我知道nginx并将其设置为0,但在我看来有点尴尬(我的代理尝试缓冲,但没有文件可缓冲到哪里...那更快?)。

我的问题是:


我该如何删除[警告]并避免缓冲响应?关闭proxy_max_temp_file_size还是将proxy_buffering设置为0更好?为什么?
如果proxy_max_temp_file_size缓冲了响应:何时将缓冲的响应提供给谁,为什么?
为什么nginx默认打开nginx,然后[警告]如果它实际上缓冲了响应?
响应何时触发该选项?服务响应需要几秒钟(几秒钟)?这是可配置的吗?

TIA,ngw。

评论

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

#1 楼


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

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

评论


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

–菲尔
17年5月9日在8:44

这个答案还不够清楚,将proxy_max_temp_file_size设置为0更好地提高性能,或者这只是消除该警告的一种方法?

– Offir Pe'er
19-10-20在9:11

我已将proxy_max_temp_file_size设置为0,但仍然收到警告。我有大量的备用内存,应如何更改以利用它并避免出现此消息?

– Codemonkey
20年7月9日在20:04



作为参考,当用户下载一个较大的JPEG文件(例如20MB)时,我会收到此消息。默认设置显然是1024MB,因此即使不将其设置为0,您也会认为不会发生警告。 Nginx中的错误?

– Codemonkey
20年7月9日在20:05

在2020年10月,proxy_max_temp_file_size导致错误,也许该指令不再存在?

– realtebo
20-10-14在7:18

#2 楼

以下配置在我的服务器上正常运行。

proxy_buffers 16 16k;  
proxy_buffer_size 16k;


评论


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

– EoghanM
16年7月5日在10:55



@EoghanM根据文档,没有。 Proxy_Buffer_size(缓冲区,不是复数)适用于代理服务器响应的第一部分(也称为标头)设置用于读取从代理服务器接收到的响应的第一部分的缓冲区的大小。这部分通常包含一个小的响应头。 Proxy_buffers用于其余的响应。

–cde
16 Dec 8'在18:53

你今天救了我一些头发。我将nginx从我们的服务器移至docker容器,并且开始变得非常慢。这个“固定”了。不确定我们服务器上的版本是否默认启用,但是容器中的版本肯定需要这些设置。

–克里斯蒂安
18年1月2日,11:33

是否有一个好的策略来确定proxy_buffers和proxy_buffer_size的值?

–布赖恩
20 Jan 9 '20在7:42