10 KiB
10 KiB
腾讯云 CDN 配置指南
本文档描述如何为 xmclassmate.top 域名配置腾讯云 CDN,实现:
- 隐藏源站服务器 IP
- 加速静态资源访问
- 防止源站被直接攻击
域名信息
| 域名 | 用途 | CDN 适用性 | 说明 |
|---|---|---|---|
xmclassmate.top |
主域名 | ✅ 可配置 | 通常作为 API 或主站 |
www.xmclassmate.top |
WWW | ✅ 可配置 | 网站入口 |
warden.xmclassmate.top |
Warden | ✅ 可配置 | Warden 服务 |
gitea.xmclassmate.top |
Gitea | ✅ 可配置 | Git 服务 |
dev.xmclassmate.top |
开发环境 | ✅ 可配置 | 后端开发环境 |
psql.xmclassmate.top |
PostgreSQL | ❌ 不适用 | TCP 协议,CDN 无法代理 |
当前架构
用户 → DNS (A记录) → 服务器 IP → Nginx → 服务端口
目标架构
用户 → CDN → DNS (CNAME) → CDN 节点 → 回源 → Nginx → 服务
证书说明
已有证书:xmclassmate.top(主域名)
子域名处理方式:
| 方案 | 适用场景 | 成本 |
|---|---|---|
| 腾讯云免费证书 | 每个子域名独立申请 | 免费 |
| 泛域名证书 | *.xmclassmate.top |
免费/付费 |
| CDN 自有证书 | 直接使用源站证书 | 需上传到 CDN |
推荐:为 *.xmclassmate.top 申请泛域名证书,一次覆盖所有子域名。
配置步骤
第一步:获取腾讯云 CDN 回源 IP 段
登录腾讯云 CDN 控制台,获取回源 IP 段:
控制台路径:
内容分发网络 CDN → 域名管理 → 选择域名 → 基本配置 → 回源配置
腾讯云 CDN 回源 IP 段(常见段):
101.226.0.0/16 # 上海
119.147.0.0/16 # 广州
123.151.0.0/16 # 天津
182.140.0.0/16 # 成都
注意:雨云服务器使用腾讯云 CDN,具体 IP 段需在腾讯云 CDN 控制台查看。
第二步:添加加速域名
控制台路径:
内容分发网络 CDN → 域名管理 → 添加域名
配置项(以 dev.xmclassmate.top 为例):
| 配置项 | 示例值 | 说明 |
|---|---|---|
| 加速域名 | dev.xmclassmate.top |
要加速的子域名 |
| 业务类型 | Web 网站 | 选择「网站加速」 |
| 源站类型 | IP | 填写服务器公网 IP |
| 源站地址 | 服务器IP |
服务器真实 IP |
| 回源协议 | HTTPS | 源站已有证书 |
| 端口 | 443 | HTTPS 端口 |
重复此步骤添加其他域名:gitea、warden、www
第三步:配置 HTTPS 证书
方案 A:使用泛域名证书(推荐)
- 在腾讯云 SSL 证书控制台申请
*.xmclassmate.top泛域名证书 - 审核通过后,在 CDN 控制台选择该证书
方案 B:每个子域名独立配置
- 为每个子域名申请独立证书
- 上传证书到 CDN
方案 C:使用源站证书
如果 Nginx 已配置 HTTPS,可直接「回源协议」选择 HTTPS,CDN 会使用相同证书。
第四步:获取 CDN CNAME
域名添加成功后,腾讯云会分配一个 CNAME:
格式:`xxxxxxxx.xxx.com.w.cdngslb.com`
在控制台查看:
内容分发网络 CDN → 域名管理 → dev.xmclassmate.top → 基本配置 → CNAME
第五步:修改 DNS 解析(雨云 DNSPod)
雨云 DNSPod 控制台:
| 记录类型 | 主机记录 | 记录值 | TTL |
|---|---|---|---|
| CNAME | dev | xxxxxxxx.xxx.com.w.cdngslb.com |
600 |
| CNAME | gitea | xxxxxxxx.xxx.com.w.cdngslb.com |
600 |
| CNAME | warden | xxxxxxxx.xxx.com.w.cdngslb.com |
600 |
| CNAME | www | xxxxxxxx.xxx.com.w.cdngslb.com |
600 |
注意:
- 将原有的 A 记录删除或禁用
- CNAME 和 A 记录不能共存于同一主机记录
第六步:配置 Nginx
6.1 记录真实客户端 IP
server {
listen 443 ssl;
server_name dev.xmclassmate.top gitea.xmclassmate.top warden.xmclassmate.top;
# SSL 证书
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 腾讯云 CDN 回源 IP 段(替换为实际值)
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 101.226.0.0/16;
set_real_ip_from 119.147.0.0/16;
set_real_ip_from 123.151.0.0/16;
set_real_ip_from 182.140.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# 日志格式
log_format main '$real_ip_var - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $real_ip_var;
proxy_set_header X-Forwarded-For $real_ip_var;
}
}
6.2 限制只能 CDN 回源访问(可选)
geo $cdn_access {
default 0;
10.0.0.0/8 1;
101.226.0.0/16 1;
119.147.0.0/16 1;
123.151.0.0/16 1;
182.140.0.0/16 1;
}
server {
if ($cdn_access = 0) {
return 403;
}
# ... 其他配置
}
6.3 重载 Nginx
nginx -t && nginx -s reload
第七步:配置雨云安全组
在雨云控制台配置端口规则:
安全组规则:
| 方向 | 来源 | 协议端口 | 策略 |
|---|---|---|---|
| 入站 | 101.226.0.0/16 |
TCP:443 | 允许 |
| 入站 | 119.147.0.0/16 |
TCP:443 | 允许 |
| 入站 | 123.151.0.0/16 |
TCP:443 | 允许 |
| 入站 | 182.140.0.0/16 |
TCP:443 | 允许 |
| 入站 | 0.0.0.0/0 |
TCP:443 | 拒绝 |
注意:雨云安全组可能需要单独配置 CDN IP 段,具体操作参考雨云文档。
第八步:验证配置
8.1 检查 DNS 解析
# 检查 CNAME 是否生效
dig dev.xmclassmate.top
# 期望输出包含:cdn.com.w.cdngslb.com
8.2 检查 CDN 回源
# 通过 CDN 访问
curl -I https://dev.xmclassmate.top
# 检查响应头是否包含 CDN 信息
8.3 检查 Nginx 日志
# 查看是否记录了真实 IP
tail -f /var/log/nginx/access.log
# 期望:$real_ip_var 显示的是用户真实 IP
8.4 验证源站隐藏
# 直接 IP 访问应该被拒绝(如果配置了安全组)
curl -I https://服务器IP
# 期望:连接超时或 403
psql.xmclassmate.top 处理
PostgreSQL 不适合 CDN,因为:
- CDN 只支持 HTTP/HTTPS 协议
- PostgreSQL 使用 TCP 协议(端口 5432)
处理方式:保持现状(A 记录),偶尔手动调试够用。
静态文件缓存配置
CDN 可以缓存 Rust 后端返回的静态文件(CSS、JS、图片等),减轻源站压力。
工作流程
用户请求 /static/css/style.css
↓
CDN 检查缓存(未命中)
↓
回源请求 → Rust 后端
↓
Rust 返回文件 + Cache-Control 头
↓
CDN 缓存这份响应
↓
返回给用户
下一个用户请求 → CDN 直接返回缓存 ✅
Rust 后端配置
在返回静态文件响应时设置 Cache-Control 头:
use actix_web::{HttpResponse, http::header};
/// 返回静态文件(适合带版本号的文件,如 style.v1.css)
pub fn serve_static_file(path: &str) -> HttpResponse {
HttpResponse::Ok()
.insert_header(("Cache-Control", "public, max-age=31536000")) // 缓存 1 年
.insert_header(("Content-Type", "text/css"))
.body(read_file(path))
}
/// 返回可能更新的静态文件(缓存时间较短)
pub fn serve_dynamic_static(path: &str) -> HttpResponse {
HttpResponse::Ok()
.insert_header(("Cache-Control", "public, max-age=86400")) // 缓存 1 天
.insert_header(("Content-Type", "application/javascript"))
.body(read_file(path))
}
缓存时间建议
| 文件类型 | 缓存时间 | 说明 |
|---|---|---|
| CSS, JS(带版本号) | 1 年 (max-age=31536000) |
配合版本号使用 |
| 图片 | 1 个月 (max-age=2592000) |
很少变动 |
| HTML | 不缓存 | 动态内容 |
| API 响应 | 不缓存 | 实时数据 |
静态文件命名建议
为便于 CDN 长期缓存,建议静态文件带版本号或 hash:
# 推荐
style.v1.css
app.v2.js
bundle.abc123.css
# 不推荐(更新时 CDN 仍返回旧缓存)
style.css
app.js
腾讯云 CDN 缓存配置
在腾讯云 CDN 控制台设置缓存规则:
内容分发网络 CDN → 域名管理 → 选择域名 → 缓存配置 → 添加规则
规则类型:文件类型
文件类型:.css,.js,.png,.jpg,.jpeg,.gif,.ico
缓存时间:31536000 秒(1年)
配置检查清单
| 步骤 | 操作 | 状态 |
|---|---|---|
| 1 | 获取腾讯云 CDN 回源 IP 段 | ☐ |
| 2 | 为每个域名添加 CDN 加速 | ☐ |
| 3 | 配置 HTTPS 证书(泛域名或独立) | ☐ |
| 4 | 获取 CDN CNAME | ☐ |
| 5 | 修改雨云 DNSPod DNS 解析 | ☐ |
| 6 | 配置 Nginx 真实 IP | ☐ |
| 7 | 配置雨云安全组 | ☐ |
| 8 | 验证配置生效 | ☐ |
回滚步骤
如果配置有问题需要回滚:
- 雨云 DNSPod 删除 CNAME,恢复 A 记录
- Nginx 移除
set_real_ip_from配置 - 安全组恢复 0.0.0.0/0 访问
常见问题
Q1:CDN 配置后多久生效?
DNS 解析生效时间取决于 TTL,通常 10 分钟到 48 小时。
Q2:泛域名证书如何申请?
腾讯云 SSL 证书控制台 → 免费证书 → 申请证书 → 填写 *.xmclassmate.top
Q3:雨云安全组在哪里配置?
雨云控制台 → 云服务器 → 选择服务器 → 安全组
Q4:如何确认 CDN 已生效?
curl -I https://dev.xmclassmate.top
# 查看 Age 或 X-Cache-Lookup 头
Q5:psql 域名如何安全访问?
保持现状(A 记录),仅供偶尔手动调试使用。