一、为什么Nginx优化至关重要
网站加载速度直接影响用户体验和商业指标:
- 53%的移动用户会放弃加载超过3秒的网站
- Google排名将Core Web Vitals(LCP、FID、CLS)纳入排名因素
- 转化率:加载时间每减少1秒,转化率提升7-25%
- 跳出率:加载时间从1秒增加到3秒,跳出率增加32%
Nginx作为高性能Web服务器,经过正确优化可以将页面加载时间缩短50%以上。
二、优化前的性能基准测试
2.1 安装测试工具
# WebPageTest CLI
sudo apt install -y python3-pip
pip3 install webpagetest
# Apache Bench(压力测试)
sudo apt install -y apache2-utils
# curl(响应时间测量)
sudo apt install -y curl
2.2 基准测试命令
# 测量首字节时间(TTFB)
curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://yourdomain.com
# 压力测试(100并发,1000请求)
ab -n 1000 -c 100 https://yourdomain.com/
# 查看响应头大小
curl -s -I https://yourdomain.com | wc -c
三、启用Gzip压缩
Gzip可以将文本文件压缩60-80%,显著减少传输大小。
# /etc/nginx/nginx.conf(http块中添加)
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/x-javascript
application/xml
application/xml+rss
application/vnd.ms-fontobject
application/x-font-ttf
font/opentype
image/svg+xml
image/x-icon;
验证压缩效果:
curl -s -H "Accept-Encoding: gzip" -I https://yourdomain.com | grep -i "content-encoding"
# 应显示:Content-Encoding: gzip
四、启用Brotli压缩(比Gzip更优)
Brotli比Gzip压缩率高15-25%,现代浏览器均支持。
# 安装Brotli模块
sudo apt install -y libbrotli-dev
# 如果Nginx是通过包管理器安装的,可能需要重新编译或安装模块
sudo apt install -y nginx-module-brotli
# 在http块中添加
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript application/xml text/xml image/svg+xml;
brotli_min_length 256;
五、浏览器缓存策略
server {
# 长期缓存(带hash的静态资源)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
}
# HTML文件(短期缓存)
location ~* \.html$ {
expires 1h;
add_header Cache-Control "public, must-revalidate";
}
# API响应(不缓存)
location /api/ {
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
}
六、HTTP/2与HTTP/3
6.1 启用HTTP/2
server {
listen 443 ssl http2;
# HTTP/2自动在Nginx 1.25.1+默认启用,无需额外配置
}
6.2 启用HTTP/3(QUIC)
# 需要Nginx 1.25.0+并编译--with-http_v3_module
server {
listen 443 ssl;
listen [::]:443 ssl;
# 添加Alt-Svc头告知浏览器支持HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400';
http2 on;
http3 on;
quic_retry on;
ssl_protocols TLSv1.3;
ssl_early_data on;
}
七、TCP优化
# /etc/nginx/nginx.conf
http {
# 开启高效文件传输
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Keepalive连接优化
keepalive_timeout 65;
keepalive_requests 1000;
}
系统级TCP优化(/etc/sysctl.conf):
# TCP缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP连接优化
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
# 启用BBR拥塞控制
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# 应用配置
sudo sysctl -p
八、Worker进程与连接优化
# /etc/nginx/nginx.conf
worker_processes auto; # 自动匹配CPU核心数
worker_rlimit_nofile 65535; # 最大文件描述符
events {
worker_connections 4096; # 每个Worker最大连接数
multi_accept on; # 一次性接受所有连接
use epoll; # 使用epoll事件模型
}
验证Worker配置:
# 查看Worker进程数
ps aux | grep nginx | grep worker
# 查看当前连接数
ss -s
九、静态资源优化
9.1 静态文件由Nginx直接处理
server {
root /var/www/html;
# 静态文件直接返回,不经过PHP
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|mp4|webm)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
log_not_found off;
# 开启sendfile
sendfile on;
tcp_nopush on;
}
}
9.2 减少HTTP请求(资源合并)
在前端构建工具(Webpack/Vite)中配置代码分割和资源合并:
// vite.config.js
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'vue-router'],
utils: ['axios', 'lodash'],
},
},
},
chunkSizeWarningLimit: 50,
},
});
十、反向代理缓存
如果Nginx作为反向代理,开启上游响应缓存:
# 在http块中定义缓存路径
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=my_cache:10m
max_size=1g
inactive=60m
use_temp_path=off;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
# 缓存条件
proxy_cache_valid 200 10m;
proxy_cache_valid 301 302 1h;
proxy_cache_valid 404 1m;
# 绕过缓存条件
proxy_cache_bypass $http_cache_control;
proxy_no_cache $http_cache_control;
# 缓存锁(防止缓存击穿)
proxy_cache_lock on;
proxy_cache_lock_timeout 5s;
# 添加缓存状态头
add_header X-Cache-Status $upstream_cache_status;
# 传递真实客户端信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
十一、安全头优化(减少不必要的头)
# 隐藏Nginx版本号
server_tokens off;
# 精简响应头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 禁用不需要的方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
十二、日志优化
http {
# 关闭 favicon 和 robots.txt 的日志
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
log_not_found off;
access_log off;
}
# 访问日志缓冲
access_log /var/log/nginx/access.log combined buffer=32k flush=5m;
}
十三、FastCGI优化(PHP站点)
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
# FastCGI缓冲优化
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
fastcgi_busy_buffers_size 64k;
# 超时设置
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
# Keepalive连接
fastcgi_keep_conn on;
}
十四、性能优化效果对比
| 优化项 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| TTFB | 800ms | 120ms | 85%↓ |
| 首屏加载 | 3.2s | 0.8s | 75%↓ |
| 传输大小 | 2.5MB | 400KB | 84%↓ |
| 并发承载 | 500 | 5000 | 10倍↑ |
| Gzip压缩率 | 无 | 70% | — |
十五、优化检查清单
- [ ] Gzip/Brotli压缩已启用
- [ ] 静态资源缓存策略已配置(immutable)
- [ ] HTTP/2已启用
- [ ] sendfile、tcp_nopush已开启
- [ ] Worker进程数匹配CPU核心数
- [ ] Keepalive连接已配置
- [ ] 反向代理缓存已启用(如适用)
- [ ] Nginx版本号已隐藏
- [ ] 日志已优化(减少IO)
- [ ] FastCGI缓冲已调优(PHP站点)
- [ ] 系统级TCP参数已优化
- [ ] BBR拥塞控制已启用
- [ ] SSL会话缓存已启用
- [ ] 不必要的响应头已移除
总结
Nginx优化是一个系统工程,从传输层到应用层每一步都能带来可观的性能提升。建议按优先级逐步实施:
- 最高优先:Gzip压缩 + 浏览器缓存 + sendfile
- 高优先:HTTP/2 + TCP优化 + Worker配置
- 中优先:Brotli压缩 + 反向代理缓存 + 日志优化
- 低优先:HTTP/3 + 安全头优化 + FastCGI调优
注:本文基于Nginx 1.24+、Ubuntu 22.04/24.04编写,部分功能需要编译版本支持。