1.
在开始自建CDN前,先明确目标:是面向全球还是国内加速?主要加速静态资源(图片、JS、CSS)还是动态接口?期望QPS、并发带宽、缓存命中率、可接受的缓存时延和运维成本都要量化。把这些指标写成SLA,作为后续选型与架构设计的基准。
小分段:量化目标(带宽/并发/命中率)、预算(节点数、带宽成本)、合规与证书需求(域名、HTTPS)。
2.
选型时优先考虑:稳定性、性能、可扩展性、社区活跃度、协议支持与二次开发难度。开源方案常见候选:Nginx(+proxy_cache或OpenResty)、Varnish Cache、Apache Traffic Server、Caddy(自动TLS)、配合对象存储如MinIO作为回源。
小分段:如果需要复杂逻辑优先OpenResty(Lua),极致缓存性能优先Varnish,易用性与自动TLS可选Caddy,稳定通用选Nginx。
3.
将控制平面(配置、监控、鉴权、紫图策略)与数据平面(边缘节点、缓存、转发)分离。控制平面负责下发缓存策略、证书管理和节点状态,数据平面只做高并发请求转发与本地缓存。
小分段:采用中心化配置下发(GitOps + CI)、节点注册与健康检查、TTL策略模板化、清理/失效接口统一暴露。
4.
明确Cache Key(含Host、URI、Query白名单、Cookie白名单)。优先使用Cache-Control与Surrogate-Control头,支持stale-while-revalidate、stale-if-error策略。回源使用健康检查、连接池与限速,支持断路器与熔断,避免回源雪崩。
小分段:静态资源长TTL并配版本号,接口采用短TTL或基于Header的缓存,提供主动Purge API与按路径Invalidate。
5.
边缘节点可以部署在多个IDC或云地域,采用DNS Geo或Anycast(如果有BGP能力)做流量调度。若无Anycast,使用智能DNS(基于地理+延迟)或第三方DNS解决方案。节点间同步只传控制命令,缓存数据本地化。
小分段:节点选点看带宽与骨干延迟,与上游CDN或ISP做对等交换优先,设置SMART health probe与流量分流策略。
6.
必须启用HTTPS(Certbot/ACME自动续期),开启TLS 1.2/1.3,禁用弱加密套件。边缘做速率限制、IP黑白名单、WAF(如ModSecurity或Nginx Lua规则)和请求体限制,记录异常并在控制平面触发规则下发。
小分段:使用CDN边缘限流+回源熔断、WAF规则库定期更新、日志集中化并配合SIEM报警。
7.
步骤1:准备环境与域名。购买带宽与服务器,准备DNS并预留子域(如 cdn.example.com)。
步骤2:选择核心组件并安装。示例Nginx:在边缘机安装Nginx,开启proxy_cache,创建缓存目录并设置权限。
步骤3:配置缓存规则(示例要点)。在server块中设置 proxy_cache_path /data/cache levels=1:2 keys_zone=mycache:100m max_size=50g; 为静态资源添加expires和add_header Cache-Control。配置proxy_cache_key包括 $scheme$host$request_uri 或去除无关query。
步骤4:TLS与证书。使用certbot --nginx或acme.sh自动申请证书并配置自动续期。
步骤5:实现Purge API与配置中心。通过控制平面(可用简单Flask+Git)下发Purge命令到边缘节点,边缘节点调用 nginx -s reload 或 use fastcgi purge 模块。
步骤6:监控与日志。部署Prometheus + node_exporter + Nginx VTS或OpenResty prometheus-lua模块,集中日志到ELK或Loki,设置关键指标报警(命中率、回源QPS、5xx)。
8.
Nginx proxy_cache 基础片段:proxy_cache_path /data/cache levels=1:2 keys_zone=mycache:200m max_size=100g inactive=7d; server{ listen 443 ssl; server_name cdn.example.com; ssl_certificate /etc/letsencrypt/live/cdn.example.com/fullchain.pem; location ~* \.(jpg|css|js|png|woff2)$ { proxy_cache mycache; proxy_cache_valid 200 302 30d; proxy_cache_valid 404 1m; add_header X-Cache-Status $upstream_cache_status; proxy_pass https://origin.example.com; } }
Varnish 简单VCL示例要点:vcl_recv 设置缓存键、vcl_backend_response 设置TTL、vcl_hit 返回缓存。启动:systemctl start varnish,使用 varnishadm ban 来失效缓存。
9.
避免在边缘做复杂的动态计算,优先异步处理或回源。使用分层缓存(边缘+中间cache+回源),缓存预热(warm-up)对热门资源提前回源拉取。对大文件使用分块传输与断点续传支持,配置合理的proxy_buffer和sendfile。
小分段:压缩(gzip/brotli)放在边缘;Content-Encoding与Vary头管理清晰;为移动端与桌面端设置不同缓存策略。
10.
问题:在自建CDN中,选择Nginx还是Varnish更适合边缘节点?
回答:如果需要灵活的业务逻辑和Lua扩展(例如动态Header处理、鉴权)优先OpenResty/Nginx;若追求极致HTTP缓存性能和复杂缓存策略(VCL)且回源逻辑简单,Varnish更合适。实际可混合部署:边缘用Nginx做TLS与WAF,内部用Varnish做高性能缓存。
11.
问题:如何在多节点自建CDN中做到快速且安全的缓存失效(Purge)?
回答:推荐在控制平面实现统一Purge API,控制平面将失效命令推送到所有边缘节点(通过消息队列或SSH/HTTP)。边缘节点执行本地缓存清理并返回状态。为防滥用,Purge接口必须鉴权并限制频率,必要时支持批量失效和路由级别无视缓存参数。
12.
问题:自建CDN有哪些主要风险,如何规避?
回答:主要风险包括回源雪崩、证书管理失效、节点网络不稳定与安全攻击。降低方式:启用回源熔断与降级策略、自动化证书续期、节点健康检查与自动切换、边缘做速率限制和WAF、完善监控和演练恢复流程。
