精细化Nginx缓存配置海外站点访问
如果你的站点有大量海外访客,加载缓慢、图片迟迟不显示,多半是缓存没做细。
Nginx 默认的缓存行为往往不够精细,需要手动调整才能让海外用户真正感受到“秒开”。
本文从零开始,一步步拆解 精细化Nginx缓存配置,重点解决海外访问场景下的缓存策略、过期时间、缓存粒度等问题。
适用场景与准备工作
本文适合以下情况:
- 站点面向美国、欧洲、东南亚等海外地区访问。
- 已经部署 Nginx,希望提升静态资源(图片、CSS、JS)加载速度。
- 想要缓存后端 API 返回的数据,减少服务器压力。
操作前请确认:
- 拥有服务器 root 或 sudo 权限。
- Nginx 版本不低于 1.10(推荐 1.18+),确保 proxy_cache 功能完整。
- 已配置好站点域名,并且能通过
nginx -t测试配置语法。 - 准备好终端工具(SSH 客户端)。
第一步:启用 proxy_cache 并定义缓存路径
Nginx 的代理缓存核心是 proxy_cache_path 和 proxy_cache。
首先在 nginx.conf 的 http 块内添加:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
参数说明:
levels=1:2:缓存文件目录层级,分散 IO。keys_zone=my_cache:10m:缓存元数据占 10MB 内存,名称设为my_cache。max_size=1g:缓存最大 1GB,超出自动淘汰。inactive=60m:60 分钟无访问即清理,适合海外用户低频访问场景。use_temp_path=off:避免临时文件与缓存目录不同磁盘导致性能问题。
创建缓存目录并赋予 Nginx 用户权限:
sudo mkdir -p /data/nginx/cache
sudo chown www-data:www-data /data/nginx/cache
第二步:精细化配置站点缓存规则
进入站点配置(如 /etc/nginx/sites-available/example.com),在 location 或 server 块内按需启用缓存。
下面是针对海外访问优化的典型配置:
# 静态资源缓存 - 海外用户重复请求较多
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
# 不经过后端代理,直接返回本地文件,无需 proxy_cache
root /var/www/example.com;
try_files $uri =404;
}
# 动态页面或API缓存 - 通过 proxy_pass 转发后缓存
location /api/ {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 60m; # 成功响应缓存 60 分钟
proxy_cache_valid 404 1m; # 404 缓存 1 分钟,避免恶意刷新
proxy_cache_use_stale error timeout updating http_500;
proxy_ignore_headers Cache-Control Expires Set-Cookie; # 忽略后端动态控制
add_header X-Cache-Status $upstream_cache_status; # 方便验证
}
# 首页缓存(可适当降低时间)
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 10m;
proxy_cache_use_stale error updating;
add_header X-Cache-Status $upstream_cache_status;
}
关键点:
- 海外用户网络延迟较高,静态资源用
expires 30d配合Cache-Control: public, immutable可以让浏览器长期缓存。 - 动态接口(如 API)通过
proxy_cache缓存,减轻后端压力,同时设置合理的过期时间(60 分钟)。 proxy_cache_use_stale允许在后台刷新时继续提供旧缓存,避免海外用户遇到超时。
避坑指南:常见错误与解决方案
1. 缓存不生效,X-Cache-Status 总是 MISS
检查后端响应是否包含 Set-Cookie 或 Cache-Control 头部。Nginx 默认会忽略带 Cookie 的响应。可以在 location 中添加:
proxy_ignore_headers Set-Cookie Cache-Control Expires;
2. 缓存文件权限不足
确保 proxy_cache_path 指定的目录 Nginx 工作进程可写。检查用户权限,常见错误:open() failed (13: Permission denied)。用 ls -la /data/nginx/cache 查看属主。
3. 海外用户访问静态资源返回 304 Not Modified
这是正常的协商缓存,但如果你希望每次都返回 200 且强制缓存,可以去掉 ETag 或配置 add_header Last-Modified ""。不过一般建议保留,减少带宽。
4. 缓存太大了?设置 max_size 并定期清理
可以添加定时任务(cron)清除过期缓存:
find /data/nginx/cache -type f -mtime +7 -delete
效果验证:用 curl 检查缓存状态
配置重载后,使用 curl 模拟请求,查看头部是否包含 X-Cache-Status:
curl -I https://example.com/api/users?page=1
第一次返回 X-Cache-Status: MISS,第二次应返回 HIT。
如果是 STALE 说明使用了过期缓存(属于正常策略)。
对于静态资源,可以使用 Chrome 开发者工具,在 Network 面板查看 /api 和图片的 Cache-Control 头。
还可以用 httpstat 或 curl -w 测试总耗时:
curl -o /dev/null -s -w "Time: %{time_total}\n" https://example.com/static/test.js
对比启用缓存前后的耗时,海外访问通常能降低 30%-80%。
高频问题解答
Q:海外节点在国外,缓存路径如何选择?
缓存路径建议选择 SSD 磁盘,目录层级 levels=1:2 已经足够。如果站点文件量极大,可以提升 max_size 到 10GB。
Q:Nginx 版本较旧是否支持 proxy_cache?
proxy_cache 从 Nginx 0.7.44 开始支持,但某些参数(如 use_temp_path)需要 1.5.12 以上。运行 nginx -V 查看编译参数,建议升级到 1.18+ 以获得最稳定功能。
Q:配置后网站变慢了,怎么回事?
可能因为后端响应时间波动,导致缓存 MISS 时请求阻塞。可以调整 proxy_cache_lock on; 和 proxy_cache_lock_timeout 5s; 避免同时回源。或者降低缓存过期时间,减少去后端次数。
如果你正在处理 精细化Nginx缓存配置海外站点访问,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
缓存生效后,别忘了用海外节点或在线测试工具(如 PingCode、ByteCheck)验证真实访问速度。