服务器怎么绑定域名

结论: 服务器绑定域名只需五步:在域名解析商处添加一条 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
记录类型AAA 记录指向 IPv4;IPv6 需填 AAAA
记录值203.0.113.10203.0.113.10填服务器公网 IP,多个 IP 可加多条做轮询
TTL600 秒600 秒缓存有效期,调试期可先设 60 秒
bash
# 先在服务器上确认自己的公网 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 的分水岭。

bash
# 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:

nginx
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;
}

然后启用站点并重载配置:

bash
# 建站点目录与测试页
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 nginx

nginx -t 必须输出 syntax is ok 与 test is successful 才能重载。若提示 server_name 冲突,说明已有另一个配置块占用了同名域名。CentOS Stream 9 等没有 sites-enabled 目录的系统,直接把配置写进 /etc/nginx/conf.d/example.com.conf 即可。

第四步:放行 80 与 443 端口

结论:端口要在两个地方同时放行——云平台安全组和服务器系统防火墙,少任何一个都不通。 这是新手第二高频的卡点。

bash
# ===== 系统防火墙: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 出错。

bash
# 本机验证:强制指定 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,多半是安全组或备案拦截。

常见误区 / 排错提示

  1. 以为填了 A 记录就完事,没有配 Nginx server_name:结果访问域名显示 Nginx 欢迎页。DNS 只负责指路,站点匹配必须靠 server_name。
  2. A 记录填成了服务器内网 IP:ip addr 看到的 10.x / 172.x / 192.168.x 是内网地址,外网无法路由,必须在云控制台查公网 IP。
  3. 只改系统防火墙,忘了云平台安全组:两边是串联关系,任意一边拦截都不通,且安全组优先级更高。
  4. 国内服务器未备案就死磕 80 端口:排查半天 DNS 和 Nginx 都没问题,实际是备案拦截。可以先用 8080 端口验证链路。
  5. 改完 TTL 立刻刷新,判定"没生效":旧记录在各地 DNS 里缓存着,最长需等一个旧 TTL 周期,急也没用。
  6. nginx -s reload 之前没跑 nginx -t:配置有语法错误时,reload 会让 Nginx 加载失败并可能中断服务。