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

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

我有一个相当大且速度很慢(数据复杂,前端复杂)的 Web 应用程序,它内置并由反向代理RoR提供服务。查看错误日志,我看到很多条目,例如:Pumanginxnginx

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. 为什么默认情况下nginxproxy_buffering打开,然后如果它实际缓冲了响应则会向您发出警告?

  4. 响应何时触发该选项?响应需要几秒(多少秒?)才能完成?这可以配置吗?

短暂性脑缺血,NGW。

答案1

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

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

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

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

也可以看看:http://aosabook.org/en/nginx.html

  1. 为什么 nginx 默认打开 proxy_buffering 并且如果它实际缓冲响应则向您发出警告?

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

Nginx 仅在响应不符合配置的内存缓冲区时才会发出警告。如果您愿意,可以忽略该警告。

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

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

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

答案2

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

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

答案3

nginx sendfile 命令可能对静态内容有帮助

https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/

启用 sendfile:

默认情况下,NGINX 会自行处理文件传输,并在发送文件之前将其复制到缓冲区中。启用 sendfile 指令可省去将数据复制到缓冲区的步骤,并允许将数据从一个文件描述符直接复制到另一个文件描述符。为了防止一个快速连接完全占用工作进程,您可以使用 sendfile_max_chunk 指令来限制在单个 sendfile() 调用中传输的数据量(在此示例中为 1 MB):

location /mp3 {
    sendfile           on;
    sendfile_max_chunk 1m;
    #...
}

答案4

将这些添加到 nginx.conf 或虚拟主机配置文件上下文(http服务器地点):

proxy_max_temp_file_size 10240m;
proxy_buffers 240 240k;
proxy_busy_buffers_size 240k;
proxy_buffer_size 240k;

您可以根据您的情况设置这些值,但它们必须彼此平衡(不要对缓冲区指令使用不同的数字)。

我有同样的问题,并对具有大量且长时间的 IO、SQL 和 php 进程的脚本测试了这些配置,并且它运行良好。

相关内容