Nginx + Certbot 给云服务器上的 Web 应用配好免费 HTTPS:一步步实战
摘要:在一台 Linux 云服务器上,用 Nginx 做反向代理,再用 Certbot 申请 Let’s Encrypt 免费证书,给后端应用加上 HTTPS 并设置自动续期。
一、为什么要做这一步
很多人把 Flask、Node.js 或 Spring Boot 应用直接跑在云服务器的 5000、3000、8080 端口上,再在安全组里放开端口访问。这样能用,但有三个问题:没有 HTTPS,浏览器会提示“不安全”;端口暴露太多,不好管理;一台机器跑多个应用时,域名和端口对应关系很乱。
更常见的做法是:应用只监听本机端口,前面放一层 Nginx 统一对外提供 80/443,再用免费证书开启 HTTPS。
二、准备工作
- 一台 Linux 云服务器(本文以 Ubuntu 22.04 为例)。
- 一个已解析到服务器公网 IP 的域名,例如
app.example.com。 - 安全组放行 TCP 80 和 443 端口。
- 后端应用已在本机运行,例如监听
127.0.0.1:5000。
三、安装 Nginx
sudo apt update
sudo apt install -y nginx
sudo systemctl enable --now nginx
浏览器访问服务器 IP,看到 Nginx 欢迎页说明安装成功。
四、配置反向代理
新建配置文件 /etc/nginx/sites-available/app.conf:
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
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;
}
}
启用并检查配置:
sudo ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
此时用 http://app.example.com 已经可以访问到后端应用。
五、用 Certbot 申请免费证书
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com
按提示填写邮箱、同意协议,并选择把 HTTP 自动跳转到 HTTPS。Certbot 会自动修改 Nginx 配置,加入 listen 443 ssl 和证书路径。
完成后访问 https://app.example.com,地址栏出现锁形图标即成功。
六、自动续期
Let’s Encrypt 证书有效期 90 天。Certbot 安装时会自动添加定时任务,可以用下面的命令验证续期流程:
sudo certbot renew --dry-run
没有报错就说明到期前会自动续期,不用手动操作。
七、几个常见坑
- 证书申请失败,提示无法验证:先确认域名解析已生效(ping 域名看 IP 是否正确),以及 80 端口在安全组和系统防火墙(ufw)里都已放行。
- 后端拿到的客户端 IP 全是 127.0.0.1:记得加上 X-Real-IP 和 X-Forwarded-For 头,并让应用信任代理头。
- WebSocket 连接失败:在 location 中补充
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
- 应用端口仍对公网开放:后端只监听 127.0.0.1,并在安全组中关闭 5000 等端口,只保留 22、80、443。
八、小结
Nginx 负责对外入口和证书,应用只专注业务,这是小型项目上云最省心的结构。整个过程十几分钟,零成本就能让站点用上 HTTPS。后续再加新应用,只需新增一个 server 配置和一次 certbot 命令即可。
- 点赞
- 收藏
- 关注作者
评论(0)