如何限制NGINX客户端请求体临时存储的总空间占用?
Nginx大文件上传临时存储限制与FCGI回调配置方案
一、限制客户端请求体临时存储总空间
Nginx本身没有直接限制临时文件总占用空间的指令,但可以通过以下两种方法实现2GB的空间限制:
方法1:文件系统配额限制
直接给/tmp所在分区设置2GB磁盘配额,当Nginx写入临时文件超出配额时,会自动返回507(存储空间不足)或500错误。操作步骤(以ext4文件系统为例):
# 卸载/tmp分区(根分区需进入单用户模式操作) umount /tmp # 启用用户配额 tune2fs -o usrquota /dev/[你的分区设备名] # 重新挂载分区 mount /tmp # 初始化配额数据库 quotacheck -cu /tmp # 给Nginx运行用户(如www-data)设置2GB硬配额 edquota -u www-data
在配额编辑界面,将blocks的硬限制设为2097152(1GB=1024*1024块,2GB对应2097152)。
方法2:并发连接数间接控制
通过计算最大允许并发上传数来限制总空间:2GB ÷ 50MB = 40,即限制同时上传的请求数不超过40,总占用空间就不会超出2GB。修改Nginx配置如下:
# 在http或对应server块中添加连接限制 limit_conn_zone $binary_remote_addr zone=upload_limit:10m; limit_conn upload_limit 40; # 保留原有上传配置 client_body_buffer_size 1M; client_max_body_size 50M; client_body_temp_path /tmp; # 自定义错误页面并添加Retry-After头 error_page 503 /upload_busy.html; location = /upload_busy.html { root /usr/share/nginx/html; add_header Retry-After 300; # 告知客户端5分钟后重试 }
当并发上传数超过40时,Nginx会返回503错误,配合自定义页面返回重试提示。
二、FCGI回调提前拒绝请求
可以通过ngx_http_auth_request_module模块,在Nginx开始存储请求体前调用FCGI服务验证请求,提前拒绝不符合条件的上传。该模块默认已编译进多数Nginx发行版,配置步骤如下:
- 编写FCGI验证服务(如PHP、Python实现):服务接收请求头(如
Content-Length、服务器临时空间使用率等信息),判断是否允许上传,返回200表示允许,返回403/503表示拒绝。 - 配置Nginx调用该服务:
server { # 其他基础配置... location /upload { # 先调用内部验证接口 auth_request /upload_auth; # 验证失败时直接返回错误 error_page 403 503 = @upload_rejected; # 原有上传转发配置 client_body_buffer_size 1M; client_max_body_size 50M; client_body_temp_path /tmp; proxy_pass http://your_upload_backend; } # 内部验证接口,转发到FCGI服务 location = /upload_auth { internal; fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 以PHP-FPM为例 fastcgi_param SCRIPT_FILENAME /path/to/your_auth_script.php; # 传递必要参数给验证服务 fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param DISK_USAGE $disk_usage; # 可通过自定义变量传递磁盘使用率 fastcgi_request_buffering off; # 不缓冲请求体,只传递头部 } # 上传拒绝后的响应处理 location @upload_rejected { add_header Retry-After 300; return 503 "当前上传繁忙,请稍后重试"; } }
配置完成后,Nginx会先调用FCGI验证服务,只有验证通过时才会开始接收客户端的请求体并写入临时文件。
内容的提问来源于stack exchange,提问作者Sid Datta
相关产品推荐
相关产品推荐

