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解析器:无明显改善
咨询问题
- 初始请求长时间处于'pending'状态的原因是什么?
- 有哪些优化配置可以缩短加载时间?
问题分析与优化建议
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服务:
同时更新WordPress环境变量指向本地MySQL服务。mysql: image: mysql:8.0 env_file: .env volumes: - mysql-data:/var/lib/mysql networks: - wp-network
优化文件系统与PHP性能
- 移除本地卷挂载:构建镜像时已将src目录复制到容器内,卷挂载会覆盖容器内文件且本地IO性能不如容器内部文件系统。注释或删除
volumes: - ./src:/var/www/html,让WordPress直接使用容器内文件,提升文件读取速度。 - 配置OPCache:创建
opcache.ini文件,内容如下:
在Dockerfile中添加复制命令:opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.revalidate_freq=60 opcache.validate_timestamps=0
避免PHP重复编译脚本,大幅提升PHP执行效率。COPY opcache.ini /usr/local/etc/php/conf.d/opcache.ini
网络与容器优化
- 优化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 apacheapache.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
相关产品推荐
相关产品推荐

