基于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
相关产品推荐
相关产品推荐

