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

Mat*_*sen 7 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如此高的设定会有什么后果吗?这会影响到从未收到如此大规模请求的网站吗?

Cap*_*ilé 6

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

请注意,您还可以设置不同的client_max_body_sizeclient_body_buffer_size特定的服务器或位置(见上下文),这样你的网站不会允许20MB上传.

这是一个有趣的线程client_body_buffer_size,它还提醒如果客户端体大于你的client_body_buffer_size,则nginx变量$ request_body将为空.

  • 您能澄清一下“缓解 DoS 攻击向量”的含义吗?也许您的意思是“可能增加 DoS 攻击向量”。 (2认同)

Tho*_*aux 5

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

一个简单的公式:MAX_RAM = client_body_buffer_size X并发_流量 - OS_RAM - FS_CACHE。

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

关键是监控所有的东西(RAM/CPU/流量)并根据您的使用情况更改设置,当然先少加星号,然后增加直到可以为止。