Docker部署的WordPress网站TLS改造详细步骤
核心原理
通过Nginx反向代理实现TLS终止,将HTTPS流量解密后转发给WordPress容器,同时使用Let’s Encrypt自动管理证书。
1. 准备Docker Compose文件
原理:添加Nginx和Certbot容器,Nginx处理HTTPS流量,Certbot自动申请/续期证书。
# docker-compose.yml
version: '3.8'
services:
# 原有WordPress服务(移除端口映射)
wordpress:
image: wordpress:latest
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
volumes:
- wordpress:/var/www/html
networks:
- app-network
# 原有数据库服务(保持不变)
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: wordpress
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
volumes:
- db:/var/lib/mysql
networks:
- app-network
# 新增Nginx服务
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d # Nginx配置
- ./certbot/www:/var/www/certbot:ro # Certbot验证文件
- ./certbot/conf:/etc/letsencrypt # 证书存储
networks:
- app-network
depends_on:
- wordpress
# 新增Certbot服务(证书管理)
certbot:
image: certbot/certbot
volumes:
- ./certbot/www:/var/www/certbot
- ./certbot/conf:/etc/letsencrypt
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do sleep 6h & wait $${!}; certbot renew; done;'"
networks:
- app-network
volumes:
wordpress:
db:
networks:
app-network:
driver: bridge
2. 配置Nginx反向代理
原理:Nginx监听443端口,使用TLS证书解密流量,并转发HTTP请求到WordPress容器。
- 创建Nginx配置目录:bash复制下载mkdir -p nginx/conf.d
- 创建配置文件
nginx/conf.d/wordpress.conf:nginx复制下载server { listen 80; server_name yourdomain.com; # 替换为你的域名 location /.well-known/acme-challenge/ { root /var/www/certbot; # Certbot验证目录 } location / { return 301 https://$host$request_uri; # HTTP重定向到HTTPS } } server { listen 443 ssl; server_name yourdomain.com; # TLS证书路径(由Certbot生成) ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 安全协议配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; location / { proxy_pass http://wordpress:80; # 转发到WordPress容器 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 告知WordPress使用HTTPS } }
3. 首次申请TLS证书
原理:Certbot通过HTTP-01挑战验证域名所有权,生成证书并存储在共享目录。
- 启动Nginx(需先开放80端口):bash复制下载docker-compose up -d nginx
- 运行Certbot申请证书:bash复制下载docker-compose run –rm certbot certonly \ –webroot -w /var/www/certbot \ –email your@email.com –agree-tos –no-eff-email \ -d yourdomain.com # 替换为你的域名
- 验证证书生成:bash复制下载ls ./certbot/conf/live/yourdomain.com/ # 应看到fullchain.pem和privkey.pem
4. 重启Nginx并启用HTTPS
- 重启Nginx加载证书:bash复制下载docker-compose restart nginx
- 强制WordPress使用HTTPS:
- 进入WordPress容器:bash复制下载docker-compose exec wordpress bash
- 修改
wp-config.php:php复制下载define(‘FORCE_SSL_ADMIN’, true); if ($_SERVER[‘HTTP_X_FORWARDED_PROTO’] == ‘https’) { $_SERVER[‘HTTPS’] = ‘on’; }
5. 配置证书自动续期
原理:Certbot容器每6小时检查证书有效期,自动续期(Let’s Encrypt证书有效期90天)。
- 验证续期命令:bash复制下载docker-compose run –rm certbot renew –dry-run
- 启动所有服务(包括Certbot后台续期):bash复制下载docker-compose up -d
关键验证步骤
- 访问
https://yourdomain.com,检查浏览器锁图标。 - 测试重定向:访问
http://yourdomain.com应自动跳转到HTTPS。 - 检查证书有效期:bash复制下载docker-compose run –rm certbot certificates
故障排查
- Nginx报错”no valid cert”:
- 确保证书路径正确(Nginx配置中的路径)。
- 检查
docker-compose.yml的卷挂载路径。
- HTTP重定向循环:
- 在WordPress中设置
Site Address为HTTPS(后台设置 → 常规)。 - 确保Nginx配置包含
proxy_set_header X-Forwarded-Proto $scheme;。
- 在WordPress中设置
- Certbot续期失败:
- 手动删除旧证书:
rm -rf ./certbot/conf/live/yourdomain.com - 重新执行证书申请命令。
- 手动删除旧证书:
注意:确保防火墙开放80/443端口,域名DNS解析正确指向服务器IP