nginx-客户端请求主体被缓冲到一个临时文件


48

每次尝试上传大文件时,日志文件都会出现以下错误。

a client request body is buffered to a temporary file /var/lib/nginx/body/0000000001

尽管文件上传成功,但我总是收到上述错误。

我增加了client_body_buffer_size1000m这是我希望上传的最大文件。但是,这只是一个猜测,尽管我不再收到该错误,但我想知道这是否是为client_body_buffer_size?设置的适当值。

如果有人可以阐明该指令及其用法,我将不胜感激。


2
我有这个没有成功上传。
2014年

Answers:


51

这是警告,不是错误。这就是为什么它[warn]在日志中开头的原因。

这意味着上传文件的大小大于为上传保留的内存缓冲区。

该指令client_body_buffer_size控制该缓冲区的大小。

如果您可以负担得起总是为偶尔的文件上传保留1GB的RAM,那就可以了。这是一种性能优化,可以将上载缓冲在RAM中,而不是存储在磁盘上的临时文件中,尽管如此大的上载可能要花上几秒钟。如果您上传的大多数文件都不多,那可能是一种浪费。

最后,只有您才能真正决定合适的尺寸。


5
您的回答帮助我做出了决定。我将值降低到大约512k到1m。可惜我会收到很多这样的警告。
Abs

由于存在虚拟内存,使用较大的值不会导致“总是为偶尔的文件上传保留1GB的RAM”。(不会使用超出当前上传实际所需内存的内存。)
Kirill Bulygin

1
如果我将其设置为50MB,并且有200个人同时浏览一个页面,那会占用10GB的内存,还是仅将50MB分配给执行文件上传的任何用户?
Codemonkey

@Codemonkey此缓冲区仅在上载请求正文时使用。上载完成后,内存将可以自由用于其他请求。而且,正如另一位评论者所指出的那样,当上传未进行时,不会使用任何内存。因此,这取决于您在给定的瞬间进行了多少同时上传。
迈克尔·汉普顿

通常是十个,可能永远不会超过20个。128GB的盒子,所以我有足够的内存..!不过,老实说,我只是为了摆脱错误日志中的那些[警告]行-我可能应该忽略它们!
Codemonkey

17

如果您不想NginX将正文内容存储在临时文件中,则可以设置配置。像这样:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

如果您将两个配置都设置为相同的最大值。大小(分别以kB,MB或GB为单位,以k,M或G为单位),可以防止NginX创建临时文件。文件。

有关更多信息:http : //nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_sizehttp://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size


8
但是使用该配置,您还将阻止所有大于10 MiB的上传
Josef

@约瑟夫:绝对不能阻止。只是该请求将需要缓冲到磁盘上,并且您会收到警告。检查接受的答案。
奥马尔·奥斯曼(OmarOthman)'17

9
@ OmarOthman,Josef是正确的,因为该client_max_body_size参数。请参阅此链接上的信息:client_max_body_size doc。Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.
eddy85br '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.