我有一个相当大且速度很慢(数据复杂,前端复杂)的 Web 应用程序,它内置并由反向代理RoR
提供服务。查看错误日志,我看到很多条目,例如:Puma
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,但在我看来有点尴尬(我的代理尝试缓冲但没有文件可以缓冲到...怎么会更快?)。
我的问题是:
如何删除 [警告] 并避免缓冲响应?关闭
proxy_buffering
还是设置proxy_max_temp_file_size
为 0 更好?为什么?如果
nginx
缓冲响应:它何时提供缓冲响应、向谁提供、以及为什么提供?为什么默认情况下
nginx
会proxy_buffering
打开,然后如果它实际缓冲了响应则会向您发出警告?响应何时触发该选项?响应需要几秒(多少秒?)才能完成?这可以配置吗?
短暂性脑缺血,NGW。
答案1
- 我如何才能删除 [warn] 并避免缓冲响应?关闭 proxy_buffering 还是将 proxy_max_temp_file_size 设置为 0 更好?为什么?
您应该将其设置proxy_max_temp_file_size
为 0 以将其删除。该proxy_buffering
指令与警告没有直接关系。您可以将其关闭以完全停止任何缓冲,但一般不建议这样做(除非需要彗星)。
- 如果 nginx 缓冲响应,它何时向谁提供缓冲响应以及为什么提供?
它会立即提供响应,但客户端的连接速度通常要慢得多,无法像应用程序生成响应数据那样快速地使用响应数据。Nginx 会尝试缓冲整个响应,以便尽快释放应用程序。
也可以看看:http://aosabook.org/en/nginx.html
- 为什么 nginx 默认打开 proxy_buffering 并且如果它实际缓冲响应则向您发出警告?
正如我已经提到的,这proxy_buffering
与警告没有直接关系。它通常是优化代理操作所必需的,关闭它会降低性能和吞吐量。
Nginx 仅在响应不符合配置的内存缓冲区时才会发出警告。如果您愿意,可以忽略该警告。
- 响应何时触发该选项?当响应需要超过几秒(多少秒?)时?这可以配置吗?
当内存缓冲区已满时,它会触发。请查看文档,整个机制解释如下: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 进程的脚本测试了这些配置,并且它运行良好。