Nginx 反代默认不缓存,部分场景下,默认配置可能会使源站压力过高并降低网站性能。在这里写一下 Nginx 缓存的配置方法。

反代缓存

和浏览器缓存的机制类似,不过内容缓存在 Nginx 中。

Nginx Cache

浏览器缓存一般只保留在用户电脑的内存或磁盘中,关闭浏览器就会清除缓存,且多个用户不能直接共享相同的缓存。

反代侧添加缓存在静态资源较多、用户量大、源站性能不佳时对性能改善比较明显,缓存保存在服务器内存或硬盘中,缓存时间和大小均可自定义。多个用户访问同一静态资源,Nginx 只需要向源服务器访问一次。

基础配置

在 Nginx 的 HTTP 块中加入下面的内容:

1
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=global:30m max_size=1800m inactive=365d use_temp_path=off;

参数解释:

  • /var/cache/nginx
    指定一个绝对路径作为缓存存储目录
  • levels=1:2
    缓存目录结构,第一级目录使用 1 个字符,第二级目录使用 2 个字符
    最终效果类似 /var/cache/nginx/a/bc/xxxxxxxxxxxx
  • keys_zone=global:30m
    缓存区域名称和元数据缓存大小
    元数据缓存(或者叫缓存索引)驻留在内存中,每 MB 约可存储万条缓存项
  • max_size=1800m
    缓存在磁盘上使用的最大空间
    填满后,自动删除长期未使用的缓存
  • inactive=365d
    缓存的最长时间,是保底规则
    HTTP 标头报告的缓存优先级更高
  • use_temp_path=off
    先将缓存写入临时目录,再写入设置的目录
    部分 NFS 或 FUSE 可能需要设置为 on 才能工作

完成缓存区域的创建以后,为反代的网站开启缓存:

以下内容均需要在反代配置下方加入,也可以多个网站共同 include 一个缓存配置。include 用法如下:

1
2
3
4
5
6
7
# reverse proxy
location / {
proxy_pass http://bw;
proxy_set_header Host $host;
include conf.d/proxy.conf;
proxy_next_upstream error timeout http_502 http_503 http_504;
}

然后添加缓存配置:

1
2
3
proxy_cache global;
proxy_cache_valid 301 7d;
proxy_cache_valid 404 1m;

proxy_cache 后加缓存区域名称。最简单的基础配置,Nginx 将根据源站的标头自动进行缓存。

此处可以添加更多保底规则(一般情况下,非 200 状态码源站很可能不返回缓存控制信息,如果在源站未明确要求是否缓存,就使用此处的规则)

不添加任何其他规则时,Nginx 将跟随源站进行缓存。可以改善性能并且一般不会出现访问问题。完整的规则列表请参考这里

其他配置

忽略源站配置,强制配置单独的缓存规则:
HTTP 块中:

1
2
3
4
5
6
proxy_cache global;
proxy_cache_valid 301 7d;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_ignore_headers Set-Cookie;
proxy_ignore_headers Cache-Control Expires;

通常不推荐。建议的做法是在源站完善配置,然后 Nginx 配置跟随源站并设置保底规则,而不是完全忽略源站的缓存控制。

完全手动配置缓存更灵活,但是可能导致访问出现问题,下面是一些配置建议:

  • 不要缓存网站的登录页面和后台,可能会导致访问失败和数据泄露
  • 不要缓存网站评论系统,可能会导致无法刷新出评论内容或重复评论。

ZFS

缓存在 ZFS 上时,推荐一个配置:

1
2
zfs create -o mountpoint=/var/cache/nginx -o compression=lz4 -o atime=off -o recordsize=128K -o primarycache=metadata -o secondarycache=none rpool/ngcache
zfs set quota=2G rpool/ngcache