结论: 服务器绑定域名只需五步:在域名解析商处添加一条 A 记录指向服务器公网 IP → 用 dig +short 确认解析生效 → 在 Nginx 站点配置里写 server_name 你的域名 → 放行服务器 80/443 端口 → 用 curl -I 验证能返回 200。其中最容易漏掉的是云平台安全组放行和国内服务器的 ICP 备案。
域名和服务器是两件独立购买的东西,它们之间没有任何天然联系。买完域名、租好服务器之后,必须显式地告诉全世界"这个域名对应这台机器",这个过程就叫绑定域名(技术上称为域名解析,DNS Resolution)。很多新手卡在这一步,往往不是操作复杂,而是漏掉了某个环节:DNS 改了但 Nginx 没配,或者都配好了但安全组没放行端口。本文只讲"让网站能通过域名访问"的最小闭环,不涉及 MX 邮件记录、TXT 验证、泛解析等进阶内容。
绑定域名前需要准备什么?
结论:三样东西缺一不可——一个已实名认证的域名、一台有独立公网 IP 的服务器、以及(国内服务器)一个已完成的 ICP 备案。 任何一样缺失,后面步骤做得再标准也访问不了。
- 域名:在阿里云万网、腾讯云 DNSPod、Cloudflare、Namesilo 等注册商处购买,且已完成实名认证。未实名的域名会被注册商暂停解析(Serverhold 状态)。
- 服务器公网 IP:在云控制台的实例详情里查看,必须是公网 IP。以
10.、172.16~31.、192.168.开头的都是内网 IP,填进 A 记录会导致外网永远解析不到。 - Web 服务已安装:服务器上应已安装 Nginx 1.26(或 Apache),能在浏览器里用
http://公网IP打开默认页。
国内服务器必须先完成 ICP 备案
这是国内场景最容易踩的坑,且往往最后才被发现。若服务器位于中国大陆,域名必须完成 ICP 备案,否则云厂商会在网络层拦截 80/443 端口的入站请求,表现是:DNS 解析完全正常、ping 能通,但浏览器访问一直转圈或直接连接被重置。
- 备案是在服务器所属的云服务商处提交(阿里云服务器就在阿里云备案),周期通常为 7~20 个工作日,期间需要幕布拍照与短信核验。
- 备案主体需与域名所有者一致,个人备案不能用于经营性网站。
- 香港、新加坡、美国等境外服务器无需备案即可用 80 端口,但大陆访问延迟与稳定性会差一些。
- 备案未下号期间想调试,可临时用非 80 端口(如 8080)访问:
http://域名:8080。
第一步:在域名解析商处添加 A 记录
结论:绑定域名的本质就是添加一条 A 记录(Address Record),把域名指向 IPv4 地址。 绝大多数场景加两条就够了:一条主机记录为 @,一条为 www。
A 记录各个字段的含义如下,照着填即可:
| 字段 | 根域名写法 | www 写法 | 说明 |
|---|---|---|---|
| 主机记录 | @ | www | @ 代表裸域名本身,如 example.com |
| 记录类型 | A | A | A 记录指向 IPv4;IPv6 需填 AAAA |
| 记录值 | 203.0.113.10 | 203.0.113.10 | 填服务器公网 IP,多个 IP 可加多条做轮询 |
| TTL | 600 秒 | 600 秒 | 缓存有效期,调试期可先设 60 秒 |
# 先在服务器上确认自己的公网 IP(任选一条)
curl -s ifconfig.me
curl -s ip.sb
ip addr show eth0 | grep 'inet '需要注意,如果域名注册商和 DNS 解析商不是同一家(例如域名在 Namesilo 买、解析托管到 Cloudflare),则必须先在注册商后台把 NS 记录改成解析商提供的地址,再在解析商处添加 A 记录,否则 A 记录写了也不会生效。NS 的修改生效通常要 24~48 小时。
第二步:验证解析是否已经生效
结论:用 dig +short 你的域名 查看返回的 IP,若等于服务器公网 IP 即解析成功。 不要凭感觉等,一定要实测,这是判断问题出在 DNS 还是出在 Nginx 的分水岭。
# Linux / macOS:最简洁的验证方式
dig +short example.com
# 指定公共 DNS 查询,排除本地运营商缓存干扰
dig +short example.com @8.8.8.8
dig +short example.com @223.5.5.5 # 阿里公共 DNS
# Windows(PowerShell / CMD)
nslookup example.com
nslookup example.com 8.8.8.8
# 查看完整解析过程与 TTL 剩余时间
dig example.com A +noall +answer判断标准有三条:
- 返回空:解析记录没建好,或 NS 未生效,回到第一步检查。
- 返回的 IP 不是你的服务器:填错了 IP,或本地 DNS 仍有旧缓存。
- 返回多个 IP:说明存在历史记录或开启了负载均衡,需清理多余记录。
TTL 与生效时间:为什么有人几分钟生效有人要等一天
DNS 是层层缓存的系统。TTL(Time To Live)表示一条记录允许被递归 DNS 服务器缓存的秒数。修改 A 记录后,最长需要等待"旧记录的 TTL"才会全球刷新完毕,也就是常说的 10 分钟到 24 小时不等。
- 本地操作系统也会缓存:
sudo systemd-resolve --flush-caches(Linux)、ipconfig /flushdns(Windows)可强制刷新本机。 - 运营商 Local DNS 的缓存不受你控制,所以部分地区"已生效"、部分地区"没生效"是正常现象。
- 计划迁移服务器时,建议提前把 TTL 调到 60 秒,等旧 TTL 过期后再改 IP,能把切换中断时间压到 1 分钟内。
第三步:在 Nginx 上配置 server_name
结论:DNS 只是把用户送到这台机器,真正决定"这个域名返回哪个网站"的是 Nginx 的 server_name 指令。 不配这一步,请求会落到 Nginx 的默认站点,你看到的会是"Welcome to nginx"而不是自己的页面。
在 Ubuntu 24.04 上新建站点配置文件 /etc/nginx/sites-available/example.com:
server {
listen 80;
listen [::]:80;
# 绑定域名:根域名与 www 写在同一行,用空格分隔
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example.access.log;
error_log /var/log/nginx/example.error.log;
}然后启用站点并重载配置:
# 建站点目录与测试页
sudo mkdir -p /var/www/example.com
echo "Domain binding OK
" | sudo tee /var/www/example.com/index.html
# 建立软链接启用站点(Debian/Ubuntu 约定)
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# 校验语法并平滑重载(reload 不断连接,restart 会断)
sudo nginx -t && sudo nginx -s reload
# 等价写法:sudo nginx -t && sudo systemctl reload nginxnginx -t 必须输出 syntax is ok 与 test is successful 才能重载。若提示 server_name 冲突,说明已有另一个配置块占用了同名域名。CentOS Stream 9 等没有 sites-enabled 目录的系统,直接把配置写进 /etc/nginx/conf.d/example.com.conf 即可。
第四步:放行 80 与 443 端口
结论:端口要在两个地方同时放行——云平台安全组和服务器系统防火墙,少任何一个都不通。 这是新手第二高频的卡点。
# ===== 系统防火墙:Ubuntu / Debian(ufw)=====
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
sudo ufw status numbered
# ===== 系统防火墙:CentOS Stream 9 / Rocky Linux 9(firewalld)=====
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
# 确认 Nginx 确实在监听
sudo ss -lntp | grep -E ':80|:443'系统防火墙放行后,还要登录云控制台,在实例的安全组 / 防火墙规则里添加入站规则:协议 TCP、端口 80 与 443、来源 0.0.0.0/0。若服务器在国内且域名没备案,这一层的 80 端口会被云厂商直接拦截,与安全组配置无关。
第五步:访问验证
结论:先在本机用 curl -I 验证,再从外网浏览器访问,两层都通过才算真正绑定成功。 只在本机测会漏掉安全组问题,只在浏览器测则无法区分是 Nginx 还是 DNS 出错。
# 本机验证:强制指定 Host 头,直接命中目标 server_name
curl -I -H "Host: example.com" http://127.0.0.1
# 走 DNS 解析的验证(返回 HTTP/1.1 200 OK 即成功)
curl -I http://example.com
# 只看解析出来的 IP,确认与服务器一致
curl -s -o /dev/null -w "remote_ip=%{remote_ip}\n" http://example.com预期结果:HTTP/1.1 200 OK。若返回 301/302,说明配置了跳转,跟随一次即可:curl -IL http://example.com。若出现 Connection refused,是端口未放行或 Nginx 没启动;出现 Connection timed out,多半是安全组或备案拦截。
常见误区 / 排错提示
- 以为填了 A 记录就完事,没有配 Nginx
server_name:结果访问域名显示 Nginx 欢迎页。DNS 只负责指路,站点匹配必须靠server_name。 - A 记录填成了服务器内网 IP:
ip addr看到的10.x/172.x/192.168.x是内网地址,外网无法路由,必须在云控制台查公网 IP。 - 只改系统防火墙,忘了云平台安全组:两边是串联关系,任意一边拦截都不通,且安全组优先级更高。
- 国内服务器未备案就死磕 80 端口:排查半天 DNS 和 Nginx 都没问题,实际是备案拦截。可以先用 8080 端口验证链路。
- 改完 TTL 立刻刷新,判定"没生效":旧记录在各地 DNS 里缓存着,最长需等一个旧 TTL 周期,急也没用。
nginx -s reload之前没跑nginx -t:配置有语法错误时,reload 会让 Nginx 加载失败并可能中断服务。
企业QQ咨询




