Nginx 反向代理 + Certbot:给个人网站配好 HTTPS 的完整实操
为什么需要反向代理 + HTTPS
个人网站常跑在内网端口上,例如博客跑在 3000 端口、相册跑在 8080 端口。直接把这些端口暴露到公网既不安全也不好看。正确的做法是:只开放 80 和 443 端口,由 Nginx 做反向代理,把不同域名或路径分发到本机的各个服务;再用 Certbot 向 Let’s Encrypt 申请免费证书,让全站走 HTTPS。
这样做有三个好处:第一,浏览器不再报“不安全”,用户敢放心访问;第二,真实服务端口不暴露在公网,攻击面大幅缩小;第三,以后新增服务只需加一段 Nginx 配置,不用再开新端口。
第一步:安装 Nginx
以 Ubuntu 22.04 为例:
sudo apt update && sudo apt install -y nginx
sudo systemctl enable --now nginx
curl -I http://localhost
curl 能返回 HTTP/1.1 200 OK,说明 Nginx 已正常工作。确认云服务器安全组已放行 80 和 443 端口,否则外网无法访问。
第二步:写一个反向代理配置
假设博客跑在本地 3000 端口,域名是 blog.example.com。新建配置文件 /etc/nginx/conf.d/blog.conf:
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
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_pass 指向本地服务;Host 头要原样透传,否则依赖域名的应用会认错地址;X-Forwarded-Proto 告诉后端当前是 HTTP 还是 HTTPS,避免后端生成错误的跳转链接。
检查并重载配置:
sudo nginx -t && sudo systemctl reload nginx
nginx -t 先测试语法再重载,是个好习惯——配置写错也不会让正在运行的 Nginx 停掉。
第三步:用 Certbot 申请免费证书
Let’s Encrypt 的证书免费、有效期 90 天,Certbot 可以自动申请和续期:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d blog.example.com
Certbot 会先验证你对这个域名的控制权(它会在 Nginx 里临时加一段验证配置),通过后自动签发证书,并把 443 端口的 ssl_certificate 配置写进 Nginx,最后还会加一条 80 到 443 的强制跳转。按提示填一个邮箱即可,证书到期前 Certbot 会发提醒。
验证续期是否正常工作:
sudo certbot renew --dry-run
输出没有报错,就说明自动续期链路是通的。Certbot 装好后默认已装好定时任务,每天会尝试续期,无需人工干预。
第四步:加固几个常用项
证书配好后,建议再做三处加固:
- 只保留强加密套件:在
ssl.conf里确认ssl_protocols TLSv1.2 TLSv1.3;,关闭老旧的 TLS 1.0/1.1。 - 开启 HSTS:
add_header Strict-Transport-Security "max-age=63072000" always;,让浏览器记住以后只用 HTTPS 访问。 - 限制请求频率:对登录接口用
limit_req_zone限流,防止暴力破解把后端打满。
常见问题排查
- 访问域名报 502:先看后端服务本身是否在跑,
curl http://127.0.0.1:3000本地能通再查 Nginx;再看sudo tail -f /var/log/nginx/error.log的报错。 - 证书申请失败:多半是域名没有解析到这台服务器,或 80 端口被安全组挡住了。先确认
ping域名得到的 IP 与服务器公网 IP 一致。 - 混合内容警告:页面里引用了
http://的图片或脚本,浏览器会拦截。把站内资源全部改成相对路径或https://即可。
小结
Nginx 反向代理 + Certbot 这套组合拳,是个人网站上 HTTPS 性价比最高的方案:零证书费用、配置不到十行、续期全自动。核心流程就四步:装 Nginx、写 proxy_pass、跑 certbot --nginx、做一次 dry-run 验证续期。把这套流程跑通一次,之后每新增一个服务,复制一段配置、申请一张证书,十分钟就能上线。
- 点赞
- 收藏
- 关注作者
评论(0)