针对大型POST请求的Nginx client_body_buffer_size和client_max_body_size优化

时间:2016-01-26 00:37:46

标签: nginx

我有一个API,可以在每次传输中接收1K到20MB的数据。我还有一个网站,在一次传输中只能接收不到10K的网站。 API和网站都在同一个Nginx代理服务器后面。

来自client_body_buffer_size

的文档
  

如果请求正文大小超过缓冲区大小,则整个(或部分)请求正文将写入临时文件。"

这意味着每当我收到超过默认值的请求时,它都会被写入磁盘。

鉴于我可以收到大的有效载荷,最好将client_body_buffer_size设置为client_max_body_size,对我来说这是20MB?我认为这会阻止nginx每次都将请求写入磁盘。

设置client_body_buffer_size这么高会有什么后果吗?这会不会影响从未收到如此大量请求的网站?

2 个答案:

答案 0 :(得分:6)

我建议使用较小的client_body_buffer_size(大于10k,但不要太多,可能是16k的x64默认值),因为更大的缓冲区可以缓解DoS攻击向量,因为你会为它分配更多的内存,反对更便宜的磁盘。

请注意,您还可以在特定服务器或位置设置不同的client_max_body_sizeclient_body_buffer_size(请参阅Context),以便您的网站无法上传20MB。< / p>

这里是interesting thread on client_body_buffer_size,它还提醒如果客户端主体大于client_body_buffer_size,则nginx变量$ request_body将为空。

答案 1 :(得分:2)

这取决于您的服务器内存和您拥有的流量。

一个简单的公式:MAX_RAM = client_body_buffer_size X concurrent_traffic - OS_RAM - FS_CACHE。

(与php-fpm池调整甚至mysql / elasticsearch完全相同)。

关键是监控所有事情(RAM / CPU /流量)并根据您的使用情况更改设置,当然要小一点然后增加直到可以。