Nginx 网站部署:从本机 HTTP 到域名与 HTTPS 验证

公开 Nginx 网站,必须让内容路径、监听端口、防火墙、域名系统(DNS)和传输层安全协议(TLS)配置相互匹配。先通过本机 HTTP 验证页面,再测试远程连接与真实域名,最后配置并验证 HTTPS。

连接失败时按网络分层排障检查,开放服务前先核对防火墙与账号保护。Nginx 与证书工具的版本由软件源决定,应以本机安装版本和发行版文档为准。

参考环境为常规安装的 Ubuntu 26.04 LTS 或 Rocky Linux 9 系列虚拟机;容器、WSL 和其他版本的服务与软件包配置可能不同。先按虚拟机环境准备(英语)记录版本,并准备控制台恢复。

准备服务器、域名与访问条件

准备实验用 Ubuntu 或 Rocky Linux 服务器、sudo 账号和控制台恢复入口。linux-course.test 仅用于本地测试,不应当作公共 DNS 中的实际域名。公开服务时换成自己控制的真实域名;处于网络地址转换(NAT)环境时,还需检查端口转发、路由器外部地址和运营商限制。

先查询 80、443 端口是否已由其他服务占用,同时核对系统。不要为安装练习而停止无关服务:

sudo ss -lntp
cat /etc/os-release

按发行版安装 Nginx

Ubuntu 使用第一组命令,Rocky Linux 使用第二组,不能连续执行两组。阅读拟进行的软件包变更,遵循本机软件源策略,并逐条确认成功。保留现有站点,通过单独的 server 配置块增加练习站点,不要批量删除默认配置。

sudo apt update
sudo apt install nginx curl
sudo systemctl enable --now nginx
sudo dnf install nginx curl
sudo systemctl enable --now nginx

创建独立文档根目录和完整配置

先检查下面的文档目录和配置文件路径;若已有资料,备份并换用另一组练习路径及对应配置。静态页面放在 /var/www/linux-course,让服务进程能读取文件。示例假设软件包的 nginx.conf 已包含 conf.d 下的 .conf 文件;若不符合,应先查清实际 include 结构。

以下命令会写入页面和配置文件,请逐条执行并检查结果。任一步失败就停止排查,不能只看最后一条语法检查。单引号包围的 EOF 可避免 shell 提前展开配置中的 $uri。

sudo install -d -m 755 /var/www/linux-course
printf '<!doctype html><html lang="en"><meta charset="utf-8"><title>Linux course</title><h1>Linux course server works</h1></html>\n' | sudo tee /var/www/linux-course/index.html
sudo chmod 644 /var/www/linux-course/index.html
sudo tee /etc/nginx/conf.d/linux-course.conf > /dev/null <<'EOF'
server {
    listen 80;
    server_name linux-course.test;
    root /var/www/linux-course;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}
EOF
sudo nginx -t

代码里的 h1 属于实验服务器提供的独立 HTML 页面,不是这篇 WordPress 文章的标题。仅当nginx -t 配置检查成功后,才执行下面的 reload;失败时根据报错中的文件和行号修正并重查,避免用错误配置重启仍在工作的服务。

sudo systemctl reload nginx
curl -i --resolve linux-course.test:80:127.0.0.1 http://linux-course.test/

应看到 HTTP 200 和 Linux course server works。示例页面保留英文,便于与命令的预期响应逐字对照。curl --resolve 为指定主机与端口提供本次请求的地址映射,不修改系统 DNS。若客户端配置了代理,先核对实际请求路径,不能假定一定直连回环地址。

若得到默认页面,检查请求的 Host 名、server_name 与实际加载的配置;Nginx 会根据监听地址、端口和 Host 选择站点。语法检查通过,也不等于请求已经命中正确的 server 配置块。

区分文件访问权限与网络开放

Rocky Linux 启用安全增强 Linux(SELinux)时,用 ls -Zd /var/www/linux-course 查看标签。符合默认策略的路径可用 sudo restorecon -Rv /var/www/linux-course 恢复标签;自定义路径可能还需要持久标签策略。不要为解决 HTTP 403 而关闭 SELinux,或把整条路径权限改成 777。

本机响应验证通过后,按所需来源范围允许 HTTP 的 80/tcp,稍后允许 HTTPS 的 443/tcp。UFW 可增加具体端口规则;firewalld 应在实际 zone 中先试运行 http、https 规则,再只把已验证的相应规则保存为永久配置。另行核对云端过滤,并保留 SSH 管理入口。

从另一台计算机向实际服务器地址发送带有 Host: linux-course.test 的 HTTP 请求,核对是否得到相同页面。本机成功而远程失败时,检查绑定地址、过滤、路由及 NAT;已经得到 HTTP 错误响应时,继续检查站点、资源路径或应用层,不要只反复修改防火墙。

配置真实域名和 HTTPS

  1. 将实际域名的 A、必要时的 AAAA 记录指向预期公网地址。不提供 IPv6 服务就不要发布不可用的 AAAA;示例的 listen 80 也不能当作已经完成 IPv6 监听验证。
  2. 把 server_name 改为实际域名,执行 nginx -t,通过后 reload;从另一网络按域名验证 HTTP。
  3. 在Certbot 官方安装指南选择对应系统与 Nginx 的安装方式。Ubuntu 的软件包方式可用 sudo apt install certbot python3-certbot-nginx,其他发行版应先确认软件源要求,避免混用安装方式。
  4. 备份 Nginx 配置,确认域名控制权与所需端口可达后,用 sudo certbot --nginx -d ACTUAL_DOMAIN 申请并安装证书。将 ACTUAL_DOMAIN 换成自己控制的真实域名;插件可能修改站点配置,应检查修改结果。
  5. 验证 HTTPS 证书的主机名、证书链、有效期及重定向,再用 sudo certbot renew --dry-run 测试续期,并确认本安装方式的自动续期任务已配置。

HTTP-01 域名验证需要从互联网通过 80 端口到达相应站点;被限制时可选择受支持的 DNS 验证等方法。443 端口用于正常 HTTPS 服务,不能替代 HTTP-01 的 80 端口验证。续期 dry-run 通常使用测试服务器,不代表正式证书已经续期;安装方式及自定义配置会影响行为。

完成本地练习,并不等于公共 DNS 和 HTTPS 已就绪。未加密的 HTTP 测试阶段,不要传输密码或令牌。

定位故障并仅回退实验变更

systemctl status nginx --no-pager
journalctl -b -u nginx -n 50 --no-pager
sudo nginx -t

同时核对实际 error_log 路径与请求时刻。移除练习时,先备份,再只删除此次创建的 conf 文件;nginx -t 通过后才 reload。内容目录、证书、DNS 与防火墙规则应检查依赖关系后,分别清理本次新增的项目,保留现有站点、共用证书和管理规则。

官方参考资料