
译者按:Nginx 反向代理几乎是每一个部署过 Web 应用的人都会遇到的课题。Let's Encrypt 的出现让 SSL 证书从收费变成了零成本,但这套流程怎么跑通、坑在哪里,中文互联网上的资料往往过于零散。本文保留原文核心步骤的基础上,用更符合中文阅读习惯的方式重新组织,并在关键处补充了经验性的提醒。
在开始之前,确保你手边有以下东西:
先更新一下系统的软件包列表,然后直接装 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,我们继续。
安装 Certbot 和 Nginx 插件:
sudo apt install certbot python3-certbot-nginx一键申请并自动配置到 Nginx:
sudo certbot --nginx -d your-domain.com过程中会要求输入邮箱(用于证书到期提醒)和同意服务条款,按提示操作即可。Certbot 会自动修改 Nginx 配置、开启 HTTPS 监听,并顺手把 HTTP 强制跳转 HTTPS 也配好。完成后会看到确认信息,告诉你证书已安装、443 端口已启用。
证书装好了不代表配置一定最优,去 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