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

ngw*_*ngw 87 nginx reverse-proxy buffer

我有一个相当大的和缓慢的(复杂的数据,复杂的前端)的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"
Run Code Online (Sandbox Code Playgroud)

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

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

我的问题是:

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

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

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

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

TIA,ngw。

VBa*_*art 104

1) 如何删除 [warn] 并避免缓冲响应?关闭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 并且仍然收到警告。 (5认同)
  • 我已将 `proxy_max_temp_file_size` 设置为 `0` 并且仍然收到警告。我有大量的备用内存,我应该如何更改以利用它并避免出现此消息? (3认同)
  • 这个答案不够清楚,将 `proxy_max_temp_file_size` 设置为 `0` 是否对性能更好,或者这只是消除该警告的一种方法? (2认同)

Hal*_*luk 26

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

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
Run Code Online (Sandbox Code Playgroud)

  • 是否有确定 `proxy_buffers` 和 `proxy_buffer_size` 值的好策略? (7认同)
  • 我在这里找到了一些很好的解释:https://www.getpagespeed.com/server-setup/nginx/tuning-proxy_buffer_size-in-nginx (6认同)
  • @EoghanM 根据文档,不是。Proxy_Buffer_size(缓冲区,不是复数)适用于代理服务器响应的第一部分(又名标题)`设置用于读取从代理服务器接收的响应的第一部分的缓冲区的大小。这部分通常包含一个小的响应头`。Proxy_buffers 用于响应的其余部分。 (5认同)
  • 第二个指令是否多余,即第一行中的“16k”与第二行完全相同? (4认同)
  • 这两个配置的默认值是什么? (4认同)
  • 你今天救了我的一些头发。我正在将 nginx 从我们的服务器移动到一个 docker 容器,它开始变得非常慢。这“修复”了它。不确定我们服务器上的版本是否默认启用了此功能,但容器中的版本肯定需要这些设置。 (3认同)