使用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
相关产品推荐
相关产品推荐

