域名迁出国内:备案卡住之后,我用一台境外服务器解决了
九月底买了个 .me 域名,想着搭个自己的站。域名解析加了,服务器也开好了,结果浏览器一打开 —— 空白。折腾了两个小时才搞清楚,问题不在我配错,在一个我一开始完全没考虑的地方。
问题:域名和服务器在同一家,但就是打不开
当时的情况是:
- 域名在境内注册商买下,已通过实名
- A 记录指向阿里云 ECS 的公网 IP
- ECS 上 nginx 正常跑着,
curl 127.0.0.1返回 200
用 IP 访问完全正常,用域名访问就是不行。
原因很简单:中国大陆的服务器,用域名通过 80/443 对外提供网站服务,域名必须完成 ICP 备案。
这不是阿里云自己加的规则,是工信部的规定。未备案的域名解析到境内服务器,访问会被拦截。所以域名和服务器都正常,但它们之间的这条链路被掐断了。
几条路,以及为什么选了这条
| 方案 | 代价 | 结论 |
|---|---|---|
| 去备案 | 7~20 个工作日,要身份证、核验、备案服务号 | 可以,但等不起 |
| 不用域名,只用 IP | 地址难记,没法上 HTTPS(证书只签域名) | 能用,但没意思 |
| 换成境外服务器 | 延迟变高,要重新部署 | 选了这条 |
境外服务器不需要备案 —— 备案管的是「境内服务器 + 域名」这个组合。域名解析到境外机器,走的是国际链路,不需要走备案流程。
手上正好有一台境外的实例(悉尼),2 核 2G。延迟大概 150~250ms,对静态站完全够用。
动手:三件事
1. 改 DNS
这里第一个坑就来了:域名的 NS 早就托管在 Cloudflare 上了,但 Cloudflare 面板一直显示「正在等待注册机构传播新的名称服务器」。
我差点因为这个提示去等 24 小时。后来直接查权威 DNS 才发现:
$ nslookup -type=NS leixuhang.me 1.1.1.1
leixuhang.me nameserver = coraline.ns.cloudflare.com
leixuhang.me nameserver = kellen.ns.cloudflare.com
NS 早就生效了,是 Cloudflare 自己的状态检测没刷新。点一下面板上的「立即检查名称服务器」就好,或者干脆不管它,直接去改记录。
A 记录改成新服务器的 IP,主域名和 www 两条都改。
代理状态建议先关掉(灰云 / DNS only)。橙云开着的时候,后面申请证书的验证请求会先打到 Cloudflare 节点,容易出岔子。签完证书想开 CDN 再开。
2. 配 nginx
Ubuntu 装 nginx 之后,/etc/nginx/sites-enabled/default 会占着 80 端口。我直接删掉它,新建自己的配置:
server {
listen 80;
listen [::]:80;
server_name leixuhang.me www.leixuhang.me;
location /.well-known/acme-challenge/ {
root /var/www/leixuhang;
}
location / {
return 301 https://$host$request_uri;
}
}
注意那个 /.well-known/acme-challenge/ 的例外 —— 后面自动续期要靠它。如果 80 全部 301 跳走,续期会失败。这个坑很多人踩。
3. 签证书
Let's Encrypt,用 webroot 模式:
sudo apt install certbot
sudo certbot certonly --webroot -w /var/www/leixuhang \
-d leixuhang.me -d www.leixuhang.me \
--non-interactive --agree-tos --register-unsafely-without-email
几秒钟就下来了,证书存在 /etc/letsencrypt/live/leixuhang.me/。
然后把 443 的配置加上,两个容易错的地方:
一是 http2 的写法。网上很多教程写 http2 on;,那是 nginx 1.25.1 之后才有的语法。Ubuntu 24.04 源里的 nginx 是 1.24,必须用老写法:
listen 443 ssl http2;
二是 ssl_stapling。加上之后 nginx 会一直报警告:
"ssl_stapling" ignored, no OCSP responder URL in the certificate
原因是 Let's Encrypt 从 2025 年起逐步停用 OCSP,新签的证书里不再带 OCSP 地址。所以这两行直接删掉就行,不是配置错误。
最后一个坑,也是最误导人的一个
配完之后测 www 子域,返回 000,连接失败。主域名却是 200。
同一个 IP、同一个 443 端口,一个能连一个不能?这不合逻辑。
用 curl -v 看详细过程才找到原因:
* Uses proxy env variable https_proxy == 'http://127.0.0.1:51082'
* CONNECT tunnel failed, response 502
是我本机的 curl 走了代理,代理连不上 www,返回了 502。服务器一点问题都没有。
绕开代理再测:
curl --noproxy '*' https://www.leixuhang.me/
200,一切正常。
教训:测国外站点的连通性时,如果莫名返回 000 或 502,先排除本地代理的影响。我之前已经因为这个问题误判过一次服务器故障。
结果
https://leixuhang.me 200 TLS 1.3 HSTS
https://www.leixuhang.me 200 TLS 1.3
http://leixuhang.me 301 → https
证书到期日 2027-01-20,certbot.timer 会自动续期,到期前 30 天重签,不需要人管。
总结
- 境内服务器 + 域名 = 必须备案,绕不过去,别信什么非标端口
- 境外服务器不需要备案,代价是延迟
- Cloudflare 面板的状态提示可能滞后,判断 NS 是否生效要直接查权威 DNS
- 80 端口必须给
/.well-known/acme-challenge/留一个例外,否则证书续不了 - nginx 1.24 不支持
http2 on;,要用listen 443 ssl http2; - 测国外站连不上时,先查自己的代理
下次想起来可以补:怎么把 Cloudflare 橙云重新打开,以及开橙云之后证书模式要改成 Full (strict)。