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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:12:47