温馨提示×

如何通过LNMP实现内容分发网络(CDN)

小樊
41
2025-11-30 07:01:50
栏目: 云计算

基于LNMP自建小型CDN的可落地方案

一、方案总览与适用场景

  • 目标:用LNMP(Linux、Nginx、MySQL、PHP)搭建一套小型、可控的内容分发网络,实现就近访问、回源加速与高可用。
  • 架构思路:在用户与源站之间加入边缘缓存层(Nginx或Varnish),配合DNS智能解析将不同运营商/地域解析到最近边缘节点;边缘层做反向代理缓存,源站专注动态内容。
  • 适用:中小站点、内部系统、边缘节点有限(同城/同区域多机房)的场景;若需全国/全球覆盖,建议叠加商业CDN或扩展为多地域边缘集群。

二、方案一 边缘Nginx反向代理缓存 + 源站LNMP

  • 拓扑:用户 → 边缘Nginx(缓存/回源) → 源站Nginx + PHP-FPM + MySQL
  • 边缘Nginx关键配置(示例)
    • 定义缓存区与键
    • 区分静态与动态,静态直给并设长期缓存,动态回源
    • 回源携带必要请求头,便于源站识别与日志分析
    • 简单命中率观测头(便于调试)
  • 源站Nginx建议
    • 开启GzipHTTP/2,提升传输效率
    • 对外仅暴露必要端口与服务,其余由边缘层代理
  • 参考配置片段
    • 边缘Nginx
      proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:100m inactive=7d max_size=10g;
      proxy_cache_key "$scheme$request_method$host$request_uri";
      
      server {
          listen 80;
          server_name cdn.example.com;
      
          # 静态资源:长缓存 + 强缓存策略
          location ~* \.(jpg|jpeg|png|gif|webp|svg|css|js|ico)$ {
              proxy_pass http://origin_backend;
              proxy_cache STATIC;
              proxy_cache_valid 200 304 7d;
              proxy_cache_valid any 1m;
              add_header X-Cache-Status $upstream_cache_status;
              expires 30d;
              add_header Cache-Control "public, immutable";
          }
      
          # 动态内容:回源
          location / {
              proxy_pass http://origin_backend;
              proxy_set_header Host $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto $scheme;
              proxy_cache_bypass $cookie_nocache $arg_nocache;
          }
      }
      
      upstream origin_backend {
          server 203.0.113.10:80; # 源站Nginx
      }
      
    • 源站Nginx(动静分离示例)
      server {
          listen 80;
          server_name origin.example.com;
      
          root /var/www/html;
          index index.php;
      
          location / {
              try_files $uri $uri/ /index.php?$args;
          }
      
          location ~ \.php$ {
              include fastcgi_params;
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              fastcgi_pass 127.0.0.1:9000; # PHP-FPM
          }
      
          # 静态资源直出(可选:若边缘层未覆盖全部静态路径)
          location ~* \.(jpg|jpeg|png|gif|webp|svg|css|js|ico)$ {
              expires 30d;
              add_header Cache-Control "public";
          }
      }
      
  • 要点
    • 边缘层缓存静态资源,动态请求回源;通过X-Cache-Status观察 HIT/MISS。
    • 源站开启Gzip/HTTP/2可显著降低传输时延与带宽占用。

三、方案二 Varnish缓存前置 + Nginx回源

  • 拓扑:用户 → Varnish(内存缓存/调度) → Nginx + PHP-FPM + MySQL
  • 适用:读多写少、热点内容明显的站点;Varnish以内存缓存为主,命中率高、延迟低(重启后缓存丢失)。
  • 关键配置(示例)
    • 后端定义与健康检查
      vcl 4.0;
      import directors;
      
      backend web1 {
          .host = "172.25.254.102";
          .port = "80";
          .probe = {
              .url = "/health.html";
              .window = 3;
              .threshold = 2;
              .interval = 3s;
          }
      }
      backend web2 {
          .host = "172.25.254.103";
          .port = "80";
          .probe = {
              .url = "/health.html";
              .window = 3;
              .threshold = 2;
              .interval = 3s;
          }
      }
      
      sub vcl_init {
          new web_cluster = directors.round_robin();
          web_cluster.add_backend(web1);
          web_cluster.add_backend(web2);
      }
      
      sub vcl_recv {
          if (req.http.host ~ "^(www\.)?example\.com$") {
              set req.http.host = "www.example.com";
              set req.backend_hint = web_cluster.backend();
              # 如需强制回源调试可打开:return(pass);
          } else {
              return(synth(404, "Not in cache"));
          }
      }
      
    • 运行与端口
      • 常见做法:Varnish监听80,源站Nginx监听8080或其他端口;在Varnish VCL中设置 .port 为源站端口。
  • 要点
    • 通过健康检查自动摘除异常源站;Varnish命中率极高但为内存缓存,注意容量规划与失效策略。

四、DNS智能解析与回源HOST配置

  • 智能解析
    • 使用支持分线路/分地域的DNS服务(如 DNSPod 等),将电信/移动/联通或不同省份解析到最近/最优的边缘节点,降低跨网时延。
  • 回源HOST与回源策略
    • 边缘节点回源时,确保请求头Host与源站虚拟主机匹配;若源站托管多域名,需在边缘层显式设置req.http.host或在源站配置server_name
    • 多边缘节点场景,建议统一回源到源站入口域名/IP,由源站再做内部路由与负载均衡,便于维护与扩展。

五、缓存策略与运维要点

  • 缓存分层
    • 边缘层:静态资源长期缓存(如30天),动态请求默认回源;为可缓存的API/页面设置合适Cache-ControlVary
    • 源站:开启Nginx反向代理缓存(如 proxy_cache_path)作为第二层缓冲,减轻后端压力。
  • 观测与调优
    • 通过响应头X-Cache-Status(Nginx)或varnishstat(Varnish)观察命中率与后端压力;结合日志分析热点资源与慢请求。
    • 边缘层与源站开启Gzip/HTTP/2,并优化Nginx连接参数(如worker_processes/worker_connections/keepalive_timeout)以提升并发与长连接效率。
  • 高可用与扩展
    • 多边缘节点 + 健康检查自动摘除异常节点;需要更强一致性时,源站前可加负载均衡/高可用组件(如 Keepalived/HAProxy)。
    • 覆盖地域扩大时,逐步增加边缘节点并完善监控/告警/日志体系。

0