单纯靠 Nginx 配置无法消除物理网络延迟,但能通过压缩和连接复用减少传输数据量,适合静态资源较多的网站场景。本文主要介绍如何通过 Nginx 优化传输效率,而非解决跨洋物理延迟,建议配合 CDN 使用以获得更佳效果。
先说结论:Nginx 优化只能减少传输开销,无法解决跨洋链路的物理延迟,建议配合 CDN 使用。
- 先定位:确认慢是因为资源大还是网络延迟高
- 先做:开启压缩、连接复用和静态缓存
- 再验证:对比优化前后的传输大小和加载时间
完整配置示例
以下配置整合了 gzip、连接复用及反向代理缓存。请注意 proxy_cache_path 必须放在 http 块中,其余配置放在 server 块中:
# 以下需放入 http 块
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
server {
listen 80;
server_name example.com;
# 开启压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_comp_level 5;
# 连接复用
keepalive_timeout 65;
keepalive_requests 100;
location / {
# 反向代理核心配置
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 启用代理缓存
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
}
# 静态资源单独缓存策略
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_pass http://127.0.0.1:8080;
proxy_cache my_cache;
proxy_cache_valid 200 30d;
expires 30d;
}
}配置核心指令说明
1. 反向代理设置
proxy_pass 指向后端应用服务器地址。确保 Nginx 服务器能连通该地址,否则会出现 502 Bad Gateway。
2. 内容压缩
gzip on 开启压缩,gzip_types 指定压缩的文件类型。注意图片、视频等二进制文件通常不需要 Nginx 再次压缩,避免浪费 CPU。
3. 代理缓存
proxy_cache_path 定义缓存磁盘路径和_zone 名称。location 块中使用 proxy_cache my_cache; 启用该缓存区。proxy_cache_valid 设置不同状态码的缓存时长。
配置后执行 nginx -t 检查语法,然后 nginx -s reload 重载。
验证方法
1. 检查响应头
使用 curl 命令查看响应头中是否包含 Content-Encoding: gzip 及缓存状态。
curl -I -H "Accept-Encoding: gzip" https://你的域名
观察 X-Cache-Status 字段,首次请求通常为 MISS,二次请求应为 HIT。
2. 浏览器开发者工具
打开 Chrome 开发者工具的 Network 面板,刷新页面。查看资源列表中的 Size 列,对比 transferred(实际传输)和 resource(原始大小)。如果开启压缩,transferred 应明显小于 resource。
3. 观察加载时间
多次刷新页面,观察 Finish 时间的变化。如果配置了缓存,第二次加载通常会更短。
常见坑
1. 缓存了动态内容
不要对所有 URL 开启代理缓存,否则用户可能看到过期的个人信息或后台数据。建议只缓存 css、js、图片等静态扩展名,或通过 proxy_cache_bypass 排除特定 Cookie。
2. 忽略备案要求
如果为了加速在国内部署 CDN 或服务器,必须完成 ICP 备案。未备案的域名在国内大陆节点无法解析或服务会被阻断。
3. 压缩级别过高
gzip_comp_level 设置过高会占用大量 CPU 资源,导致服务器响应变慢。一般设置为 4 到 6 之间即可,公开资料中没有看到可靠的量化数据证明更高级别能带来净收益。
4. 缓存目录权限
确保 Nginx 工作进程用户(通常为 www-data 或 nginx)对 /var/cache/nginx 有写入权限,否则缓存无法生成。
参考来源
- 来源名:Nginx 官方文档
- 页面标题:Module ngx_http_gzip_module
- URL:https://nginx.org/en/docs/http/ngx_http_gzip_module.html