Nginx 高性能静态服务需分层优化:启用 sendfile、tcp_nopush、tcp_nodelay 减少拷贝与延迟;配置 keepalive 复用连接;精准 gzip 压缩文本;分级 Cache-Control 控制浏览器缓存;open_file_cache 缓存文件元数据;并调优系统级资源限制。

要让 Nginx 在 nginx.conf 中真正支撑高并发、低延迟的静态文件服务,不能只靠默认配置。核心是分层协同:减少内核开销、加速传输路径、让浏览器少发请求、让 Nginx 自身少查文件。下面给出可直接写入 http 块或站点 server 块的实用配置项,每项都对应明确性能目标。
启用零拷贝与高效 TCP 传输
避免 CPU 和内存在用户态与内核态之间反复搬运数据,尤其对 JS、CSS、图片等中大文件效果显著。
-
sendfile on;:跳过用户空间,由内核直接读磁盘发网络 -
tcp_nopush on;:配合 sendfile,把响应头和文件内容合并成一个 TCP 包发出,减少小包数量 -
tcp_nodelay on;:禁用 Nagle 算法,对 HTML、小图标等小响应降低首字节延迟
配置长连接复用与合理超时
静态资源请求频次高、单次体积小,复用连接比反复建连更省资源,但需防空闲连接堆积。
-
keepalive_timeout 600;:设为 10 分钟,足够浏览器加载整页资源(含字体、图标、JS) -
keepalive_requests 100;:单连接最多处理 100 次请求,避免长期空闲占用 worker 连接槽位 - 确认上游无代理(如 CDN 或 LB)主动断开 keepalive,否则配置无效
开启精准 Gzip 压缩
文本类资源压缩率常达 60%–70%,但压缩本身耗 CPU,需平衡速度与体积。
-
gzip on;:全局启用 -
gzip_comp_level 5;:1–9 中推荐值,兼顾压缩率与 CPU 开销 -
gzip_min_length 256;:小于 256 字节不压缩,避免得不偿失 -
gzip_types text/css application/javascript image/svg+xml text/html;:显式声明类型,不依赖 MIME 自动推断 -
gzip_vary on;:让 CDN 或反向代理知道响应可能被压缩,正确区分缓存键
分级设置浏览器缓存策略
让浏览器“记住”哪些资源能存多久,是最直接的带宽节省手段。优先使用 Cache-Control,它比 Expires 更灵活可靠。
- 对带哈希名的资源(如
app.a1b2c3.js):add_header Cache-Control "public, max-age=31536000, immutable"; - 对未哈希的 CSS/JS:
add_header Cache-Control "public, max-age=86400"; - 对 HTML、JSON、manifest 文件:
add_header Cache-Control "no-cache, must-revalidate"; - 匹配规则建议放在 location 块中,例如:
location ~* \.(js|css|png|jpg|gif|woff2|svg)$ { ... }
启用 open_file_cache 优化文件元数据访问
它不缓存文件内容,而是缓存文件是否存在、是否可读、大小、修改时间等元信息,大幅减少 stat() 系统调用。
-
open_file_cache max=10000 inactive=60s;:最多缓存 1 万条,60 秒未访问则淘汰 -
open_file_cache_valid 30s;:每 30 秒主动验证一次缓存条目有效性 -
open_file_cache_min_uses 2;:同一文件在 inactive 时间窗内至少被访问 2 次才进缓存 -
open_file_cache_errors on;:把 404、权限拒绝等错误也缓存,防恶意扫描反复触发系统调用
补充系统级资源保障
Nginx 配置再优,若系统限制太紧也会卡在底层。
-
worker_rlimit_nofile 65535;:每个 worker 进程最多打开 6.5 万个文件描述符 -
events { worker_connections 4096; }:单 worker 支持 4096 并发连接 - 确保系统 ulimit -n ≥
worker_rlimit_nofile × worker_processes,否则配置不生效



















