← 笔记 leixuhang.me
2026-10-22 · 8 MIN · 运维

域名迁出国内:备案卡住之后,我用一台境外服务器解决了

九月底买了个 .me 域名,想着搭个自己的站。域名解析加了,服务器也开好了,结果浏览器一打开 —— 空白。折腾了两个小时才搞清楚,问题不在我配错,在一个我一开始完全没考虑的地方。

问题:域名和服务器在同一家,但就是打不开

当时的情况是:

用 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 橙云重新打开,以及开橙云之后证书模式要改成 Full (strict)。