105                    
               

我有一个相当大和慢(复杂的数据,复杂的前端)的 Web 应用程序内置RoRPuma作为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. 如何删除 [warn] 并避免缓冲响应?关掉好proxy_buffering还是设置proxy_max_temp_file_size为0好?为什么?

  2. 如果nginx缓冲一个响应:它什么时候提供缓冲的响应,给谁,为什么?

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

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

TIA,ngw。                    

                                   
改进这个问题                                    
  • 3个                                
    我有一种感觉,您将缓冲与缓存混淆了。缓冲是允许加载比内存分配允许的更多数据的过程。 
    – 斯拉夫                                    
     2016 年 7 月 25 日 15:32                                
       

2 个回答  正确答案                     

       
114                        
                   
  1. 如何删除 [warn] 并避免缓冲响应?关闭 proxy_buffering 还是将 proxy_max_temp_file_size 设置为 0 更好?为什么?

您应该设置proxy_max_temp_file_size为 0 以将其删除。proxy_buffering指令与警告没有直接关系。您可以将其关闭以完全停止任何缓冲,但通常不建议这样做(除非Comet需要它)。                        

  1. 如果 nginx 缓冲响应,它何时提供缓冲的响应,向谁提供,为什么?

它立即提供响应,但客户端的连接速度通常要慢得多,并且无法像应用程序生成的响应数据那样快地使用响应数据。Nginx 尝试缓冲整个响应以便尽快发布您的应用程序。                        

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

  1. 为什么 nginx 默认打开 proxy_buffering 然后 [warn] 如果它真的缓冲了响应?

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

Nginx 只会在响应不适合配置的内存缓冲区时发出警告。如果您觉得合适,您可以忽略该警告。                        

  1. 响应何时触发该选项?何时需要超过几秒(多少秒?)来响应?这是可配置的吗?

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

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

                                       
改进这个答案                                        
  • 5个                                    
    对于 #1,删除临时文件的大小限制如何防止缓冲警告?我认为这是不正确的,因为我将此指令设置为 0,但仍然收到警告。 
    – 菲尔                                        
     2017 年 5 月 9 日 8:44                                    
  • 2个                                    
    这个答案不够清楚,将性能设置为更好proxy_max_temp_file_size还是0这只是删除该警告的一种方法? 
    – 办公室                                        
     2019 年 10 月 20 日 9:11                                    
  • 4个                                    
    我已经设置proxy_max_temp_file_size并且0仍然收到警告。我有大量备用内存,我应该如何更改才能利用它并避免出现此消息? 
    – 密码猴                                        
     2020 年 7 月 9 日 20:04                                     
  • 1个                                    
    作为参考,当用户下载一个大的 JPEG 文件(比方说 20MB)时,我会收到这条消息。默认设置显然是 1024MB,因此即使不将其设置为0您也认为不会出现警告。nginx 中的错误? 
    – 密码猴                                        
     2020 年 7 月 9 日 20:05                                    
  • 在 2020 年 10 月,proxy_max_temp_file_size导致错误,也许该指令不再存在? 
    – 瑞尔泰博                                        
     2020 年 10 月 14 日 7:18                                    
       
30                        
                   

以下配置在我的服务器上运行良好。                        

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
                   
                                       
改进这个答案                                        
  • 7                                    
    第二条指令是否多余,即16k第一行中的指令与第二行中的指令完全相同? 
    – 埃格汉姆                                        
     2016 年 7 月 5 日 10:55                                     
  • 9                                    
    @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 headerProxy_buffers 用于响应的其余部分。 
    – 光盘                                        
     2016 年 12 月 8 日 18:53                                    
  • 4个                                    
    你今天救了我的头发。我正在将 nginx 从我们的服务器移动到 docker 容器,它开始变得非常慢。这“固定”了它。不确定我们服务器上的版本是否默认启用了此功能,但容器中的版本肯定需要这些设置。 
    – 克里斯蒂安                                        
     2018 年 1 月 2 日 11:33                                    
  • 11                                    
    proxy_buffers是否有确定和的值的好策略proxy_buffer_size 
    – 布莱恩                                        
     2020 年 1 月 9 日 7:42                                     
  • 5个                                    
    我在这里找到了一些很好的解释:getpagespeed.com/server-setup/nginx /... 
    – 梅尔罗伊·范登伯格                                        
     2021 年 1 月 18 日 21:35                                    
       

您的答案            

来自  https://serverfault.com/questions/587386/an-upstream-response-is-buffered-to-a-temporary-file