网站启用https(Let's Encrypt + Certbot docker nginx)
第一步:在 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.yml 或 docker 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 <你的容器名>"