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

Docker-Compose+Caddy+PHP-FPM配置问题:访问index.php报404错误

解决Caddy + PHP-FPM Docker部署中PHP文件404问题

你的问题核心是Caddy与PHP-FPM容器的文件挂载路径不匹配:

  • Caddy容器中网站文件挂载在/srv/www,并以此作为root路径
  • PHP-FPM容器中网站文件挂载在/var/www/html

当Caddy处理PHP请求时,会将自身容器内的文件路径(如/srv/www/index.php)传递给PHP-FPM,但PHP-FPM容器中不存在这个路径,因此返回404错误。

两种可行解决方案

方案1:统一两个容器的文件挂载路径

修改docker-compose.yml中PHP-FPM服务的挂载路径,使其与Caddy保持一致:

version: "3.8"

services:
  caddy:
    image: caddy:alpine
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - $PWD/Caddyfile:/etc/caddy/Caddyfile
      - $PWD/www:/srv/www
      - $PWD/caddy/data:/data
      - $PWD/caddy/config:/config
      - $PWD/caddy/log:/var/log
    depends_on:
      - app
  app:
    image: php:fpm-alpine
    ports:
      - "9000:9000"
    volumes:
      - "$PWD/www:/srv/www"  # 改为与Caddy一致的路径
    working_dir: /srv/www  # 可选:同步工作目录,避免PHP-FPM默认路径影响

Caddyfile无需修改,保持原配置即可:

localhost:80 {
    root * /srv/www
    php_fastcgi app:9000
    file_server
}

方案2:在Caddy中指定PHP-FPM的文件路径

如果不想修改PHP-FPM的挂载路径,可以在Caddy的php_fastcgi指令中添加root参数,告诉PHP-FPM文件在其容器内的实际路径:

修改后的Caddyfile:

localhost:80 {
    root * /srv/www
    php_fastcgi app:9000 {
        root /var/www/html  # 指定PHP-FPM容器内的文件根路径
    }
    file_server
}

docker-compose.yml保持原配置不变即可。

额外排查建议

  • 进入PHP-FPM容器验证文件路径:
    docker-compose exec app ls /var/www/html  # 或修改后的路径,确认文件存在
    
  • 查看PHP-FPM的日志,确认具体的文件找不到错误:
    docker-compose logs app
    

内容的提问来源于stack exchange,提问作者tgirod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:50:18