Nginx 为反代服务端时以 Certbot 自动申请 HTTPS 证书的流程详解
Nginx 为反代服务端时以 Certbot 自动申请 HTTPS 证书的流程详解
随着互联网安全意识的提升,越来越多的网站开始使用HTTPS协议来保护用户数据的安全。本文将详细介绍如何在Nginx作为反代服务端的情况下,使用Certbot自动申请HTTPS证书的完整流程。
1. 安装 Nginx 与 Certbot
以Ubuntu系统为例,首先更新包管理器:
sudo apt update
sudo apt upgrade然后安装Nginx与Certbot:
sudo apt install nginx certbot -y确保Nginx服务已经启动:
sudo systemctl start nginx注意:建议使用systemctl作为守护进程启动nginx,以确保它有权限操作/etc/nginx目录下的内容。不要直接使用nginx命令启动,否则可能导致权限问题。
2. 配置 Nginx 以临时给 .well-known 目录开口
Certbot在申请证书时,会通过访问http://xxx.com/.well-known/来验证你对域名的控制权。因此,我们需要配置Nginx以临时给.well-known目录开口。
在/etc/nginx/conf.d/下新建一个专门只开80端口的配置文件,例如site.conf:
server {
listen 80;
server_name xxx.com;
location ~ ^/\.well-known/ {
root /usr/share/nginx/html;
}
location / {
return https://xxx.com$uri;
}
}然后重启Nginx服务,开始监听:
nginx -s reload可以使用nginx -t检查配置文件是否有语法错误。
3. 申请 HTTPS 证书
现在可以使用Certbot申请第一次的HTTPS证书了:
certbot certonly --webroot -w /usr/share/nginx/html -d xxx.com -m [email protected] --agree-tos其中,-w参数指定了webroot的路径,-d参数指定了域名,-m参数指定了邮箱。
注意:后续的证书更新,只需要执行certbot renew即可,不需要打完整指令。
4. 启动后台服务,例如 docker 容器
例如,后台开一个wordpress的docker容器,放在3000端口:
docker run -d -p 3000:80 --name wordpress wordpress:latest这里的-d是放在后台运行,跑完指令之后容器不会直接原地退出;-p 3000:80是将容器中的80端口映射到宿主机的3000端口;--name参数是给容器起个名字,方便后续操作。
5. 配置 Nginx 以使用 HTTPS 证书
在/etc/nginx/conf.d/下新增一个专门开443端口的配置文件,例如site-ssl.conf:
server {
listen 443 ssl;
server_name xxx.com;
ssl_certificate /etc/letsencrypt/live/xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;
location ~ ^/\.well-known/ {
root /usr/share/nginx/html;
}
location ~ .* {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Ssl on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:3000;
}
}然后重新加载Nginx配置:
nginx -s reload6. 增加计划任务
最后,可以增加一个计划任务,每个月自动更新一次证书。
首先准备一个脚本,例如放在/home/cert-update.sh,先以Certbot更新证书,然后通知Nginx更新证书:
#!/bin/bash
certbot renew
nginx -s reload然后增加一个计划任务,每个月执行一次。先打开计划任务编辑器:
crontab -e在打开的编辑器中增加一行:
0 0 1 * * /bin/bash /home/cert-update.sh这里的0 0 1 * *是指每个月的第一天零点零分执行一次。
后记
这篇文章虽然很基础,但应该也挺有用,应该能带着之前用面板服的同学入真正的手动配置的坑,摆脱脚本小子身份。看了下这里应该没人用nginx + certbot直接在宿主机部署的方案说事,我发在这应该不重复。
通过以上步骤,你可以在Nginx作为反代服务端的情况下,使用Certbot自动申请并管理HTTPS证书,从而提升网站的安全性。
评论已关闭