Nginx 性能优化实战:让你的网站快如闪电

zheng头像
zheng 2026-07-15 17:02
楼主

网站好不容易搭好了,用户一打开等了 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 跑个分,成就感拉满。

自建网站监控:Uptime Kuma 部署教程 Termux 入门指南:把 Android 手机变成随身 Linux 终端

最新回复

暂无回复,来说两句吧

发表评论

站点总访问量:2824