很多人调 Nginx 是把网上抄来的一堆参数全塞进配置文件,结果重启后速度没变,反而多了几个不知道干什么的开关。其实对一台普通 VPS 上的站点来说,真正有体感的只有下面这几项。
1. worker_processes 与 worker_connections
worker_processes auto; 让它跟随 CPU 核数就行,3 核机器就是 3 个 worker,不用手动写死。真正容易被忽略的是 worker_connections,默认 512,对图片较多的站点偏小。可以放到 1024,配合 worker_rlimit_nofile 一起调,否则会撞上系统的文件句柄上限,日志里出现 "too many open files"。
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 1024;
multi_accept on;
}
2. gzip 只压该压的
gzip 开对了能省一半以上流量,开错了反而拖慢。关键是 gzip_min_length,小于这个长度的响应压缩收益抵不过 CPU 开销,设 1024 字节比较合适。图片、视频本身已压缩,不要再压。
gzip on;
gzip_min_length 1024;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
gzip_comp_level 用 5,不要用 9。9 和 5 的压缩率差不了多少,CPU 占用却高出一大截,小机器上尤其明显。
3. 静态资源的缓存头
这才是"第二次访问变快"的关键。给图片、字体、CSS、JS 加上长缓存,浏览器就不用每次重新下载。
location ~* .(jpg|jpeg|png|gif|webp|svg|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public";
}
注意:如果文件名不带 hash,改动后要手动改版本号,否则用户会一直用旧缓存。更稳妥的做法是 CSS/JS 加 ?v=20261107 这样的查询串。
4. 别乱开 sendfile 之外的东西
sendfile on; 是必开项,让 Nginx 直接把文件从内核送到网卡,省一次内存拷贝。但 tcp_nopush 和 tcp_nodelay 同时开是有讲究的:前者合并小包,后者禁止延迟,一般静态站两个都开没问题;如果你的站有大量小接口请求,可以先只开 tcp_nodelay 试试。
5. 一个常被忽略的点:日志
访问日志写满磁盘,机器 I/O 打满,网站自然变慢。建议在 logrotate 里给 Nginx 日志加 daily 和 rotate 14,或者干脆关掉访问日志只留错误日志。很多小站其实根本不会去看访问日志。
以上五项,按顺序改完再测,用 curl -w 看首字节时间和总耗时,别凭感觉。改完一项测一次,才知道是哪一项起了作用。





还没有评论,来说两句吧...