我在谷歌云中运行一个容器,并在同一个云中有一个 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 中而不是磁盘上的临时文件中是一种性能优化。如果请求大于此值,它将转到临时文件,错误日志中会出现警告。
如果您有能力为偶尔的文件上传保留这么多内存,您可以将其设置为比默认值更大的值。