You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署WordPress连接Azure MySQL加载缓慢问题排查求助

本地Docker部署WordPress站点性能优化问题

当前架构

  • Azure托管的MySQL数据库
  • GitHub存储的WordPress文件,构建时复制到容器的WordPress目录

问题描述

站点加载极慢(页面加载耗时10秒以上),后台管理页同样卡顿。引入Redis缓存后仅缩短几秒,效果仍无法接受。

观察现象:初始请求(如http://localhost/)长时间处于'pending'状态,期间Docker容器无日志输出;请求完成后才接收数据并记录日志。

配置文件

Dockerfile

# Use the official PHP image with Apache
FROM php:8.0-apache

# Use a bash shell for execution
SHELL ["/bin/bash", "-o", "pipefail", "-c"]

# Install dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
    bash-completion \
    bindfs \
    ghostscript \
    less \
    libjpeg-dev \
    libmagickwand-dev \
    libpng-dev \
    libxml2-dev \
    libzip-dev \
    mariadb-client \
    sudo \
    unzip \
    vim \
    zip \
    curl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Configure GD with JPEG and Freetype support
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd

# Install PHP extensions
RUN docker-php-ext-install bcmath exif mysqli opcache soap zip \
    && pecl install redis \
    && docker-php-ext-enable redis

# Copy the WordPress files
WORKDIR /var/www/html
COPY src/ /var/www/html/

# Set ownership and permissions
RUN chown -R www-data:www-data /var/www/html

# Expose ports for Apache
EXPOSE 80 443

# Start Apache in foreground
CMD ["apache2-foreground"]

docker-compose.yml

version: '3.8'

services:
  wordpress:
    build: .
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
    env_file:
      - .env
    restart: always
    networks:
      - wp-network
    depends_on:
      - redis
    dns:
      - 8.8.8.8
      - 8.8.4.4

  redis:
    image: redis:latest
    networks:
      - wp-network
    ports:
      - "6379:6379"
    dns:
      - 8.8.8.8
      - 8.8.4.4

networks:
  wp-network:
    driver: bridge

已排查步骤

  • 部署Redis缓存:仅小幅提升性能
  • 调整Dockerfile和docker-compose.yml,添加卷和DNS解析器:无明显改善

咨询问题

  1. 初始请求长时间处于'pending'状态的原因是什么?
  2. 有哪些优化配置可以缩短加载时间?

问题分析与优化建议

1. 初始请求'pending'的核心原因

跨区域数据库延迟

MySQL数据库托管在Azure,而WordPress容器运行在本地,跨网络的远程数据库连接是最大性能瓶颈。初始请求需要建立数据库连接、执行查询(如获取站点配置、首页内容),网络往返延迟会导致请求长时间处于pending状态,直到数据库响应返回,容器才会开始处理并记录日志。

文件系统性能瓶颈

docker-compose中挂载了./src:/var/www/html本地卷,本地文件系统与容器之间的IO交互可能存在延迟,尤其是WordPress加载大量核心文件、主题插件文件时,IO阻塞会拖慢请求响应。

PHP OPCache未正确配置

虽然Dockerfile中安装了OPCache,但默认配置下可能未启用或缓存策略不合理,导致PHP每次请求都重新编译脚本,增加处理时间。

2. 针对性优化配置

解决数据库延迟问题

  • 强化数据库查询缓存:除Redis外,安装WordPress静态缓存插件(如WP Super Cache),配置页面静态化,减少重复数据库查询;或使用HyperDB插件实现数据库查询缓存,降低远程数据库调用频率。
  • 替换为本地数据库(演示场景):如果仅用于团队演示,将Azure MySQL替换为本地Docker部署的MySQL容器,彻底消除跨网络延迟。修改docker-compose.yml添加本地MySQL服务:
    mysql:
      image: mysql:8.0
      env_file: .env
      volumes:
        - mysql-data:/var/lib/mysql
      networks:
        - wp-network
    
    同时更新WordPress环境变量指向本地MySQL服务。

优化文件系统与PHP性能

  • 移除本地卷挂载:构建镜像时已将src目录复制到容器内,卷挂载会覆盖容器内文件且本地IO性能不如容器内部文件系统。注释或删除volumes: - ./src:/var/www/html,让WordPress直接使用容器内文件,提升文件读取速度。
  • 配置OPCache:创建opcache.ini文件,内容如下:
    opcache.enable=1
    opcache.enable_cli=1
    opcache.memory_consumption=128
    opcache.max_accelerated_files=10000
    opcache.revalidate_freq=60
    opcache.validate_timestamps=0
    
    在Dockerfile中添加复制命令:
    COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini
    
    避免PHP重复编译脚本,大幅提升PHP执行效率。

网络与容器优化

  • 优化Docker网络:Linux环境下可将wp-network驱动改为host,减少容器网络转发开销。修改docker-compose.yml网络配置:
    networks:
      wp-network:
        driver: host
    
    此模式下无需端口映射,直接使用主机端口访问。
  • 启用Apache压缩:在Dockerfile中启用Apache压缩模块并配置规则:
    RUN a2enmod deflate expires headers
    COPY apache.conf /etc/apache2/conf-available/apache.conf
    RUN a2enconf apache
    
    apache.conf内容:
    <IfModule mod_deflate.c>
      AddOutputFilterByType DEFLATE text/plain
      AddOutputFilterByType DEFLATE text/html
      AddOutputFilterByType DEFLATE text/xml
      AddOutputFilterByType DEFLATE text/css
      AddOutputFilterByType DEFLATE application/xml
      AddOutputFilterByType DEFLATE application/xhtml+xml
      AddOutputFilterByType DEFLATE application/rss+xml
      AddOutputFilterByType DEFLATE application/javascript
      AddOutputFilterByType DEFLATE application/x-javascript
    </IfModule>
    

其他优化点

  • 清理无用插件与主题:禁用或删除未使用的插件、主题,减少加载的文件和查询。
  • 完善Redis对象缓存配置:在wp-config.php中添加以下代码,确保WordPress充分利用Redis缓存:
    define('WP_REDIS_HOST', 'redis');
    define('WP_REDIS_PORT', 6379);
    define('WP_CACHE_KEY_SALT', 'your-site-salt');
    define('WP_REDIS_TIMEOUT', 1);
    define('WP_REDIS_READ_TIMEOUT', 1);
    

内容的提问来源于stack exchange,提问作者Thomas Ravetto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:45:02