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