Docker部署Laravel+Caddy出现404文件未找到问题求助
问题:Docker部署Laravel+Caddy出现404错误
尝试在Docker环境部署Laravel和Caddy,请求时提示文件未找到,PHP容器日志显示“GET /index.php” 404。相关配置如下:
Caddyfile
:80 { root * /app/public encode gzip php_fastcgi php:9000 file_server }
PHP/Laravel Dockerfile
# Use the official PHP image as the base FROM php:8.1-fpm # Set the working directory inside the container WORKDIR /var/www/html # Install system dependencies RUN apt-get update && apt-get install -y \ git \ curl \ libpng-dev \ libonig-dev \ libxml2-dev \ zip \ unzip # Install PHP extensions RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd # Install Composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Copy composer.json and composer.lock to the container COPY composer.json composer.lock ./ # Install project dependencies RUN composer install --no-scripts --no-autoloader # Copy the rest of the application code to the container COPY . . # Set permissions for Laravel storage and bootstrap cache folders RUN chown -R www-data:www-data \ storage \ bootstrap/cache # Expose port 9000 EXPOSE 9000 # Start the PHP-FPM server CMD ["php-fpm"]
docker-compose.yml
version: '3.6' services: caddy: image: caddy restart: unless-stopped volumes: - caddy_data:/data - caddy_config:/config - caddy_certs:/root/.caddy - ./Caddyfile:/etc/caddy/Caddyfile - ../app:/app ports: - 80:80 - 443:443 php: build: context: ../app restart: unless-stopped working_dir: /var/www/html volumes: - ../app:/var/www/html ports: - 9000:9000 volumes: caddy_data: caddy_config: caddy_certs:
问题排查与修复
核心问题是Caddy和PHP容器中Laravel代码的路径不一致,导致PHP-FPM找不到Caddy转发过来的文件。
1. 路径不匹配的原因
- Caddy容器将Laravel代码挂载到
/app,并设置站点根目录为/app/public - PHP容器却把代码挂载到
/var/www/html,PHP-FPM会按自身容器内的路径查找文件 - 当Caddy转发
/index.php请求给PHP-FPM时,PHP容器内实际对应的路径是/var/www/html/index.php,但Caddy期望的是/app/public/index.php,二者路径不匹配导致404
2. 修复方案
方案一:统一两个容器的代码挂载路径
修改docker-compose.yml中PHP服务的配置,和Caddy保持路径一致:
php: build: context: ../app restart: unless-stopped working_dir: /app # 改为与Caddy一致的根目录 volumes: - ../app:/app # 挂载到/app而非/var/www/html ports: - 9000:9000
同时修改PHP Dockerfile中的工作目录:
# Set the working directory inside the container WORKDIR /app
方案二:在Caddyfile中指定PHP-FPM的根路径映射
如果不想修改容器挂载路径,可以在Caddy的php_fastcgi指令中添加路径映射,告诉PHP-FPM文件实际位置:
:80 { root * /app/public encode gzip php_fastcgi php:9000 { root /var/www/html/public # PHP容器内的public目录路径 } file_server }
3. 额外检查项
- 确认
../app目录包含完整Laravel项目,public/index.php文件存在 - 重启容器使配置生效:
docker-compose down && docker-compose up -d --build - 验证PHP容器内文件路径:
docker exec -it [php容器名称] ls /var/www/html/public(或修改后的路径)
内容的提问来源于stack exchange,提问作者RailTracer
相关产品推荐
相关产品推荐

