跳转至

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 日发布。


Coverity Scan

这个小型 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 仓库 中找到有关此模块的其他配置提示和文档。