域名是 2025 年买的,之后一直停在注册商的默认解析页。博客能打开,靠的是直接访问 IP。这种状态持续了很久,因为“配域名”听起来像一件顺手就能做完的小事,而小事通常会被拖到出问题才做。

真正让我动手的,是证书。没有域名就没法申请受信任的 HTTPS 证书,浏览器会一直提示不安全。于是我挑了一个周末,把从解析到反向代理的整条路径走了一遍,并要求自己每一步都留下可验证的结果。

先把路径画出来

动手之前,我在纸上画了一条线:

1
浏览器 → DNS 解析 → 服务器公网 IP → Nginx:80 → 后端服务:3000

这条线看起来简单,但每一段都可能断。DNS 没生效、安全组没放行、Nginx 没监听、后端没启动、Host 头不对,现象都是“打不开”,排查时必须能分段确认。

我给自己定了顺序:先让 IP 能访问,再让域名能访问,最后让域名经过反向代理访问。每一步都单独验证,避免几个问题叠在一起。

A 记录与 CNAME

在域名控制台里,我加了两条记录:

  • @ 指向服务器公网 IP,类型 A,TTL 600;
  • www 指向 @,类型 CNAME,TTL 600。

TTL 没有设得太短。600 秒对我来说已经足够快,太短会增加解析次数,也没有实际收益。

加完之后我没有立刻打开浏览器,而是先用 dig 确认权威结果:

1
2
dig +short example.com A
dig +short www.example.com CNAME

第一条应该返回服务器 IP,第二条应该返回 example.com。如果本地缓存还没过期,可以指定公共 DNS 再查一次:

1
dig @1.1.1.1 +short example.com A

这一步我踩了一个坑:注册商默认还留着一条老的 A 记录,指向一个已经释放的 IP。dig 返回了两条结果,浏览器有时能打开、有时不能。删掉旧记录之后,解析才稳定下来。

Nginx 的最小配置

服务器上已经装了 Nginx。我新建了一个站点配置,没有直接改默认文件:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name example.com www.example.com;

location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

写完后先做语法检查,再重载:

1
2
sudo nginx -t
sudo systemctl reload nginx

nginx -t 通过只说明配置语法没问题,不说明请求能到后端。所以我又用 curl 从服务器本机测了一遍:

1
2
curl -I http://127.0.0.1
curl -I -H 'Host: example.com' http://127.0.0.1

第一条测的是 Nginx 是否在监听,第二条测的是这个 server_name 是否被匹配到。

踩到的四个坑

第一个坑是 default_server 冲突。 默认站点也监听 80,并且带 default_server,请求没有匹配到我的 server_name 时,会落到默认站点。表现是域名打开后看到一个欢迎页。解决方式是删掉默认站点,或者明确让我的配置成为默认。

第二个坑是 Host 头。 最开始我只写了 proxy_pass,没有传 Host。后端生成的绝对链接指向 127.0.0.1:3000,页面能打开,但静态资源和跳转都错了。加上 proxy_set_header Host $host; 之后才正常。

第三个坑是 IPv6。 我给域名配了 A 记录,但服务器有 AAAA 记录,浏览器优先走 IPv6,而防火墙没有放行。表现是“有些网络能开,有些不能”。后来要么补齐 IPv6 监听,要么删掉 AAAA 记录,我选择了后者,因为暂时用不上。

第四个坑是安全组。 本机 curl 正常,外网打不开,最后发现云控制台的安全组只放行了 22 端口。80 和 443 是后来单独加的。

验证比配置重要

整条路径跑通之后,我留了一个简单的检查清单:

1
2
3
4
5
dig +short example.com A
curl -I http://example.com
curl -I -H 'Host: example.com' http://127.0.0.1
sudo nginx -t
sudo ss -lntp | grep -E ':80|:443'

这五条命令覆盖了解析、入口、Host 匹配、配置语法和端口监听。后来每次改 Nginx 或换 IP,我都会按顺序跑一遍。

这次搭建没有用到什么高级技巧,配置加起来不到三十行。但它让我第一次完整地理解了“一个域名如何变成一台机器上的一个服务”。后面加 HTTPS、加缓存、加 CDN,都是在这条路径上继续加东西,而不是重新造一条路。