site logo

Marico's space

Nginx 反向代理加 SSL 实战:手把手用 Let's Encrypt 搞定 HTTPS

服务器技术 2026-04-25 22:53:47 2

译者按:Nginx 反向代理几乎是每一个部署过 Web 应用的人都会遇到的课题。Let's Encrypt 的出现让 SSL 证书从收费变成了零成本,但这套流程怎么跑通、坑在哪里,中文互联网上的资料往往过于零散。本文保留原文核心步骤的基础上,用更符合中文阅读习惯的方式重新组织,并在关键处补充了经验性的提醒。

前置准备

在开始之前,确保你手边有以下东西:

  • 一台 VPS(阿里云、腾讯云均可,和海外机器操作一致)
  • 一个已解析到这台服务器 IP 的域名
  • 跑在后端的应用(文中以 localhost:3000 上的 n8n 为例,你换成 Node 服务、Django 或者任意 Web 应用都行)
  • 基础的 Linux 命令行操作能力

第一步 — 安装 Nginx

先更新一下系统的软件包列表,然后直接装 Nginx:

sudo apt update
sudo apt install nginx

装完之后,启动 Nginx 并让它开机自启:

sudo systemctl start nginx
sudo systemctl enable nginx

用 systemctl 确认一下服务状态,看到「active (running)」就说明一切正常:

sudo systemctl status nginx

第二步 — 配置反向代理

接下来要告诉 Nginx:收到请求后,转发给本地 3000 端口(也就是实际跑着你应用的地方)。

创建一个新的站点配置文件:

sudo nano /etc/nginx/sites-available/reverse-proxy

写入以下内容(将 your-domain.com 替换成你自己的域名):

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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;
        proxy_cache_bypass $http_upgrade;
    }
}

这几行 header 转发看起来多,但每个都有用:X-Real-IP 让后端知道真实访客 IP,X-Forwarded-For 便于日志里看到完整请求链,X-Forwarded-Proto 则确保后端知道请求走的是 HTTP 还是 HTTPS。

启用这个站点配置,创建软链接:

sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/

测试配置语法有没有问题,没问题再重载:

sudo nginx -t
sudo systemctl reload nginx

此时直接访问 your-domain.com,应该已经能看到你本地应用的内容了——不过还是明文 HTTP,我们继续。

第三步 — 申请 Let's Encrypt 证书

安装 Certbot 和 Nginx 插件:

sudo apt install certbot python3-certbot-nginx

一键申请并自动配置到 Nginx:

sudo certbot --nginx -d your-domain.com

过程中会要求输入邮箱(用于证书到期提醒)和同意服务条款,按提示操作即可。Certbot 会自动修改 Nginx 配置、开启 HTTPS 监听,并顺手把 HTTP 强制跳转 HTTPS 也配好。完成后会看到确认信息,告诉你证书已安装、443 端口已启用。

第四步 — 验证 SSL 配置

证书装好了不代表配置一定最优,去 SSL Labs(https://www.ssllabs.com/ssltest/)跑一下测试,把你的域名填进去。几分钟后会返回一个安全评级,A 级说明配置比较理想,B 级也基本可用,如果是 C 或更低就需要进一步排查了。

第五步 — 自动续期

Let's Encrypt 证书有效期是 90 天,Certbot 默认已经写好了定时任务,但保险起见,我们手动跑一次预演确认没问题:

sudo certbot renew --dry-run

看到类似「Processing」「Congratulations」字样就说明自动续期在正常工作。之后你基本不用管它,系统会在证书快到期时自动刷新。

总结

就这么几步,你的网站已经跑在 HTTPS 上了。Nginx 作为反向代理挡在前面,后端应用藏在 localhost 后面,Let's Encrypt 搞定证书且不用花一分钱。整个架构干净、可维护,下次加新域名也照着这个流程复制一份配置文件即可。

原文链接:https://dev.to/chasebot/how-to-set-up-nginx-reverse-proxy-with-ssl-lets-encrypt-gek