Nginx上传超过800M文件报错:读取上游响应头时提示空间不足
故障原因
- 你看到的warn日志为Nginx的正常行为:只要上传请求的请求体大小超过
client_body_buffer_size配置的阈值,Nginx就会将请求内容暂存到磁盘临时文件,无论最终上传成功或失败都会触发该告警,不属于故障原因。 - 实际故障的核心是Lua FastCGI处理进程的临时文件存储空间不足:
- Nginx的临时缓冲目录
/usr/local/openresty/nginx/client_body_temp/位于根分区,剩余可用空间为5.6G,Nginx层面不会触发空间不足问题。 - Lua上传处理逻辑默认会将接收的文件先缓冲到
/tmp目录,而你的/tmp是基于tmpfs内存文件系统挂载的,对应tmpfs容量为643.9M,叠加系统交换分区的可用空间,刚好可以支撑707M左右的文件存储,一旦文件超过800M,tmpfs+swap的总可用空间不足以存放临时文件,就会返回Not enough space错误。
- Nginx的临时缓冲目录
解决方案
- 方案1:修改Lua上传逻辑的临时文件存储目录,指向磁盘分区(如
/var/tmp或根分区下的其他自定义目录),避开tmpfs的/tmp目录,即可使用根分区剩余的5.6G空间。 - 方案2:调整tmpfs的挂载容量,修改
/etc/fstab中tmpfs挂载/tmp的配置,将size参数调整为业务需要的大小(如2G),执行mount -o remount /tmp即可生效。 - 方案3:可在Nginx配置中添加
client_body_in_file_only clean;参数,让Nginx将完整的请求体文件直接传递给Lua进程,跳过Lua层的临时文件缓冲逻辑,直接操作Nginx生成的临时文件。 - 可选优化:调整
client_body_buffer_size参数到合理值(如10M),减少小文件上传时的磁盘写入次数,也可以降低该warn日志的触发频率。
内容的提问来源于stack exchange,提问作者Pointo Senshi
相关产品推荐
相关产品推荐

