新建文件夹映射目录
mkdir -p ~/nginx-ssl/{html,certbot/conf,certbot/www}
cd ~/nginx-ssl
目录结构如下
nginx-ssl/
├── docker-compose.yml
├── nginx/
│ ├── nginx.conf # 基础 Nginx 配置
│ └── conf.d/
│ └── default.conf # 虚拟主机配置
├── html/ # 网站根目录
└── certbot/
├── conf/ # Certbot 配置目录
└── www/ # ACME 验证文件目录
创建 docker-compose.yml
version: '3'
services:
nginx:
image: registry.cn-shenzhen.aliyuncs.com/davidzheng/nginx:1.18.0
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf.d:/etc/nginx/conf.d
- ./html:/usr/share/nginx/html
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
networks:
- web
restart: unless-stopped
certbot:
image: docker.1ms.run/certbot/certbot:v4.0.0
container_name: certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
networks:
- web
command: certonly --webroot --webroot-path=/var/www/certbot --email 986945193@qq.com --agree-tos --no-eff-email -d jiaochengziyuan.cn -d www.jiaochengziyuan.cn --dry-run # 测试时用 --dry-run,正式运行去掉
networks:
web:
driver: bridge
配置nginx/nginx.conf
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
配置虚拟主机nginx/conf.d/default.conf
server {
listen 80;
server_name jiaochengziyuan.cn www.jiaochengziyuan.cn;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
测试 Certbot 证书申请(带--dry-run 模式)
docker-compose run --rm certbot
成功后,配置nginx监听ssl 443端口
配置虚拟主机`nginx/conf.d/default.conf`
server {
listen 80;
server_name jiaochengziyuan.cn www.jiaochengziyuan.cn;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name jiaochengziyuan.cn www.jiaochengziyuan.cn;
ssl_certificate /etc/letsencrypt/live/jiaochengziyuan.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jiaochengziyuan.cn/privkey.pem;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
正式申请证书
# 正式申请证书(去掉 --dry-run)
sed -i 's/--dry-run //' docker-compose.yml
docker-compose run --rm certbot
# 重启 Nginx 启用 HTTPS
docker-compose restart nginx
配置自动续期,创建自动续期脚本 auto_apply_letsssl_cert.sh,脚本要放在~/nginx-ssl目录下
#!/bin/bash
docker-compose run --rm certbot renew
docker-compose exec nginx nginx -s reload
添加可执行权限
chmod +x auto_apply_letsssl_cert.sh
增加定时任务
(crontab -l ; echo "0 3 * * * ~/nginx-ssl/auto_apply_letsssl_cert.sh >> /var/log/certbot-renew.log 2>&1") | crontab -
通过日志即可看到执行结果