nginx针对下载配置优化

下载场景优化:目标是让数据尽量走“内核直通”路径,而不是在用户态反复搬运。


一、核心优化思路

下载请求通常特点:

  • 文件大(MB~GB)
  • 请求时间长
  • 并发连接多
  • CPU 不应该成为瓶颈
  • IO 和网络才是瓶颈

优化目标:

磁盘 → 内核缓存 → 网卡
         ↓
       Nginx尽量少参与

关键技术点:

  • sendfile 零拷贝
  • TCP 合包发送
  • 文件句柄缓存
  • 避免 gzip
  • 减少 worker 切换
  • 减少磁盘 seek

二、推荐全局优化

nginx.conf

2.1worker 与连接优化

1
2
3
4
5
6
7
8
worker_processes auto;
worker_rlimit_nofile 100000;

events {
worker_connections 65535;
multi_accept on;
use epoll;
}

解释:

  • auto = 每个CPU一个worker
  • epoll = Linux最高效事件模型
  • multi_accept = 批量接收连接

2.2HTTP 层优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 65;
keepalive_requests 10000;

types_hash_max_size 4096;

# 文件句柄缓存
open_file_cache max=200000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;

# 大文件关闭 gzip
gzip off;
}

重点解释:

sendfile on(最重要)

启用零拷贝:

磁盘 → 内核 → 网卡

避免:

磁盘 → 内核 → nginx → 内核 → 网卡

CPU 占用直接下降。


tcp_nopush

减少小包发送,适合下载。


open_file_cache

避免频繁 open/close 文件:

open file → send → close

变为:

缓存FD → send

高并发下载时非常关键。


三、下载 server 推荐配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80;
server_name download.example.com;

location /files/ {
root /data/download;

# 支持断点续传
add_header Accept-Ranges bytes;

# 优化IO
sendfile on;
aio on;
directio 8m;

# 避免日志IO压力
access_log off;

# 下载限速(防止带宽打爆)
#limit_rate 10m;
}
}

aio + directio

aio on;
directio 8m;

作用:

  • 大文件绕开 page cache
  • 避免内存被下载文件占满

推荐场景:

文件大小 是否推荐
<8MB 不推荐
>100MB 推荐

四、高并发下载瓶颈通常在哪里?

真实线上排序:

1. 带宽打满
2. 磁盘IO打满
3. 文件句柄耗尽
4. CPU
5. Nginx

通常 nginx 本身不是瓶颈。


五、生产级下载架构

高流量环境通常这样:

flowchart LR
User --> CDN
CDN --> Nginx
Nginx --> Disk

优化路径:

用户 → CDN → 源站 nginx

90%流量在 CDN 消化。