Docker Compose部署Nginx+PHP出现404错误求助
404 "File not found" 问题排查(Docker + Nginx + PHP-FPM)
所有请求服务器的请求均返回404错误,提示“File not found”,相关配置文件如下:
Docker Compose 文件
services: nginx: build: ./nginx_docker/ ports: - 80:80 - 443:443 volumes: - ./www/:/var/www/html/ - ./nginx_docker/default.conf:/etc/nginx/conf.d/default.conf php: build: ./php_docker/ expose: - 9000 volumes: - ./www/:/var/www/html/ db: image: mariadb volumes: - mysql-data:/var/lib/mysql environment: - MYSQL_DATABASE=local_db - MYSQL_ROOT_PASSWORD=test volumes: mysql-data:
Nginx Dockerfile
FROM nginx COPY ./default.conf /etc/nginx/conf.d/default.conf
PHP Dockerfile
FROM php:8.2-fpm RUN apt-get update && \ apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \ docker-php-ext-configure gd && \ docker-php-ext-install gd RUN docker-php-ext-install mysqli pdo pdo_mysql RUN docker-php-ext-enable mysqli
排查步骤
1. 检查 Nginx default.conf 配置(核心问题点)
你未提供这个关键配置文件,Nginx 必须正确配置才能将请求转发到 PHP-FPM 并定位到文件。以下是标准可用的配置示例:
server { listen 80; server_name localhost; root /var/www/html; # 必须和容器内挂载的路径完全一致 index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php:9000; # 对应 Docker Compose 里的 PHP 服务名 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 这行是 PHP 找到文件的关键 include fastcgi_params; } }
重点确认:
root路径是否为/var/www/html(与挂载目录匹配)fastcgi_pass是否填写php:9000(容器间通信使用服务名而非 IP)SCRIPT_FILENAME参数是否正确,写错会直接导致 PHP 找不到文件返回404
2. 验证本地 ./www/ 目录的文件与权限
- 确保
./www/目录下存在至少一个入口文件(如index.php),可以创建测试文件快速验证:<?php phpinfo(); ?> - 检查本地目录权限,Docker 内的 Nginx/PHP-FPM 进程默认使用
www-data用户,权限不足会导致容器无法读取文件:chown -R www-data:www-data ./www/ # 或直接赋予可读权限 chmod -R 755 ./www/
3. 确认容器内文件挂载正常
进入 Nginx 容器检查文件是否存在:
docker exec -it $(docker ps -qf "name=nginx") ls /var/www/html/
同样进入 PHP 容器验证:
docker exec -it $(docker ps -qf "name=php") ls /var/www/html/
如果容器内无文件,说明挂载路径有误,检查 Docker Compose 中 volumes 的相对路径是否正确(相对于 Compose 文件所在目录)。
4. 检查 PHP-FPM 运行状态
进入 PHP 容器确认 FPM 进程正常监听:
docker exec -it $(docker ps -qf "name=php") ps aux | grep php-fpm
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

