核心是隔离路径、控制落盘、限制连接粒度、解耦I/O:用独立NVMe挂载client_body_temp_path,调小buffer并禁用proxy临时落盘,按IP+URI限流,并通过thread_pool异步化SSL与磁盘操作。

核心不是单纯设个连接数上限,而是让加密大文件分块上传不触发临时文件风暴、不挤占 worker 线程、不拖慢 SSL 握手和 TLS 记录处理。重点在隔离路径、控制落盘、限制连接粒度、解耦 I/O。
用独立 SSD 挂载点隔离 client_body 临时文件
HTTPS 分块上传(如 multipart/form-data 或 tus 协议)在 Nginx 中默认写入 /var/cache/nginx/client_body_temp,若与系统盘共用机械盘或高负载 SSD,小块随机写会迅速抬高 await、卡住事件循环。
- 准备一块空闲 NVMe 设备(如
/dev/nvme1n1),单独挂载:mount -o noatime,relatime /dev/nvme1n1 /data/nginx/body-temp - 在
http块中显式配置:client_body_temp_path /data/nginx/body-temp 2 2;(两级子目录,最多 65536 目录,防 inode 查找瓶颈) - 确保该路径权限为
nginx:nginx,且 SELinux 或 AppArmor 允许写入
调低 buffer、禁用 proxy 临时落盘,减少磁盘介入频次
大文件分块请求往往单块几 MB~几十 MB,但整体上传时间长。若 buffer 过大,内存占用高;若过小,又频繁落盘。需平衡并切断代理层二次落盘。
-
client_body_buffer_size 8k;—— 小 buffer 强制快速进入 temp path,避免长时占用 worker 内存 -
client_max_body_size 2g;—— 按业务最大分块总大小略放宽,防止 413 中断上传流 -
client_body_timeout 90s;—— 比普通接口更宽松,但必须设,防慢速上传长期 hold 连接 -
proxy_max_temp_file_size 0;—— 关闭后端响应临时文件缓存,配合proxy_buffering off;或加大proxy_buffers,避免 Nginx 在转发时反复读写磁盘
按 IP + URI 维度做并发连接限制
仅限 IP 容易误伤合法多标签用户;仅限全局又无法区分敏感路径。对 /upload/ 或 /api/v1/chunk 这类分块入口,应绑定上传上下文做细粒度限流。
- 定义双键共享内存区:
limit_conn_zone $binary_remote_addr$request_uri zone=chunk_conn:16m; - 在对应 location 中启用:
limit_conn chunk_conn 3;—— 同一客户端+同一上传路径最多 3 个并发连接 - 搭配
limit_conn_log_level warn;和limit_conn_status 429;,便于监控和前端重试
用 thread_pool 异步化 SSL 读取与磁盘操作
HTTPS 分块上传涉及 TLS 解密 + 文件写入,两者都是同步阻塞操作。主线程直接处理会拖慢整个 worker。
- 在
main块定义线程池:thread_pool upload_io threads=16 max_queue=4096; - 在 upload location 中启用:
aio threads=upload_io;directio 1m;(对 ≥1MB 的块启用直接 I/O,绕过 page cache) - 确保 OpenSSL 版本 ≥1.1.1 且启用 async 模式(编译时带
--with-openssl-opt=enable-async),可进一步卸载 CPU 密集型解密任务


















