我有一个API,可以在每次传输中接收1K到20MB的数据。我还有一个网站,在一次传输中只能接收不到10K的网站。 API和网站都在同一个Nginx代理服务器后面。
来自client_body_buffer_size
如果请求正文大小超过缓冲区大小,则整个(或部分)请求正文将写入临时文件。"
这意味着每当我收到超过默认值的请求时,它都会被写入磁盘。
鉴于我可以收到大的有效载荷,最好将client_body_buffer_size
设置为client_max_body_size
,对我来说这是20MB?我认为这会阻止nginx每次都将请求写入磁盘。
设置client_body_buffer_size
这么高会有什么后果吗?这会不会影响从未收到如此大量请求的网站?
答案 0 :(得分:6)
我建议使用较小的client_body_buffer_size
(大于10k,但不要太多,可能是16k的x64默认值),因为更大的缓冲区可以缓解DoS攻击向量,因为你会为它分配更多的内存,反对更便宜的磁盘。
请注意,您还可以在特定服务器或位置设置不同的client_max_body_size
和client_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 /流量)并根据您的使用情况更改设置,当然要小一点然后增加直到可以。