为 Nginx 反向代理配置 HTTPS (Let's Encrypt) 及踩坑总结

最近在私有服务器(Ubuntu)上部署了一个新的 Web 服务,通过 Nginx 反向代理转发到本地的 8089 端口。在配置 HTTPS 证书的过程中,遇到了一些经典的依赖问题和云服务器防火墙坑。本文记录了完整的配置与排查流程。

1. 环境准备

  • 操作系统: Ubuntu 20.04 / 22.04 LTS
  • Web 服务器: Nginx
  • 后端服务: 运行在 127.0.0.1:8089
  • SSL 工具: Certbot (Let's Encrypt)

2. 配置 Nginx 反向代理

首先,我们需要让 Nginx 能够通过 HTTP (80端口) 访问到我们的后端服务。

创建配置文件:

codeBash

sudo nano /etc/nginx/sites-available/blog.gloary.net.conf

写入以下基础配置:

codeNginx

server {
    listen 80;
    server_name blog.gloary.net; # 替换为你的域名

    location / {
        proxy_pass http://127.0.0.1:8089; # 转发到后端端口
        
        # 关键配置:传递真实 IP 和协议头,防止 Ghost/应用 无法获取客户端信息
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

启用配置并重载 Nginx:

codeBash

sudo ln -s /etc/nginx/sites-available/blog.gloary.net.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

3. 踩坑一:安装 Certbot 时的依赖报错

为了自动申请证书,我们需要安装 certbot 和 python3-certbot-nginx。
但是在执行 sudo apt install 时,可能会遇到如下报错:

The following packages have unmet dependencies:
libnss-systemd : Depends: systemd (= 249.11...) but ... is to be installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages...

原因分析:
这是因为系统中的 systemd 核心组件版本不一致,导致依赖关系破损,apt 拒绝安装新软件。

解决方案:
按照报错提示,执行以下命令自动修复依赖:

codeBash

sudo apt --fix-broken install

系统会自动下载匹配的包进行修复。修复完成后,建议更新一下软件源,然后再安装 Certbot:

codeBash

sudo apt update
sudo apt upgrade -y
sudo apt install certbot python3-certbot-nginx -y

4. 踩坑二:申请证书时提示 Timeout (防火墙拦截)

安装好 Certbot 后,执行申请命令:

codeBash

sudo certbot --nginx -d blog.gloary.net

结果报错:

Detail: Fetching http://blog.gloary.net/...: Timeout during connect (likely firewall problem)

原因分析:
Timeout 说明 Let's Encrypt 的验证服务器无法连接到我的服务器的 80 端口。
这通常不是 Nginx 的问题,而是**云服务商的安全组(Security Group)**默认屏蔽了入站流量。

解决方案(以阿里云/腾讯云为例):

  1. 登录云服务器控制台。
  2. 进入 “实例” -> “安全组”
  3. 找到当前实例使用的安全组,点击 “配置规则”
  4. 手动添加 两条入站规则:
    • 协议:TCP,端口:80,源 IP:0.0.0.0/0
    • 协议:TCP,端口:443,源 IP:0.0.0.0/0
  5. 保存后,无需重启服务器,立即生效。

5. 成功开启 HTTPS

解决了防火墙问题后,再次运行 Certbot:

codeBash

sudo certbot --nginx -d blog.gloary.net

按照交互提示操作:

  1. 输入邮箱(用于接收过期提醒)。
  2. 同意服务条款 (Y)。
  3. Redirect 设置:Certbot 会询问是否重定向流量。
    • 选择 2: Redirect。这样它会自动修改 Nginx 配置,将所有 HTTP 请求强制跳转到 HTTPS。

看到 Congratulations! 字样,说明配置成功。

此时打开浏览器访问 https://blog.gloary.net,那把安全的小锁终于出现了。