在我的应用程序中,我有到我的应用服务器(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 中,然后再以最少的写入调用写入磁盘。