Docker+Symfony+PHP-FPM环境下Nginx下载index.php且根路径403
问题分析与解决方案
一、403 Forbidden 错误排查与修复
403错误通常是Nginx找不到默认首页或目录权限配置异常导致,按以下步骤处理:
- 检查Nginx配置的
index指令,确保包含index.php,示例:index index.php index.html index.htm; - 确认Nginx容器内网站根目录权限,保证Nginx进程(通常为
www-data用户)拥有读取权限。可在Dockerfile中添加权限设置:RUN chown -R www-data:www-data /var/www/html - 核对Nginx配置的
root指令,确保指向正确的项目根目录,比如项目挂载到/var/www/html,则配置应为:root /var/www/html;
二、PHP文件被下载而非执行的修复
核心原因是Nginx未配置将PHP请求转发给PHP-FPM处理,需在Nginx的server块中添加如下规则:
location ~ \.php$ { fastcgi_pass php:9000; # 此处名称需与docker-compose中PHP-FPM服务名一致 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
注意:fastcgi_pass后的服务名必须和docker-compose.yml里PHP服务的名称完全匹配,比如服务叫php-fpm,则改成fastcgi_pass php-fpm:9000;
三、Docker-compose配置校验
确保Nginx与PHP-FPM服务在同一网络,且项目目录挂载路径一致:
version: '3.8' services: nginx: image: nginx:alpine ports: - "8000:80" volumes: - ./your-project:/var/www/html - ./php.conf:/etc/nginx/conf.d/default.conf # 挂载自定义Nginx配置 networks: - app-network php: image: php:fpm-alpine volumes: - ./your-project:/var/www/html networks: - app-network networks: app-network: driver: bridge
- 两个服务必须挂载同一项目目录,路径要完全相同
- Nginx配置中的
fastcgi_pass必须使用PHP服务的名称,Docker会自动解析服务名到对应容器IP
四、验证操作
- 修改配置后重启容器:
docker-compose down && docker-compose up -d - 访问
localhost:8000,检查首页是否正常加载 - 访问
localhost:8000/index.php,确认PHP文件已被解析执行
内容的提问来源于stack exchange,提问作者goldstein91
相关产品推荐
相关产品推荐

