静态资源服务高可用需确保用户访问时“不卡、不丢、不中断”,由本地高效服务、多节点冗余承载、外部兜底与监控三部分构成:本地通过nginx直读静态文件并优化配置;多节点用keepalived实现vip主备切换;前置cdn与nginx缓存协同兜底;配合健康检查与监控告警实现自动恢复。

静态资源服务高可用,关键不是“只让 Nginx 跑起来”,而是确保用户访问静态文件时:不卡、不丢、不中断。它由三块组成——本地高效服务、多节点冗余承载、外部兜底与监控。
静态资源本地化托管 + 高效响应
所有 HTML/CSS/JS/图片等必须由 Nginx 直接读取并返回,绕过任何后端(如 Tomcat、Node.js),才能发挥其零拷贝和 epoll 优势。
- 把静态文件统一放在 Nginx 可读目录,例如 /data/static 或挂载的 SSD 路径,避免放在系统盘或权限受限路径
- 用 前缀匹配 替代正则,减少回溯开销:
location ^~ /static/ { root /data; expires 1h; add_header Cache-Control "public, immutable"; gzip on; } - 启用 sendfile on 和 tcp_nopush on,提升文件传输效率;对 SVG、CSS、JS 启用 gzip 压缩
- 对带哈希指纹的文件(如
app.8f3a2d.js)设长缓存(max-age=31536000),无版本号资源设短缓存+ETag 校验
多节点 Nginx + Keepalived 主备切换
单台 Nginx 是天然单点。至少部署两台,通过 Keepalived 绑定一个对外 VIP,故障时秒级漂移。
- 在 Master 和 Backup 上均安装 Nginx 和 Keepalived,配置相同静态服务(
root、location、缓存头等完全一致) - Master 的 Keepalived 配置中 priority 100,Backup 设为 90,vrrp_script 检查 Nginx 进程存活
- VIP(如
192.168.1.100)绑定到内网网卡,客户端或 CDN 回源统一指向该 VIP,不感知后端变化 - 注意:两台机器的防火墙需放行 VRRP 协议(协议号 112),且时间同步(chrony/NTP)必须开启,否则心跳异常
前置 CDN + 多级缓存兜底
自建集群解决不了地域延迟和突发流量,CDN 是第一道防线,Nginx 本地缓存是第二道。
- 将 CDN 的回源地址设为 Keepalived 的 VIP,CDN 边缘节点缓存静态资源,大幅降低回源压力
- 若静态资源实际来自对象存储(如 OSS/S3)或远端服务,可在 Nginx 中启用 proxy_cache,配置磁盘缓存区,设置
proxy_cache_valid 200 1h; - CDN 缓存策略按资源类型区分:带哈希的长期缓存;HTML/无版本 CSS/JS 缓存 10 分钟并开启协商缓存(
ETag+If-None-Match) - 禁用 CDN 缓存敏感路径(如
/admin/或含 query 参数的 URL),避免脏数据
健康监控与自动恢复
高可用不只是“能切”,更是“早发现、快干预”。静态服务虽轻,但磁盘满、权限错、配置加载失败都会导致 403/404/500。
- 在 Keepalived 的
vrrp_script中加入检查项:
—nginx -t验证配置语法
—curl -I http://127.0.0.1/static/test.png -o /dev/null -s -w '%{http_code}'检查服务可达性
—df /data | awk 'NR==2 {print $5}' | sed 's/%//'监控磁盘使用率,超 90% 触发降权 - 在 Nginx 日志中启用
log_format记录状态码、响应时间、URI,配合 Prometheus + Grafana 做 4xx/5xx 率、缓存命中率告警 - 定期清理
proxy_cache_path缓存目录或设置inactive=1d自动过期,防止磁盘写满











