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

使用Caddy容器化PHP应用出现白屏问题求助

排查思路与解决建议

1. 修正Docker Compose端口配置错误

你的docker-compose.yml中app服务的expose字段写法有误:expose仅用于声明容器内部要暴露给其他容器的端口,不需要端口映射格式(端口映射用ports字段)。错误写法可能干扰服务间通信,修正如下:

services:
  app:
    # ... 其他保留配置
    expose:
      - "9000" # 移除冒号,仅指定容器内部端口

2. 解决Caddy与PHP容器的文件路径不匹配问题

当前Caddy配置里的root * /var/www/html/public指向的是Caddy容器内部路径,但你的项目代码仅存在于app容器中,Caddy容器没有这个目录,导致Caddy无法确认文件存在,进而无法正常转发请求到PHP-FPM。

两种解决方式任选其一:

  • 方式一:挂载项目代码到Caddy容器
    在docker-compose.yml的caddy服务中添加项目目录挂载:
    caddy:
      # ... 其他保留配置
      volumes:
        - ./Caddyfile:/etc/caddy/Caddyfile
        - ./caddy_data:/data
        - ./:/var/www/html # 把本地项目目录挂载到Caddy容器对应路径
    
  • 方式二:修改Caddyfile,跳过文件存在性检查
    通过try_files指令让Caddy直接转发请求到PHP-FPM,无需自身验证文件是否存在:
    localhost {
      php_fastcgi app:9000
      try_files {path} {path}/index.php index.php
      file_server
    }
    

3. 修正PHP容器内的文件权限

Alpine版PHP-FPM默认以www-data用户(UID=82)运行,而你复制到容器的文件默认属于root用户,会导致PHP-FPM无法读取文件。在Dockerfile中添加权限修正步骤:

FROM php:8.2-fpm-alpine

WORKDIR /var/www/html

COPY . .

# 让www-data用户拥有项目目录的读写权限
RUN chown -R www-data:www-data /var/www/html

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install

EXPOSE 9000

CMD ["php-fpm"]

4. 查看容器日志定位隐藏错误

白屏无提示通常是存在未输出的错误,直接查看容器日志:

  • 查看PHP-FPM容器日志:
    docker logs app
    
  • 查看Caddy容器日志:
    docker logs web_server
    

重点关注是否有文件权限报错、路径不存在提示、PHP语法错误(哪怕是phpinfo()也可能因权限问题无法执行)。

5. 测试PHP环境本身是否正常

在app容器内直接执行PHP脚本,确认PHP环境无问题:

docker exec -it app php -r "phpinfo();"

如果能正常输出信息,说明PHP环境没问题,问题集中在Caddy与PHP-FPM的通信或文件路径配置上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:00:42