You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制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发行版,配置步骤如下:

  1. 编写FCGI验证服务(如PHP、Python实现):服务接收请求头(如Content-Length、服务器临时空间使用率等信息),判断是否允许上传,返回200表示允许,返回403/503表示拒绝。
  2. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:03:21