WSL环境下Docker部署Laravel站点加载缓慢排查求助
问题背景
我是Docker新手,近期搭建了包含PHP 7.4、MySQL、phpMyAdmin和Redis的多容器环境。容器可正常运行,但Laravel站点加载速度极慢。我使用Windows 11 Pro的WSL环境,为避免性能问题,未通过WSL挂载Laravel的vendor目录,而是为该目录创建了独立卷,并直接在PHP容器内执行composer update命令,操作均正常,但站点加载缓慢问题仍存在。恳请帮忙查看我的Dockerfile和docker-compose.yml文件,定位性能瓶颈。
提供的配置文件
docker-compose.yml
version: '3' services: php: image: php:7.4-apache ports: - 80:80 - 443:443 volumes: - /mnt/c/dev/web:/var/www/html/ - /var/www/html/vendor networks: - my_network depends_on: - mysql - redis mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: myDatabase MYSQL_USER: myDatabase MYSQL_PASSWORD: 123456 networks: - my_network volumes: - /mnt/c/dev/myDatabase/docker/sql:/docker-entrypoint-initdb.d phpmyadmin: image: phpmyadmin/phpmyadmin ports: - 8080:80 environment: PMA_HOST: mysql networks: - my_network depends_on: - mysql redis: image: redis:latest networks: - my_network networks: my_network:
Dockerfile
# Use a base image with Apache and PHP 7.4 FROM php:7.4-apache RUN export COMPOSER_ALLOW_SUPERUSER=1; RUN apt-get update && apt-get install -y \ libzip-dev \ libmagickwand-dev \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ libxml2-dev \ libcurl4-openssl-dev \ libonig-dev \ libssl-dev \ openssl \ nano \ locate \ supervisor \ openssh-server \ git \ curl \ libpng-dev \ libonig-dev \ libxml2-dev \ libzip-dev \ libicu-dev \ && docker-php-ext-install zip \ && docker-php-ext-configure intl \ && docker-php-ext-install intl \ && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd RUN pecl uninstall imagick RUN pecl install imagick && docker-php-ext-enable imagick RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer COPY sites-available/apache2.conf /etc/apache2/apache2.conf COPY sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf COPY sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf COPY sites-available/web.conf /etc/apache2/sites-available/web.conf RUN mkdir -p /var/lock/apache2 /var/run/apache2 /var/run/sshd /var/log/supervisor COPY supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf RUN a2ensite web.conf RUN a2enmod ssl RUN a2enmod rewrite COPY ssl/certificat.crt /etc/ssl/certs/apache-selfsigned.crt COPY ssl/private.key /etc/ssl/private/apache-selfsigned.key COPY vendor_default /var/www/html/vendor EXPOSE 80 EXPOSE 443 EXPOSE 22 RUN updatedb # Change permissions for the "vendor" directory RUN chown -R www-data:www-data /var/www/html/vendor RUN chmod -R 755 /var/www/html/vendor CMD ["apache2-foreground"] CMD ["/usr/bin/supervisord"]
性能瓶颈排查与优化建议
1. WSL跨系统挂载的性能损耗
当前PHP容器挂载了/mnt/c/dev/web:/var/www/html/,这是直接将Windows系统盘路径挂载到WSL,跨文件系统的IO操作在WSL环境下性能损耗极大,而Laravel运行需要频繁读取配置、视图、路由等大量文件,这是核心性能瓶颈。
- 优化方案:将项目文件迁移到WSL内部文件系统(比如
~/dev/web),容器挂载WSL内部路径,彻底解决跨系统IO的性能问题。
2. Dockerfile中CMD指令冲突
Dockerfile末尾存在两个CMD指令:
CMD ["apache2-foreground"] CMD ["/usr/bin/supervisord"]
Docker只会执行最后一条CMD,导致Apache并未通过原生指令启动,而是依赖supervisord管理。若supervisord配置存在问题,会导致Apache运行异常,间接拖慢站点速度。
- 优化方案:检查
supervisord.conf是否正确配置了Apache进程的启动规则;或者保留单个CMD指令,确保服务正常启动逻辑。
3. MySQL挂载路径的潜在性能问题
MySQL初始化脚本挂载了Windows路径/mnt/c/dev/myDatabase/docker/sql,虽然仅用于初始化,但如果后续将数据卷挂载到Windows路径,会严重影响数据库读写性能。
- 优化方案:改用Docker命名卷存储MySQL数据,同时将初始化脚本迁移到WSL内部路径:
mysql: # ...其他配置 volumes: - mysql_data:/var/lib/mysql - ~/dev/myDatabase/docker/sql:/docker-entrypoint-initdb.d # 在docker-compose.yml末尾添加 volumes: mysql_data:
4. Laravel缓存未启用
Laravel默认在开发环境不启用缓存,但开启基础缓存可大幅提升加载速度:
- 在PHP容器内执行以下命令:
注意:开发环境修改配置或路由后,需执行php artisan config:cache php artisan route:cache php artisan view:cachephp artisan config:clear等命令清除缓存。
5. Redis未被Laravel正确利用
虽然部署了Redis容器,但需确认Laravel是否配置其作为缓存/会话驱动,减少数据库查询次数:
- 修改Laravel项目的
.env文件:CACHE_DRIVER=redis SESSION_DRIVER=redis REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379
6. 启用PHP OPcache
OPcache是提升PHP性能的关键,需确保其已配置启用:
- 在Dockerfile中添加OPcache配置:
RUN echo "opcache.enable=1\nopcache.enable_cli=1\nopcache.memory_consumption=128\nopcache.interned_strings_buffer=8\nopcache.max_accelerated_files=4000\nopcache.revalidate_freq=60\nopcache.fast_shutdown=1" > /usr/local/etc/php/conf.d/opcache.ini
内容的提问来源于stack exchange,提问作者Anthony

