如何对Docker部署的WordPress网站进行TLS改造

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容器。

  1. 创建Nginx配置目录:bash复制下载mkdir -p nginx/conf.d
  2. 创建配置文件 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挑战验证域名所有权,生成证书并存储在共享目录。

  1. 启动Nginx(需先开放80端口):bash复制下载docker-compose up -d nginx
  2. 运行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 # 替换为你的域名
  3. 验证证书生成:bash复制下载ls ./certbot/conf/live/yourdomain.com/ # 应看到fullchain.pem和privkey.pem

4. 重启Nginx并启用HTTPS

  1. 重启Nginx加载证书:bash复制下载docker-compose restart nginx
  2. 强制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天)。

  1. 验证续期命令:bash复制下载docker-compose run –rm certbot renew –dry-run
  2. 启动所有服务(包括Certbot后台续期):bash复制下载docker-compose up -d

关键验证步骤

  1. 访问 https://yourdomain.com ,检查浏览器锁图标。
  2. 测试重定向:访问 http://yourdomain.com 应自动跳转到HTTPS。
  3. 检查证书有效期:bash复制下载docker-compose run –rm certbot certificates

故障排查

  1. Nginx报错”no valid cert”
    • 确保证书路径正确(Nginx配置中的路径)。
    • 检查docker-compose.yml的卷挂载路径。
  2. HTTP重定向循环
    • 在WordPress中设置Site Address为HTTPS(后台设置 → 常规)。
    • 确保Nginx配置包含proxy_set_header X-Forwarded-Proto $scheme;
  3. Certbot续期失败
    • 手动删除旧证书:rm -rf ./certbot/conf/live/yourdomain.com
    • 重新执行证书申请命令。

注意:确保防火墙开放80/443端口,域名DNS解析正确指向服务器IP

作者: cavalier

能源行业从业者,业余爱好象棋、C++还有二胡、乒乓也很喜欢

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注