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 reload

6. 增加计划任务

最后,可以增加一个计划任务,每个月自动更新一次证书。

首先准备一个脚本,例如放在/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证书,从而提升网站的安全性。

标签: none

评论已关闭