跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Nginx 边缘缓存策略:针对不同地区 CDN 节点设置独立回源站

可通过Nginx的map指令结合GeoIP2模块识别地区,动态选择upstream、定制proxy_cache_key与cache_ttl,并适配CDN真实IP,实现多地区缓存隔离与差异化回源。 可以通过 Nginx 的
map
指令结合地理信息(如 $geoip2_country_code 或 $remote_addr 配合 GeoIP 数据库)识别请求来源地区,再为不同地区 CDN 节点配置独立的 upstream 回源地址和缓存策略。核心在于:地区识别 → 动态 upstream 选择 → 区别化 proxy_cache_key 与缓存过期逻辑。 基于 GeoIP2 精确识别地区并映射回源站 Nginx 官方模块
ngx_http_geoip2_module
支持从 MaxMind GeoLite2 数据库提取国家、城市甚至 ASN 信息。启用后,可将不同地区映射到专属 upstream 组: 在
http
块中加载 GeoIP2 数据库:
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb { $geoip2_country_code source=$remote_addr country iso_code; }
用
map
指令将国家码转为上游组名:
map $geoip2_country_code $upstream_backend { default origin_default; CN origin_cn; US origin_us; JP origin_jp; }
定义对应 upstream 块,支持健康检查与负载均衡:
upstream origin_cn { server 10.0.1.10:8080 max_fails=2 fail_timeout=30s; } upstream origin_us { server 10.0.2.20:8080; }
为各地区定制缓存键与过期规则 避免跨地区缓存污染,需让
proxy_cache_key
包含地区标识;同时按地区差异设置
proxy_cache_valid
: 在 location 中使用动态变量构建缓存键:
proxy_cache_key "$upstream_backend|$scheme|$host|$request_uri|$args";
按地区设定不同缓存有效期(注意:需配合
proxy_cache_use_stale
提升容错):
proxy_cache_valid 200 302 10m; # 默认
if ($geoip2_country_code = "CN") { proxy_cache_valid 200 302 30m; }
if ($geoip2_country_code = "US") { proxy_cache_valid 200 302 5m; }
更推荐方式:用
map
预定义缓存时间变量,避免 if 嵌套(Nginx 官方建议):
map $geoip2_country_code $cache_ttl { default 10m; CN "30m"; US "5m"; JP "15m"; }
proxy_cache_valid 200 302 $cache_ttl;
适配 CDN 节点真实 IP 与边缘标识 若 CDN(如 Cloudflare、Akamai)透传了真实客户端 IP 和节点区域信息,需优先信任其头部而非直接读取 $remote_addr: 开启
real_ip
模块解析 CDN 回源 IP:
set_real_ip_from 192.0.2.0/24; # 替换为 CDN 官方公布的回源网段
real_ip_header CF-Connecting-IP; # Cloudflare 示例
# 或 X-Forwarded-For(需谨慎校验层级)
利用 CDN 自定义 Header 识别边缘节点位置(如
X-CDN-Region: us-east
),可作为 fallback 或补充维度:
map $http_x_cdn_region $upstream_backend { ~*us.* origin_us; ~*cn.* origin_cn; default origin_default; }
建议将地区维度写入响应头,便于调试与下游验证:
add_header X-Cache-Region $geoip2_country_code; add_header X-Upstream $upstream_backend;
缓存隔离与一致性注意事项 多地区独立回源不等于完全解耦,需防范内容不一致风险: 静态资源(JS/CSS/图片)应确保各回源站内容实时同步(如通过 rsync、对象存储统一源或 CI/CD 推送),否则缓存可能长期不一致 动态接口(如 API)若按地区返回差异化数据,必须在
proxy_cache_key
中显式包含地区字段,否则 A 地用户可能命中 B 地缓存结果 主动刷新场景下,需调用对应地区的 purge 接口(或使用缓存代理层如 Varnish + bans),不能仅清全局 key 监控建议:按
$upstream_backend
分组统计缓存命中率、回源延迟、5xx 比例,及时发现某地区回源异常

相关文章