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

WSL环境下Docker部署Laravel站点加载缓慢排查求助

Laravel站点在WSL+Docker环境加载缓慢排查

问题背景

我是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:cache
    
    注意:开发环境修改配置或路由后,需执行php 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:34:54