Docker Compose下Nginx通过FastCGI调用PHP-FPM时找不到index.php
我来帮你捋清楚这个问题哈~咱们先拆解下报错的核心原因:
当你注释掉Nginx配置里的root /var/www/code后,Nginx会自动使用它的默认根目录/etc/nginx/html。而Nginx处理PHP请求时,是通过FastCGI把要执行的文件路径传给PHP-FPM的——具体来说,就是通过SCRIPT_FILENAME这个参数,它的值是$document_root$fastcgi_script_name,其中$document_root就是你设置的root路径(没设置就用默认值)。
这就导致了矛盾:Nginx传给PHP-FPM的路径是/etc/nginx/html/index.php,但你的PHP代码明明存在PHP-FPM容器的/var/www/code目录里,PHP-FPM在自己容器里找这个默认路径的文件,自然找不到,就报了那个错。
正确的配置方案
你需要确保两个关键点:Nginx的root路径和PHP-FPM的代码目录一致,同时FastCGI参数正确传递文件路径。
1. 修正Nginx的site.conf配置
必须保留root指令,并且指向PHP-FPM容器里的代码目录(也就是/var/www/code),完整的server块示例如下:
server { listen 80; server_name localhost; # 这个root必须和PHP-FPM容器内的代码目录完全一致 root /var/www/code; index index.php index.html; # 处理静态文件和路由重写 location / { try_files $uri $uri/ /index.php?$query_string; } # PHP请求处理规则 location ~ \.php$ { # 这里填你Docker Compose里PHP-FPM服务的名称(比如php-fpm) fastcgi_pass php-fpm:9000; fastcgi_index index.php; # 核心:正确构造传给PHP-FPM的文件路径 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
2. 确保PHP-FPM容器的代码路径正确
你的PHP-FPM容器已经通过Git把代码拉到/var/www/code了,这部分没问题,但要确认Dockerfile里的拉取命令是正确的,比如:
RUN git clone https://your-repo-url.git /var/www/code # 如果需要切换分支或者拉取特定版本,可以加额外命令 RUN cd /var/www/code && git checkout main
3. Docker Compose的注意点
确保Nginx服务能访问到PHP-FPM服务(默认同一网络下可以通过服务名访问),比如你的docker-compose.yml里大概是这样的:
version: '3' services: web: image: nginx:alpine ports: - "8080:80" volumes: - ./site.conf:/etc/nginx/conf.d/default.conf networks: - app-network php-fpm: build: ./php-fpm networks: - app-network networks: app-network: driver: bridge
小补充:为什么不需要Nginx容器里有代码?
很多人会疑惑:Nginx容器里没有/var/www/code目录,为什么root要设这个路径?其实Nginx只是用这个路径来构造传给PHP-FPM的文件路径,真正读取文件的是PHP-FPM容器,只要PHP-FPM容器里存在这个目录和对应的文件,就能正常执行。
内容的提问来源于stack exchange,提问作者syst0m

