immutable: NGINX 模块用于设置静态资产的不可变缓存
安装
您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:
- RedHat Enterprise Linux 7、8、9 和 10
- CentOS 7、8、9
- AlmaLinux 8、9
- Rocky Linux 8、9
- Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-immutable
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-immutable
通过在 /etc/nginx/nginx.conf 顶部添加以下内容来启用该模块:
load_module modules/ngx_http_immutable_module.so;
本文档描述了 nginx-module-immutable v0.0.4,于 2022 年 11 月 21 日发布。
这个小型 NGINX 模块可以通过设置 immutable 属性来帮助改善您的公共静态资产的缓存,设置远期过期时间。
目标受众
依赖缓存破坏模式的网站和框架:
- 静态资源在其 URL 中包含版本/哈希,而从不修改资源
- 在必要时,用具有新版本号/哈希的新版本更新资源,以便其 URL 不同
使用缓存破坏的流行框架:
- Magento 2
- 在此处添加您自己的框架!
概述
http {
server {
location /static/ {
immutable on;
}
}
}
将产生以下 HTTP 头:
...
Cache-Control: public,max-age=31536000,stale-while-revalidate=31536000,stale-if-error=31536000,immutable
Expires: Thu, 31 Dec 2037 23:55:55 GMT
...
与 expires max; 的不同之处:
- 设置
immutable属性,例如Cache-Control: public,max-age=31536000,immutable以改善缓存。这是 1 年而不是 10 年,原因见下文。 - 仅在真正必要时发送
Expires,例如当客户端通过HTTP/1.0请求资源时。 - 设置
public属性以确保资产可以被公共缓存缓存,这通常是期望的。
由于 Chromium 基于浏览器对 immutable 的支持不足,我们还添加了 stale-while-revalidate=31536000,stale-if-error=31536000,这有助于在边缘情况下提高缓存命中率。使用这些指令允许在其缓存生命周期之外提供缓存响应,对于不可变资源来说,这个生命周期是永远的。
因此,在大多数情况下,immutable on; 可以作为实现缓存破坏模式的更好替代方案。
为什么是 31536000 秒(1 年)?
RFC 定义使用一年将响应标记为“永不过期”:
要将响应标记为“永不过期”,源服务器发送的 Expires 日期大约是响应发送时间的一年后。HTTP/1.1 服务器不应发送超过一年以后的 Expires 日期。
更多细节请参见 这篇文章。
示例:Magento 2 生产配置
假设您的商店在生产模式下运行,您已经编译了所有资产。 此 示例配置 可以优化为:
location /static/ {
immutable on;
# 移除用于克服浏览器缓存的静态文件签名
location ~ ^/static/version {
rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
}
location ~* \.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2|json)$ {
add_header X-Frame-Options "SAMEORIGIN";
}
location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
add_header Cache-Control "no-store";
add_header X-Frame-Options "SAMEORIGIN";
immutable off;
}
add_header X-Frame-Options "SAMEORIGIN";
}
与 ngx_security_headers 一起使用时,可以进一步简化:
security_headers on;
location /static/ {
immutable on;
location ~ ^/static/version {
rewrite ^/static/(version\d*/)?(.*)$ /static/$2 last;
}
location ~* \.(zip|gz|gzip|bz2|csv|xml)$ {
add_header Cache-Control "no-store";
immutable off;
}
}
GitHub
您可以在 nginx-module-immutable 的 GitHub 仓库 中找到有关此模块的其他配置提示和文档。