在 OpenResty 中使用 CDN 的步骤


1. 配置 CDN 回源

修改 Host

在 OpenResty 的 Nginx 配置中,确保 CDN 回源时携带正确的 Host 头(通常是你的域名):

location / {
    proxy_set_header Host $host;
    proxy_pass http://your_backend_server;
}

允许 CDN IP 段访问

限制源站仅允许 CDN 节点的 IP 访问(防止用户直接绕过 CDN):

allow 192.0.2.0/24;  # CDN 提供的 IP 段
deny all;

2. 缓存策略控制

设置 Cache-Control 头部

通过响应头告知 CDN 如何缓存资源:

location ~* \.(jpg|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, max-age=2592000";
}

动态内容禁用缓存

对需要实时更新的接口或页面禁用 CDN 缓存:

location /api {
    add_header Cache-Control "no-cache, no-store, must-revalidate";
}

3. 获取真实用户 IP

配置 X-Forwarded-For

CDN 会将用户 IP 添加到 X-Forwarded-For 头,需在 OpenResty 中记录真实 IP:

set_real_ip_from 192.0.2.0/24;  # CDN 的 IP 段
real_ip_header X-Forwarded-For;
real_ip_recursive on;

4. SSL/TLS 配置

CDN 到源站的 HTTPS

若 CDN 支持 HTTPS 回源,在 OpenResty 中配置 SSL 证书:

server {
    listen 443 ssl;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    # 其他配置...
}

5. 缓存刷新与预热

与 CDN API 集成

使用 OpenResty 的 Lua 脚本调用 CDN 提供商的 API,实现缓存刷新:

location /purge-cache {
    content_by_lua_block {
        local http = require "resty.http"
        local httpc = http.new()
        -- 调用 CDN 的 Purge API(示例)
        local res, err = httpc:request_uri("https://cdn-provider.com/purge", {
            method = "POST",
            body = "url=/path/to/purge"
        })
        ngx.say("Purge result: ", res.body)
    }
}

6. 验证配置

检查响应头

使用 curl -I 确认 Cache-ControlX-Cache(如 CDN 提供)等头部是否正确:

curl -I https://your-domain.com/static/image.jpg

注意事项:

  • CDN 服务商差异:不同 CDN(如 Cloudflare、阿里云 CDN)可能有特殊配置,需参考其文档。
  • 动态内容优化:对于 API 等动态请求,可通过 OpenResty 的 Lua 逻辑实现边缘计算(如限流、鉴权)。
  • 监控与日志:在 OpenResty 中记录 CDN 节点的请求日志,便于分析缓存命中率。

通过以上步骤,OpenResty 即可高效配合 CDN 实现内容加速与负载均衡。