第一步:在 CentOS 主机安装 Certbot

1. 安装 EPEL 源(Certbot 在这里面)

sudo yum install -y epel-release

2. 安装 Certbot

sudo yum install -y certbot

第二步:申请证书(临时停止 Nginx)

因为你的 Nginx 在 Docker 里占用了 80 端口,我们需要先停掉它,让 Certbot 独占 80 端口验证域名。

# 1. 查看你的 Nginx 容器名字

docker ps | grep nginx

2. 停止 Nginx 容器(把 <容器名> 换成你实际的,比如 nginx 或 web)

docker stop <容器名>

# 3. 申请证书(替换为你的域名)

sudo certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com

* 过程中会提示输入邮箱、同意协议,按提示操作即可。

* 成功后,证书会保存在主机的 /etc/letsencrypt/live/yourdomain.com/ 目录下。

# 4. 重新启动 Nginx 容器

docker start <容器名>

第三步:配置 Docker Nginx 挂载证书

现在证书在主机上,你需要让 Docker 里的 Nginx 能读到它们。

1. 修改 docker-compose.ymldocker run

如果你用 docker-compose:

version: '3'

services:

nginx:

image: nginx:latest

container_name: my_nginx

ports:

- "80:80"

- "443:443"

volumes:

- ./conf/nginx.conf:/etc/nginx/nginx.conf:ro

# 关键:挂载证书目录

- /etc/letsencrypt:/etc/letsencrypt:ro

- ./html:/usr/share/nginx/html

restart: always

如果你用 docker run 命令:

docker run -d \

--name my_nginx \

-p 80:80 -p 443:443 \

-v /etc/letsencrypt:/etc/letsencrypt:ro \

-v ./html:/usr/share/nginx/html \

nginx:latest

2. 修改 Nginx 配置文件 nginx.conf)

确保你的配置指向了正确的证书路径(容器内路径):

# /opt/nginx/conf.d/qinyeai.cn.conf

# HTTP → HTTPS 重定向

server {

listen 80;

server_name qinyeai.cn www.qinyeai.cn;

return 301 https://$host$request_uri;

}

# HTTPS 配置

server {

listen 443 ssl http2;

server_name qinyeai.cn www.qinyeai.cn;

# 证书路径(容器内路径,因已挂载)

ssl_certificate /etc/letsencrypt/live/qinyeai.cn/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/qinyeai.cn/privkey.pem;

# SSL 优化

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

# 网站根目录

root /usr/share/nginx/html;

index index.html index.htm;

location / {

try_files $uri $uri/ =404;

}

# 安全头(可选)

add_header X-Frame-Options "SAMEORIGIN" always;

add_header X-Content-Type-Options "nosniff" always;

}

3. 重启 Nginx 容器

docker restart <容器名>

第四步:设置自动续期(重点!)

证书 90 天过期,需要自动续期。**注意:续期后必须重启 Docker 容器才能生效。**

1. 编辑定时任务

sudo crontab -e

2. 添加以下内容(不要直接运行这行!)

在编辑器中输入以下内容,然后保存退出(Vi/Vim 是按 Esc 输入 :wq 回车):

每天凌晨 2 点检查续期,成功后重启 Docker Nginx

0 2 * * * /usr/bin/certbot renew --quiet --post-hook "docker restart <你的容器名>"

> 再次提醒

> 1. 把 <你的容器名> 换成实际的容器名字。

> 2. 这行代码是写在 crontab -e 编辑器里的,**不要**直接在终端回车运行,否则会报 -bash: 0: command not found

3. 测试续期脚本

手动测试一下确保没问题(不会真的续期,只是模拟):

sudo certbot renew --dry-run --post-hook "docker restart <你的容器名>"