← 返回技术笔记

服务器与网络 / 2026-07-22

从 DNS 到 HTTPS:在 Ubuntu 24.04 上部署一个可验证的 Nginx 站点

从完整访问链路出发,连接域名解析、IPv4/IPv6、Nginx、SSL 与外部验证;目标不只是“能打开”,而是知道每一层是否生效、失败时如何回退。

验证环境Ubuntu 24.04 · Nginx 1.28.0
最后验证2026-07-22
难度中级
风险
技术环境会变化。操作前请核对版本、备份数据,并为线上服务准备回滚方案。

目标与访问链路

一次 HTTPS 访问至少会经过:域名解析、客户端网络、IPv4 或 IPv6 路由、防火墙、Nginx 监听、证书选择和站点文件。任何一层失败,浏览器看到的现象都可能只是“打不开”。

这篇笔记的目标是建立一个可验证的路径:每完成一层,就留下一个独立检查方法。不要同时修改 DNS、防火墙和 Nginx;一次只改变一个变量,才能知道结果来自哪里。

部署前检查

先记录当前状态,特别是已经在线的服务器。以下命令只用于读取信息:

bash
ip -brief address
ss -lntp
nginx -T

确认四件事:

  • 域名控制权在自己手中;
  • 服务器拥有可用的公网 IPv4、IPv6,或已经规划好反向代理入口;
  • TCP 80 与 443 在主机防火墙、云安全组和上游路由中都可达;
  • 现有 Nginx 配置已经备份,且知道如何恢复。

不要因为本机可以访问,就认为公网一定可达。验证时至少使用另一条网络,例如手机流量。

配置 DNS

为 IPv4 配置 A 记录,为 IPv6 配置 AAAA 记录。两者可以同时存在,但只有在 IPv6 链路真正可用时才发布 AAAA;错误的 AAAA 可能让部分客户端优先走向一条失败路径。

等待解析生效后,分别检查:

bash
dig A yaang.cloud +short
dig AAAA yaang.cloud +short

DNS 只回答“域名指向哪里”,不会证明目标端口已经开放,也不会证明 Nginx 返回了正确站点。

建立最小 HTTP 站点

先准备独立目录,并让部署用户拥有文件、Nginx 只负责读取:

bash
sudo install -d -m 0755 /var/www/yaang/current

一个最小的 Nginx 站点可以从下面开始:

nginx
server {
    listen 80;
    listen [::]:80;
    server_name yaang.cloud www.yaang.cloud;

    root /var/www/yaang/current;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

启用配置前先测试语法:

bash
sudo nginx -t
sudo systemctl reload nginx

reload 会让 Nginx 重新读取配置;如果语法检查失败,不要强行重启。此时可在服务器本机使用带 Host 头的请求验证虚拟主机,而不必等待 DNS:

bash
curl -I -H 'Host: yaang.cloud' http://127.0.0.1/

部署证书与 HTTPS

证书应覆盖实际使用的主机名,并由自动化 ACME 客户端负责续期。证书与私钥路径由所选客户端决定,不要把私钥复制进网站目录或代码仓库。

HTTPS 站点的核心结构如下:

nginx
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name yaang.cloud www.yaang.cloud;

    root /var/www/yaang/current;
    index index.html;

    ssl_certificate     /path/to/fullchain.pem;
    ssl_certificate_key /path/to/private-key.pem;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    listen [::]:80;
    server_name yaang.cloud www.yaang.cloud;
    return 308 https://$host$request_uri;
}

完成后再次执行 nginx -t,通过后再 reload。证书续期任务还需要一次演练,确保更新证书后服务会安全地重新加载。

分层验证

不要只看浏览器图标。分别验证 IPv4、IPv6、响应头和证书:

bash
curl -4 -I https://yaang.cloud/
curl -6 -I https://yaang.cloud/
openssl s_client -connect yaang.cloud:443 -servername yaang.cloud </dev/null

再从外部网络检查:

  • HTTP 是否按预期跳转到 HTTPS;
  • 证书主机名、有效期和证书链是否正确;
  • IPv4 与 IPv6 是否都返回同一个站点;
  • 不存在的路径是否返回 404,而不是意外落到其他虚拟主机;
  • Nginx access log 与 error log 是否出现异常。

常见断点

解析正确但连接超时:优先检查安全组、主机防火墙、上游端口映射和运营商入站限制。

IPv4 正常、IPv6 失败:检查 AAAA 记录、服务器 IPv6 地址、默认路由、防火墙规则以及 Nginx 的 [::]:443 监听。

返回了错误站点:检查 server_name、配置加载顺序与默认虚拟主机,不要只改网页文件。

证书不匹配:确认请求携带的主机名、证书 SAN,以及对应虚拟主机使用的证书路径。

回滚

上线前保留:旧站点目录、旧 Nginx 配置、证书路径和一份 nginx -T 输出。出现问题时,恢复上一份已验证配置,执行 nginx -t,通过后 reload;如果只是内容故障,可把 current 切回上一版静态目录。

最终标准不是“配置写完”,而是每条路径都有可重复的验证结果,并且知道如何回到修改前的状态。