用expires实现静态资源极速加载,核心是让浏览器彻底跳过请求、校验和重传,需按类型精准location匹配、对带哈希资源设1y+immutable、HTML等禁用缓存,并配合sendfile、open_file_cache等系统优化。

用 expires 实现静态资源极速加载,核心不是“加缓存”,而是让浏览器彻底跳过请求、校验和重传——关键在精准匹配 + 不变承诺 + 零冗余传输。
按文件类型精准 location 匹配,一个都不能漏
缓存失效最常见的原因是正则没覆盖全。浏览器发 Accept: image/webp,但你的配置只写了 \.(jpg|png)$,结果走默认 location /,压根没加缓存头。
- 必须用大小写不敏感正则:
location ~* \.(jpg|jpeg|png|gif|webp|avif|ico|svg|woff2|ttf|eot|css|js)$ - 避免拆成多个小 location(如单独写
location ~ \.js$),容易被更宽泛的块优先匹配 - 若用了格式重写(比如根据
$http_accept把.png改成.webp),确保try_files最终落到这个 location 块里
给带哈希的资源设长期缓存 + immutable
JS/CSS/图片等文件名含哈希(如 app.f3a8b2.js)意味着内容不变、URL 就不变。这是实现“极致缓存”的前提。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 配置:
expires 1y;+add_header Cache-Control "public, immutable" always; -
immutable是关键:它告诉浏览器“这个 URL 永远不会变”,直接跳过If-None-Match和If-Modified-Since协商,连 304 请求都省了 -
always参数不可少:否则在 304 响应时,add_header不生效,浏览器可能误判缓存状态
HTML 和无哈希资源必须区别对待
HTML 文件每次发布都可能更新,favicon、robots.txt 等虽不常变,但没哈希就无法保证 URL 唯一性,不能长期缓存。
- HTML:
location ~* \.html$ { expires -1s; add_header Cache-Control "no-cache, must-revalidate"; } - Favicon:
location = /favicon.ico { expires 1d; add_header Cache-Control "public"; } - 避免对所有静态资源“一刀切”设
1y,否则用户永远看不到新 HTML
配合系统级优化,把传输链路压到最短
缓存再好,如果文件读取慢、TCP 发送低效,依然拖累首字节时间。
- 启用
sendfile on;和tcp_nopush on;:绕过用户态拷贝,合并 TCP 包,减少网络往返 - 开启
open_file_cache:缓存文件句柄、元数据,避免重复 open/stat 系统调用 - 对超高频小资源(如图标、字体),可考虑挂载到
/dev/shm(tmpfs 内存文件系统),响应稳定在 0.2ms 级别










