1.
本教程目标:用两台或多台服务器搭建一个简单的“近似CDN”加速方案,核心是使用 Nginx 作为反向代理缓存(proxy_cache),加速静态资源分发并支持 HTTPS。
适用场景:自建小型边缘节点、测试环境或企业内网加速,不依赖第三方CDN供应商。
2.
准备至少两台服务器:一台 Origin(源站),一台或多台 Edge(加速节点)。示例操作系统:Ubuntu 20.04 / 22.04。
确保每台服务器能 SSH 登录(ssh user@ip),开放 80/443 端口;域名已购买,能够修改 DNS 记录。
3.
更新系统并安装 Nginx:sudo apt update && sudo apt install -y nginx certbot python3-certbot-nginx
确认 Nginx 版本与模块:nginx -v;确认 /etc/nginx 有 proxy 模块(通常默认编译包含)。
4.
在边缘节点创建缓存目录并设置权限:sudo mkdir -p /var/cache/nginx && sudo chown www-data:www-data /var/cache/nginx
建议将缓存放在独立磁盘或分区,确保足够 IO 和空间,定期监控磁盘使用。
5.
在 /etc/nginx/nginx.conf 或单独文件 /etc/nginx/conf.d/cache.conf 中添加 proxy_cache_path 设置,例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=one:10m max_size=10g inactive=60m use_temp_path=off;
解释:keys_zone 定义元数据内存,max_size 定义缓存最大占用,inactive 定义多久未访问即过期。
6.
在 /etc/nginx/sites-available/ 创建 server 块示例:
server { listen 80; server_name cdn.example.com; location / { proxy_pass https://origin.example.com; proxy_set_header Host $host; proxy_cache one; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; add_header X-Proxy-Cache $upstream_cache_status; proxy_cache_bypass $http_cache_control; } }
说明:proxy_cache_valid 控制缓存时间,可根据不同 URL 设置不同缓存策略;添加 X-Proxy-Cache 方便调试。
7.
确保 80 端口可达后运行:sudo certbot --nginx -d cdn.example.com,Certbot 会自动在 Nginx 中添加 SSL 配置并设置续期。
如果有多个 Edge 节点,可在每个节点执行 certbot,或使用通配符证书(需要 DNS 验证)。
8.
在源站设置正确的 Cache-Control、Expires 头,例如静态文件:Cache-Control: public, max-age=604800。源站应允许来自 Edge 节点的请求。
如果需要鉴权或防盗链,使用自定义头或签名 URL;Edge 节点应向 origin 转发必要认证头。
9.
将子域名 cdn.example.com 的 A 记录指向边缘节点 IP。多节点可添加多个 A 记录实现轮询负载,或用 GeoDNS 实现地域分配(需 DNS 服务支持)。
若使用 CNAME 指向负载均衡器或第三方 IP,请确保 TLS 与 Host 配置一致。
10.
测试缓存命中:curl -I https://cdn.example.com/static/file.png 看响应头 X-Proxy-Cache: HIT/ MISS。也可通过 ab 或 wrk 压力测试观察响应时间降低。
配置缓存清理:使用 nginx-cache-purge 模块或按路径删除 /var/cache/nginx 下的对应文件并重启 Nginx;也可实现基于接口的 PURGE 请求来清理缓存。
11.
监控指标:缓存命中率、磁盘使用、带宽、延迟。推荐用 Prometheus + node_exporter + nginx exporter 收集并告警。
日志轮转:确保 /var/log/nginx 有 logrotate 配置,避免日志占满磁盘;定期清理过期缓存文件。
12.
答:常见错误包括 1) DNS 未生效(检查 nslookup 或 dig);2) Firewall 阻断 80/443(检查 ufw/iptables);3) Nginx 配置语法错误(sudo nginx -t);4) 缓存头设置不当导致永不缓存或不更新(检查 Cache-Control)。按顺序排查网络、端口、Nginx 日志与响应头。
13.
答:推荐两种方式:1) 安装并编译 nginx-purge 模块,支持通过特定 PURGE 请求清除;2) 使用脚本根据 cache key 计算并删除 /var/cache/nginx 中对应文件,删除后 reload nginx。生产环境建议优先模块化清理或构建 API。

14.
答:自建优点是成本可控、完全可定制;限制在于没有全球节点、运维成本和 DDoS 防护能力有限、带宽资源受制于自有线路。适合中小规模或特殊需求场景;大规模分发仍推荐使用成熟厂商。