域名是 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 | dig +short example.com A |
第一条应该返回服务器 IP,第二条应该返回 example.com。如果本地缓存还没过期,可以指定公共 DNS 再查一次:
1 | dig @1.1.1.1 +short example.com A |
这一步我踩了一个坑:注册商默认还留着一条老的 A 记录,指向一个已经释放的 IP。dig 返回了两条结果,浏览器有时能打开、有时不能。删掉旧记录之后,解析才稳定下来。
Nginx 的最小配置
服务器上已经装了 Nginx。我新建了一个站点配置,没有直接改默认文件:
1 | server { |
写完后先做语法检查,再重载:
1 | sudo nginx -t |
nginx -t 通过只说明配置语法没问题,不说明请求能到后端。所以我又用 curl 从服务器本机测了一遍:
1 | curl -I 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 | dig +short example.com A |
这五条命令覆盖了解析、入口、Host 匹配、配置语法和端口监听。后来每次改 Nginx 或换 IP,我都会按顺序跑一遍。
这次搭建没有用到什么高级技巧,配置加起来不到三十行。但它让我第一次完整地理解了“一个域名如何变成一台机器上的一个服务”。后面加 HTTPS、加缓存、加 CDN,都是在这条路径上继续加东西,而不是重新造一条路。