网站好不容易搭好了,用户一打开等了 3 秒还在转圈,打开 Chrome 开发者工具一看,首页光加载就 2MB,TTFB 500ms+。别急着换服务器,你的 Nginx 可能根本没调过!花 10 分钟做这几项优化,网站速度直接起飞。
先看一眼你的 Nginx 现状
在优化之前,先搞清楚当前配置:
# 查看 Nginx 版本和编译参数
nginx -V 2>&1 | head -5
# 查看当前 worker 进程数
ps aux | grep nginx | grep -v grep
# 快速压测看看现状(换成你自己的域名)
ab -n 1000 -c 100 https://your-site.com/
记录下压测结果中的 Requests per second 和 Time per request,优化完再对比,效果一目了然。
一、Worker 进程与连接数调优
Nginx 默认配置非常保守,不改 worker 数量等于白装。
| 配置项 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
worker_processes |
1 | auto 或 CPU 核数 |
等于 CPU 核心数效率最高 |
worker_connections |
1024 | 4096 或 10240 | 每个 worker 能同时处理的连接数 |
multi_accept |
off | on | 一次接受所有新连接,减少系统调用 |
use |
系统默认 | epoll |
Linux 下效率最高的 I/O 模型 |
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
use epoll;
worker_connections 4096;
multi_accept on;
}
改完执行 nginx -t && nginx -s reload 生效。
二、开启 Gzip 压缩
HTML、CSS、JS 都是文本,压缩后体积能减少 60%~80%,效果立竿见影。
# 放在 http 块中全局生效
gzip on;
gzip_vary on;
gzip_min_length 1024; # 小于 1KB 不压缩,省 CPU
gzip_comp_level 6; # 压缩级别,1-9,6 是性价比较高的平衡点
gzip_types text/plain text/css text/javascript
application/javascript application/json
application/xml application/rss+xml
image/svg+xml font/ttf font/woff;
gzip_disable "msie6"; # IE6 不支持 gzip
验证:curl -H "Accept-Encoding: gzip" -I https://your-site.com/ | grep Content-Encoding,看到 gzip 就对了。
三、静态资源缓存
静态资源(图片、CSS、JS、字体)是不会天天改的,让浏览器缓存起来,用户第二次访问几乎秒开。
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d; # 缓存 30 天
add_header Cache-Control "public, immutable";
access_log off; # 静态资源不需要记录访问日志
}
注意:如果你的 CSS/JS 文件名带了 hash(如
app.a3f2b1c.css),缓存时间可以大胆设一年。如果没带 hash,缓存过期前改内容用户是看不到的。
四、启用 HTTP/2
HTTP/2 支持多路复用、头部压缩、服务器推送,性能提升明显。前提是你已经配了 HTTPS。
listen 443 ssl http2; # 只需在 listen 后面加 http2
验证:Chrome 开发者工具 → Network → 右键表头勾选 Protocol,看到 h2 就说明 HTTP/2 生效了。
五、调整缓冲区大小
Nginx 默认缓冲区偏小,大文件传输时会频繁读写磁盘,拖慢速度。
# 放在 http 或 server 块
sendfile on; # 零拷贝,直接内核态传输文件
tcp_nopush on; # 等数据包凑满再发,减少网络包数量
tcp_nodelay on; # keepalive 连接下立刻发送小包,降低延迟
client_body_buffer_size 128k; # 请求体缓冲区
client_max_body_size 50m; # 上传文件大小上限(按需调整)
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
六、连接超时优化
合理的超时设置既能释放空闲连接占用的资源,又不会误伤正常用户。
keepalive_timeout 65; # 长连接保持时间
keepalive_requests 100; # 一个长连接最多处理的请求数
client_body_timeout 30; # 读取请求体的超时
client_header_timeout 30; # 读取请求头的超时
send_timeout 30; # 发送响应的超时
七、FastCGI 缓存(WordPress / PHP 必看)
如果你的网站跑 PHP(WordPress、Typecho 等),强烈建议配上 FastCGI 缓存,效果比任何 PHP 插件都猛。
# 在 http 块中定义缓存路径
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=MYCACHE:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# 在 server 块的 location ~ \.php$ 中加入
fastcgi_cache MYCACHE;
fastcgi_cache_valid 200 301 302 30m; # 正常响应缓存 30 分钟
fastcgi_cache_valid 404 1m; # 404 只缓存 1 分钟
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
fastcgi_cache_use_stale error timeout updating;
# 登陆用户和管理员不缓存(根据你用的程序调整 cookie 名)
set $no_cache 0;
if ($http_cookie ~* "comment_author|wordpress_logged_in|PHPSESSID") {
set $no_cache 1;
}
Typecho 用户把 cookie 匹配改为 PHPSESSID 即可,WordPress 用户上面的配置已经包含了。
八、完整优化配置参考
把以上优化整合后,你的 nginx.conf 大致长这样:
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
events {
use epoll;
worker_connections 4096;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 100;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式(带响应时间)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time';
access_log /var/log/nginx/access.log main buffer=32k;
error_log /var/log/nginx/error.log warn;
# Gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript
application/javascript application/json
application/xml image/svg+xml font/ttf font/woff;
# 缓冲区
client_body_buffer_size 128k;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
include /etc/nginx/conf.d/*.conf;
}
优化效果对比
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 首页传输大小 | 2.1 MB | 480 KB(Gzip 后) |
| TTFB | 520 ms | 85 ms(FastCGI 缓存命中时) |
| requests/sec | 420 | 2800+ |
| 静态资源二次加载 | 200 ms | 5 ms(浏览器缓存) |
优化 Nginx 不是什么高深活,改几个参数的事。上面这些配置改完,你的网站至少在速度上能打赢 80% 的站点。改完别忘了用 Google PageSpeed Insights 或 GTmetrix 跑个分,成就感拉满。