Nginx client_body_in_file_only 用于文件上传性能

Nginx client_body_in_file_only 用于文件上传性能

在我的应用程序中,我有到我的应用服务器(unicorn)的 nginx 代理。

我正在尝试提高文件上传性能。我读到过,通过各种技术,您可以防止应用程序进程在文件上传时被阻止。目前关于解决此问题的最佳方法的信息似乎很难找到(请参阅这个问题)。

我正在尝试使用client_body_in_file_only on;它来执行此操作,据我所知,它告诉 nginx 将整个请求缓冲到磁盘。

我感到困惑的是,即使没有这个指令我在我的 nginx 日志中看到这个:

2014/10/10 17:41:43 [warn] 50331#0: *798 a client request body is buffered to a temporary file /usr/local/var/run/nginx/client_body_temp/0040665399, client: 127.0.0.1, server: my_site.dev, request: "POST /upload HTTP/1.1", host: "my_site.dev", referrer: "https://my_site.dev/upload"

在我看来,nginx 无论如何都会缓冲文件上传到磁盘。nginx 在这里是开箱即用的智能吗?我还应该使用吗client_body_in_file_only?我误解了这里发生的事情吗?

答案1

如何通过让 nginx 缓冲到磁盘来提高上传性能?每次收到字节时(在最佳情况下受传输的 MTU 限制,在最坏情况下受 1b 有效负载网络数据包限制),这些字节都会写入磁盘。通常,人们会尝试避免请求访问负载到磁盘,因为它是一个缓慢的设备......

client_body_in_file_only,如其文档所述,主要用于调试,当您希望保留客户端请求主体的副本以供进一步分析时。请注意,将其设置为on会使 nginx 保留所有请求文件请求处理后不删除它们. 价值clean决定一切。

该指令没有,因为您可能错误地理解了(停用)磁盘缓冲的使用本身。您会看到 nginx 使用磁盘来缓冲请求主体,因为其 RAM 缓冲区无法容纳它们。它会向您发出警告,因为它很可能对您的服务器性能产生非常不利的影响。

您可能希望扩大您的client_body_buffer_size因此文件上传将尽可能地保留在 RAM 中,然后再以最少的写入调用写入磁盘。

相关内容