如何修复“客户端请求主体被缓冲到临时文件”?

如何修复“客户端请求主体被缓冲到临时文件”?

我在谷歌云中运行一个容器,并在同一个云中有一个 Mysql Db。它通过 API 接收 json 数据。当数据被处理时,我将数据写入数据库。

大约每 5 分钟我会收到两次以下日志条目:

2023/11/27 12:27:09 [warn] 15#15: *39 a client request body is buffered to a temporary file /var/lib/nginx/client_body_temp/0000000020, 

尽管这只是一个警告,但它却以错误的形式出现在我的日志中。因此,它会向我的日志发送大量错误,我想摆脱它。

我对 nginx 还没有太多经验,所以我查找了“client_body_buffer_size”的值,发现它是 proxy.conf 的一部分

我的设置还没有代理配置,所以我添加了一个简单的代理配置:proxy.conf,并将其放在 Docker 构建脚本中的 /etc/nginx/proxy.conf 中

proxy_redirect          off;
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size    1m;
client_body_buffer_size 1m;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

之后,我那个烦人的错误消失了,但我遇到了一个更严重的错误:我的数据库出现“操作超时”错误,我的数据无法再写入。所以我当然恢复了该配置并删除了 proxy.conf,现在我又回到了第一个错误。

消除标题上的错误的正确方法和位置是什么?我可以将 client_body_buffer_size 参数添加到 httpd.conf 吗?

我应该补充一点,发回的数据不像图像那么大。它的大小可能有 250kb,也许更大一点。

我已经在姊妹网站上问过这个问题:https://stackoverflow.com/questions/77556980/how-to-fix-a-client-request-body-is-buffered-to-a-temporary-file

答案1

客户端主体缓冲区大小 是 的参数nginx.conf,而不是 的参数proxy.conf

这意味着上传文件的大小大于为上传保留的内存缓冲区。此内存仅在上传请求时使用。一旦将其传递到后端,内存就会再次释放。将上传缓冲在 RAM 中而不是磁盘上的临时文件中是一种性能优化。如果请求大于此值,它将转到临时文件,错误日志中会出现警告。

如果您有能力为偶尔的文件上传保留这么多内存,您可以将其设置为比默认值更大的值。

相关内容