个人建站与实操 DNS/CDN/服务器配置
域名 /DNS/CDN/ 服务器配置 个人建站底层逻辑与实操排障手册
一、 服务器(源站):网站
在搞域名之前,你必须有一台拥有公网 IP 的服务器。假设你有一台甲骨文云 (Oracle Cloud) 的机器,系统装了 Debian 或 Arch Linux。
1. 放弃网页面板,用 SSH 直连
不要依赖服务商网页上那种卡顿的 VNC 终端。在本地电脑上找个好用的 SSH 客户端(比如 Termius),直接连进服务器。
连接命令逻辑:
ssh username@你的服务器公网IP -p 端口号(默认22)
连上之后,你的服务器就是一台纯粹的 Linux 机器。所有的建站环境(Nginx、数据库)都在这上面跑。
2. 明确你的源站 IP
记录下这台机器的 IPv4 地址(通常是 1xx.xxx.xxx.xxx 的格式)。这个 IP 就是你网站的“绝对物理坐标”。不管外面的域名怎么花里胡哨,最终流量都要流向这个坐标。
二、 域名(Domain):
域名是你网站的门牌号,选错后缀或者乱买,后期迁移的成本极高。
1. 后缀选择优先级
T0 级别:
.com、.net、.cn、.us。老牌正规,没有任何搜索引擎或微信拦截的偏见。T1 级别:
.org、.io、.me。适合技术向或者特定含义的博客。避坑: 首年 1 块钱的
.xyz、.cc、.pw。这些是垃圾站、灰黑产的重灾区。买这些域名,很多次年续费价格离谱,也就短期玩玩还可以。
2. 购买与管理
如果你的服务器在海外,不想走国内繁复的备案流程,直接在 Namesilo 或 Cloudflare 托管购买域名。买完之后,你需要对它进行解析。
三、 DNS 解析(核心):
很多新手打开 DNS 后台,看到十几种记录类型直接懵了。其实对于个人博客或团队网站(比如你要给“镜月”汉化组搭个展示官网),你只需要掌握两个概念和一套公式。
1. 主机记录(前缀)
这决定了访客用什么具体网址访问你:
@:裸域名。比如填@,访客直接输入tskym.net就能访问。www:标准子域名。访客输入www.tskym.net访问。自定义:比如你填
mail,出来的就是mail.tskym.net;填api,就是api.tskym.net。
2. 记录类型(指向哪里)
A 记录:最常用。把域名直接指向一个 IP 地址(纯数字)。
CNAME 记录:别名。把域名指向另一个域名(套 CDN 必用)。
TXT 记录:不产生访问,用于验证身份。比如 Google 站长工具验证。
MX 记录:邮件专用。假如你要搭一个专属的邮局系统,处理类似
admin@yachiyo.us这样的邮件收发,并在系统中拦截诸如yachiyo、Kaguya、Iroha等特定 ID 的注册,就需要配置 MX 记录指向你的邮件服务器。
3. 建站标准解析(不套 CDN 时)
4. 致命踩坑点:TTL(缓存存活时间)
TTL 决定了 DNS 服务器多长时间来更新一次你的记录。
调试期(频繁换 IP): 可以把 TTL 改到最小(如 60 秒 / 1 分钟)。否则你填错了改回来,自己电脑上的缓存还没刷新,会一直以为网站挂了。
稳定期: 改为 1 小时或自动。
5. 命令行排障
不要在浏览器里狂按 F5 刷新。连上你的 Debian/Arch 终端,用底层命令查:
# 检查某域名的 A 记录是否生效(查 IP)
# 这里用本站域名tskym.net演示 实际操作请改为自己等等域名
dig tskym.net A +short
# 检查域名的 CNAME 是否生效
dig www.tskym.net CNAME +short
# 最简单的连通性测试
ping tskym.net
如果 dig 出来的 IP 已经是你新填的 IP,说明 DNS 已经通了。网页打不开,可能是 Nginx 或源站防火墙的问题,不用再去改 DNS!
四、 CDN(内容分发网络):以 Cloudflare 为例 【可选】
CDN 就是在全球各地建前置仓库。如果不套 CDN,全国访客都要去你的甲骨文云拉取 5MB 的高清图片,网站加载需要十几秒。套上 CDN,访客直接从所在城市的节点拿图片,实现“秒开”。
个人站直接白嫖 Cloudflare(CF)即可。
1. 接入 CF 的标准流程
在 Cloudflare 注册账号,添加你的网站。
CF 会生成两个名称服务器(Nameserver,比如
olivia.ns.cloudflare.com)。去你买域名的地方,把默认 DNS 改为 CF 提供的这两个。
回到 CF 的 DNS 列表,添加你的 A 记录,把旁边的“小黄云”点亮(Proxied 代理模式)。
2. 无限重定向报错 (ERR_TOO_MANY_REDIRECTS) 解决方法
套上 CDN 后网站打不开,90% 是因为 SSL 模式冲突。
原理: 如果你源站的 Nginx 已经配置了 SSL 证书(能用 HTTPS),但 CF 后台的加密模式选了“灵活 (Flexible)”,CF 到源站就会降级成 HTTP,导致源站要求 HTTPS,CF 又用 HTTP 请求,形成无限死循环重定向。
解决方法: 进入 CF 后台 -> 左侧
SSL/TLS->概述-> 强制选择“完全 (Full)” 或 “完全 (严格)”。
3. 缓存规则 (Cache Rules):别把后台也缓存了
CDN 默认只缓存图片、CSS、JS。但如果你一顿乱配,把 HTML 页面也强缓存了,会导致你发布了新文章,前台看还是没有,甚至直接登不进管理后台。
解决方法: 进入 CF 左侧 缓存 (Caching) -> Cache Rules -> 创建规则。 选择 URI 路径 -> 包含 -> 填入你不需要缓存的动态路径。 例如:排除管理后台
(http.request.uri.path contains "/admin/") or
(http.request.uri.path contains "/login")
缓存行为选择:绕过缓存 (Bypass cache)。
五、 源站防护:只允许 CDN 访问 【可选】
一旦套了 CDN,你真正的源站 IP 就应该隐藏起来。如果攻击者扫描到了你的真实 IP,直接绕过 CDN 攻击你,CF 的防护可以说就没有用了。
1. Nginx 获取访客真实 IP
由于流量全经过 CF,Nginx 日志里看到的访问 IP 全是 CF 的节点 IP。必须在 Nginx 配置中还原真实 IP。
解决方法: 打开你的 Nginx 配置文件(如 /etc/nginx/nginx.conf),在 http {} 块中加入以下 CF 官方 IP 段清单:
# 信任 Cloudflare 的 IPv4 和 IPv6 节点段
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
# 从 CF-Connecting-IP 请求头中获取真实用户 IP
real_ip_header CF-Connecting-IP;
配置完成后执行 nginx -s reload。现在你的网站日志记录的就是用户的真实 ip 了。
2. 防火墙 (iptables) 阻断直连
为了彻底防止源站 IP 暴露被 D,我们可以在 Debian 服务器的系统层面,通过 iptables 或 UFW 配置防火墙:只允许 Cloudflare 的 IP 访问本机的 80 (HTTP) 和 443 (HTTPS) 端口,丢弃所有其他人的直接访问。
以 UFW 为例的实操命令:
# 1. 默认拒绝所有进入端口 80/443 的流量
ufw deny 80
ufw deny 443
# 2. 编写脚本批量放行 CF 的 IP 段 (新建一个 bash 脚本 cf_ufw.sh)
#!/bin/bash
for i in `curl -s https://www.cloudflare.com/ips-v4`; do ufw allow from $i to any port 80,443 proto tcp; done
for i in `curl -s https://www.cloudflare.com/ips-v6`; do ufw allow from $i to any port 80,443 proto tcp; done
# 3. 运行脚本并重启 UFW
bash cf_ufw.sh
ufw reload
评论