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

基于Nginx实现类S3 Signed URL文件服务及直接上传配置需求

解决方案:Nginx配置Signed URL保护文件与直接处理上传

一、配置Signed URL保护Media/Static目录

使用Nginx官方的ngx_http_secure_link_module实现类似S3的签名URL验证,拦截未授权访问和暴力破解行为。

1. 确认模块存在

编译Nginx时需添加--with-http_secure_link_module参数,可通过nginx -V输出检查是否已包含该模块。

2. Nginx核心配置

在server块中添加针对Media和static目录的验证规则:

server {
    # 保留原有配置...

    # 自定义签名密钥(替换为高强度随机字符串)
    set $secure_link_secret "your_strong_random_secret_key";

    # Media目录签名验证
    location /media/ {
        secure_link $arg_hash,$arg_expires;
        secure_link_md5 "$secure_link_secret$uri$arg_expires";

        if ($secure_link = "") { return 403; }
        if ($secure_link = "0") { return 410; } # URL已过期

        root /path/to/your/project;
        expires off;
    }

    # Static目录签名验证
    location /static/ {
        secure_link $arg_hash,$arg_expires;
        secure_link_md5 "$secure_link_secret$uri$arg_expires";

        if ($secure_link = "") { return 403; }
        if ($secure_link = "0") { return 410; }

        root /path/to/your/project;
        expires off;
    }
}

3. 生成签名URL的脚本示例(Python)

在应用中生成带签名和过期时间的合法URL:

import hashlib
import time

def generate_signed_url(file_path, secret_key, expire_hours=1):
    expire_timestamp = int(time.time()) + expire_hours * 3600
    sign_raw = f"{secret_key}{file_path}{expire_timestamp}"
    sign_hash = hashlib.md5(sign_raw.encode()).hexdigest()
    return f"{file_path}?hash={sign_hash}&expires={expire_timestamp}"

# 使用示例:生成/media/test.png的1小时有效URL
signed_url = generate_signed_url("/media/test.png", "your_strong_random_secret_key")

二、配置Nginx直接处理文件上传

通过Nginx原生指令实现文件直存,无需经过后端应用中转。

1. Nginx上传配置

在server块中添加上传专用location:

server {
    # 保留原有配置...

    location /upload/ {
        # 仅允许POST请求
        limit_except POST { deny all; }

        # 临时文件存储目录(确保Nginx有读写权限)
        client_body_temp_path /tmp/nginx_upload_temp;
        # 将上传文件直接写入目标目录
        client_body_in_file_only on;
        # 自定义文件存储路径与命名规则
        client_body_file /path/to/your/project/media/$request_filename;

        # 限制单文件最大尺寸(按需调整)
        client_max_body_size 100M;

        # 上传完成返回成功状态
        return 201;
    }
}

2. 权限配置

确保Nginx进程对临时目录和目标存储目录拥有读写权限:

chown -R nginx:nginx /tmp/nginx_upload_temp /path/to/your/project/media/

3. 客户端上传示例

通过curl直接上传文件:

curl -X POST -F "file=@/local/path/to/your/file.pdf" http://your-domain/upload/file.pdf

内容的提问来源于stack exchange,提问作者unownone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:39:20