用 location 实现静态资源分流加速,核心是按类型/路径精准匹配并路由至本地、cdn或对象存储,结合 map 动态分流、限速限连防护,并通过响应头与日志验证生效。

用 location 实现静态资源分流加速,核心是让不同类型的静态请求走最合适的路径——有的直接本地文件服务,有的代理到 CDN 或专用静态集群,有的按设备/地域动态分发。关键不在“加 location”,而在“匹配准、路由对、策略稳”。
按资源类型或路径前缀精准匹配
避免模糊泛匹配(如 location ~ \.(js|css)$),优先用明确路径前缀,语义清晰、易维护、无歧义:
-
location /static/ { alias /data/webapp/static/; expires max; }→ 所有/static/xxx请求直接读取磁盘,不经过后端 -
location /media/ { proxy_pass https://oss.example.com/; }→ 媒体类资源全部代理到对象存储,Nginx 不落盘 -
location ^~/public/ { root /data/www/dist; }→ 构建产物统一入口,^~确保前缀匹配优先级高于正则
按来源特征做动态分流
借助 map 指令预计算目标,再在 location 中调用变量,实现轻量灰度或适配:
- 先定义映射:
map $http_user_agent $cdn_upstream { ~*Mobile "mobile-cdn"; default "desktop-cdn"; } - 再在静态规则中使用:
location ~* \.(js|css|png|woff2)$ { proxy_pass https://$cdn_upstream; } - 也可结合
$geoip_country_code或自定义 header 实现地域分流,比如把海外请求导给 Cloudflare,国内导给阿里云 OSS
配合限速与连接控制防拖垮
分流之后,每条路径都应有保护机制,尤其面向公网时:
- 对图片、视频等大资源单独限速:
limit_req zone=img_limit burst=5 nodelay; - 限制单 IP 并发连接数,防多线程下载:
limit_conn conn_per_ip 3; - 确保这些指令写在具体
location块内,而不是全局,避免误伤 API 或管理后台
验证是否真正生效
常见失效原因不是配置错,而是没验证清楚:
- 用
curl -I http://yoursite.com/static/logo.png看响应头:确认Content-Length存在、X-Accel-Redirect未出现、Cache-Control是你设的值 - 检查日志中该请求是否命中
location,有没有 fallback 到proxy_pass或 404 - 特别注意
alias末尾必须带斜杠,root路径要和 URI 拼接逻辑一致,否则 404 不报错只静默失败











