搬瓦工VPS的硬件资源有限,合理优化Nginx配置可以显著提升网站性能。本文从Gzip压缩、代理缓存、HTTP/2协议和静态资源优化四个方面,介绍实用的Nginx性能调优方案。
Gzip压缩能大幅减小传输数据量,文本类资源通常可压缩60%-80%。编辑Nginx主配置文件:
sudo nano /etc/nginx/nginx.conf
在 http 块中添加Gzip配置:
http {
# 开启Gzip压缩
gzip on;
# 最小压缩文件大小(小于1KB的文件不压缩)
gzip_min_length 1024;
# 压缩级别(1-9,推荐4-6,越高CPU消耗越大)
gzip_comp_level 5;
# 需要压缩的MIME类型
gzip_types
text/plain
text/css
text/javascript
text/xml
application/json
application/javascript
application/xml
application/xml+rss
application/atom+xml
image/svg+xml;
# 在响应头中添加Vary: Accept-Encoding
gzip_vary on;
# 对代理请求也启用压缩
gzip_proxied any;
# 压缩使用的缓冲区
gzip_buffers 16 8k;
# HTTP版本要求
gzip_http_version 1.1;
# 禁止对IE6压缩(兼容性考虑)
gzip_disable "MSIE [1-6]\.";
}
验证Gzip是否生效:
curl -H "Accept-Encoding: gzip" -I https://example.com
# 响应头中应包含:
# Content-Encoding: gzip
Tip: 图片(JPEG/PNG/WebP)和已压缩的文件不要开启Gzip,它们本身已经压缩过,再次压缩反而浪费CPU。
通过设置浏览器缓存头,让客户端缓存静态资源,减少重复请求:
server {
listen 443 ssl;
server_name example.com;
# 图片缓存30天
location ~* \.(jpg|jpeg|png|gif|ico|webp|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
# CSS和JS缓存7天
location ~* \.(css|js)$ {
expires 7d;
add_header Cache-Control "public";
access_log off;
}
# 字体文件缓存1年
location ~* \.(woff|woff2|ttf|eot)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
}
}
当Nginx作为反向代理时,可以将后端响应缓存到本地磁盘,减少对后端的请求压力:
# 在http块中定义缓存区域
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 {
listen 443 ssl;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:3000;
# 启用缓存
proxy_cache my_cache;
# 缓存有效期
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 缓存Key
proxy_cache_key "$scheme$request_method$host$request_uri";
# 响应头中添加缓存状态(HIT/MISS/BYPASS)
add_header X-Cache-Status $upstream_cache_status;
# 后端故障时使用过期缓存
proxy_cache_use_stale error timeout http_500 http_502 http_503;
# 只允许一个请求回源,其他等待缓存
proxy_cache_lock on;
}
# API接口不缓存
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_cache off;
proxy_no_cache 1;
}
}
参数说明:
keys_zone=my_cache:10m:缓存区域名称和索引内存大小(10MB索引约可存储8万个Key)max_size=1g:缓存文件最大占用磁盘空间inactive=60m:60分钟内未被访问的缓存自动清除proxy_cache_use_stale:后端故障时返回过期缓存,保证服务可用HTTP/2协议支持多路复用、头部压缩和服务器推送,能显著提升页面加载速度。Nginx启用HTTP/2非常简单:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# HTTP/2相关优化
http2_max_concurrent_streams 128;
location / {
root /var/www/example.com;
index index.html;
}
}
HTTP/2要求HTTPS,因此必须先配置好SSL证书。验证HTTP/2是否生效:
curl -I --http2 https://example.com
# 响应中应包含 HTTP/2 200
根据VPS的CPU核心数和内存调整Nginx的Worker配置:
# 查看CPU核心数
nproc
# 编辑nginx.conf
worker_processes auto; # 自动匹配CPU核心数
events {
worker_connections 1024; # 每个Worker的最大连接数
multi_accept on; # 一次接受多个新连接
use epoll; # Linux高效事件模型
}
http {
# 开启sendfile零拷贝
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 长连接超时
keepalive_timeout 65;
keepalive_requests 100;
# 文件类型哈希表
types_hash_max_size 2048;
# 请求体大小限制
client_max_body_size 50m;
client_body_buffer_size 128k;
}
搬瓦工VPS通常是1-2个CPU核心,worker_processes auto 会自动适配。worker_connections 设置为1024对于小型站点足够,大流量站点可增加到4096。
Brotli是比Gzip更高效的压缩算法,压缩率高15%-20%。需要编译安装Nginx Brotli模块:
# 安装编译依赖
sudo apt install git build-essential libpcre3-dev zlib1g-dev libssl-dev -y
# 克隆Brotli模块
git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli && git submodule update --init
# 查看当前Nginx编译参数
nginx -V
# 下载对应版本Nginx源码并编译添加模块
# --add-dynamic-module=/path/to/ngx_brotli
编译安装后,在配置中启用:
http {
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
}
启用Nginx状态监控页面,实时查看连接和请求数据:
server {
listen 8080;
server_name localhost;
location /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}
}
# 查看状态
curl http://127.0.0.1:8080/nginx_status
# 输出示例:
# Active connections: 5
# server accepts handled requests
# 1234 1234 5678
# Reading: 0 Writing: 2 Waiting: 3
Tip: 更多教程请查看新手教程。