网站别再 HTTP 裸奔:Nginx + Let's Encrypt,十分钟配好免费 HTTPS
网站别再 HTTP 裸奔:Nginx + Let’s Encrypt,十分钟配好免费 HTTPS
昨天那篇讲了 Nginx 反向代理:把多个应用收敛到 80 端口统一接客。好处里提过一条"统一做 HTTPS"——今天就把这条兑现:给网站配一张免费证书,让浏览器地址栏从"不安全"变成小锁头。
为什么非上 HTTPS 不可
三条现实理由:第一,Chrome、Firefox 对纯 HTTP 页面直接标"不安全",用户看到先怯三分;第二,登录密码、表单、Cookie 全是明文传输,同一 WiFi 下抓包即得;第三,搜索引擎给 HTTPS 加权。证书不用买,Let’s Encrypt 免费、到期自动续,个人博客和中小项目完全够用。
前置条件就两个:域名已经解析到你的服务器(A 记录指过去),Nginx 已经在跑 80 端口——正好是昨天的起点。
第一步:装 certbot
Debian / Ubuntu 上有两条路,推荐 snap(版本最新,续期逻辑最稳):
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
不想用 snap 就走 apt:sudo apt install certbot python3-certbot-nginx,功能一样,只是版本稍旧。
第二步:一条命令申请证书
sudo certbot --nginx -d 你的域名
certbot 会先验证"你是不是这个域名的真主人":它往 Nginx 里临时插一段配置,在 http://你的域名/.well-known/acme-challenge/ 下面放一个随机文件,Let’s Encrypt 的服务器能取到就放行。所以这一步要求 80 端口对外可达、域名解析正确——排错见后文。
过程中它会问联系邮箱(证书到期前发提醒用,填"你的邮箱"即可),以及是否把 HTTP 自动跳转到 HTTPS,选"是"。
第三步:看看 certbot 动了 Nginx 的哪些地方
证书落到 /etc/letsencrypt/live/你的域名/,两个关键文件:fullchain.pem(证书链)和 privkey.pem(私钥)。certbot 在你的 server 块里加了这几行:
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;
还顺手加了一个 80 端口的 server 块做 301 跳转。改完先 nginx -t 检查语法,再 systemctl reload nginx 生效——reload 不丢现有连接,比 restart 温柔(systemd 那篇讲过)。
第四步:验证与续期
浏览器打开 https://你的域名,小锁头出现;再打开 http:// 版,应该 301 跳到 https 版。证书有效期 90 天,certbot 安装时已经顺手装好了自动续期(snap 版是 systemd timer,apt 版是 cron),手动验一次心里有数:
sudo certbot renew --dry-run
显示成功,以后就不用再管了。
排错三件套
- 验证失败先查域名:
dig 你的域名 +short看返回的 IP 对不对得上你的服务器;curl -v http://你的域名/看请求到底到没到 Nginx。分层排障的思路和昨天那篇一样。 - 80 端口被占:如果 80 上跑的不是 Nginx(比如某个应用直接占了 80),certbot 的临时验证文件就插不进去。先
ss -tlnp | grep :80看看是谁在监听。 - 锁头有了但浏览器报"混合内容":页面里还引用了
http://开头的图片或 JS。把站内资源全改成相对路径或 https,警告消失。
收尾
昨天的反向代理解决"多个应用怎么统一接客",今天的证书解决"接客安不安全"。两者一拼,就是一套完整形态:80 收敛流量 → 301 跳 https → 443 挂证书 → proxy_pass 分发到后端。下一篇可以讲"后端只监听 127.0.0.1 时,Nginx 这一层的限流怎么做",把"统一做缓存限流"这条也兑现。
- 点赞
- 收藏
- 关注作者
评论(0)