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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:23:20