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

Docker部署Nginx+PHP访问localhost:8080报404错误问题求助

问题现象

访问localhost:8080时返回404 Not Found错误,多次调整PHP Dockerfile与Nginx配置仍未定位根因;相近配置部署Laravel项目可正常运行,当前项目为非Laravel原生PHP项目,本地myapp目录下已包含index.php及全部项目文件。

核心错误日志

*1 open() "/var/www/html/myapp404" failed (2: No such file or directory)

当前配置清单

  • docker-compose配置
version: '3.8'
services:
    nginx:
        build:
            context: .
            dockerfile: nginx.dockerfile
        ports:
            - 8080:80
        depends_on:
            - php
            - mysql
    php:
        build:
            context: .
            dockerfile: php.dockerfile
        container_name: php
        volumes:
        - ${PWD}/myapp:/var/www/html/myapp
        working_dir: /var/www/html/myapp
        ports:
        - "9000:9000"
    mysql:
        image: yobasystems/alpine-mariadb
       
        ports:
        - "3308:3308"
        volumes:
        - ./mariadb/data:/var/lib/mysql
        - ./mariadb/my.conf:/etc/my.cnf
        environment:
            MYSQL_ROOT_PASSWORD: "111"
            MYSQL_DATABASE: myapp
            MYSQL_USER: root
            MYSQL_PASSWORD: "111"
            restart: always
  • Nginx站点配置default.conf
server {
 
  listen 80;
    index index.php index.html;
    server_name localhost;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/myapp;
    
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
  # pass the PHP scripts to FastCGI server listening on php:9000
  location ~ \.php$ {
    try_files $uri = 404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}
  • Nginx镜像Dockerfile
FROM nginx:stable-alpine
ADD nginx/default.conf /etc/nginx/conf.d/default.conf
  • PHP镜像Dockerfile
FROM dwchiang/nginx-php-fpm:latest

根因定位&修复方案

核心问题1:Nginx容器未挂载项目代码目录

当前配置仅在php服务下绑定了项目目录的volume,独立运行的nginx容器内部不存在/var/www/html/myapp路径,没有任何项目文件。Nginx处理请求时会优先按try_files $uri =404;规则在本地文件系统校验文件是否存在,因路径不存在触发404逻辑时出现路径拼接异常,直接导致日志中出现查找/var/www/html/myapp404的报错。

修复方式:在docker-compose的nginx服务下添加和php服务一致的volume挂载配置,保证Nginx容器内能访问项目静态文件、正常校验php文件路径:

nginx:
  build:
    context: .
    dockerfile: nginx.dockerfile
  ports:
    - 8080:80
  # 新增以下挂载配置
  volumes:
    - ${PWD}/myapp:/var/www/html/myapp
  depends_on:
    - php
    - mysql

核心问题2:PHP基础镜像选型错误

使用的dwchiang/nginx-php-fpm:latest为Nginx与PHP-FPM打包的一体镜像,并非纯PHP-FPM服务镜像。php容器启动时会自动拉起镜像内置的Nginx服务,既会和预期的9000端口FPM服务产生端口冲突,镜像内置的默认站点配置也仅对Laravel框架做了适配,这就是同配置下Laravel可正常运行、原生PHP项目报错的直接原因。

修复方式:替换PHP镜像为官方纯FPM版本镜像,修改php.dockerfile内容,版本可根据自身需求调整:

# 选用官方纯php-fpm alpine镜像,体积更小
FROM php:8.2-fpm-alpine
# 按需安装项目依赖的PHP扩展,比如MySQL连接相关扩展
RUN docker-php-ext-install pdo_mysql

额外校验点

  • 确认本地myapp目录权限不低于755,容器内运行Nginx、PHP-FPM的用户拥有目录读取权限
  • 修改完配置后先执行docker compose down -v清除旧容器与缓存卷,再执行docker compose up --build -d重新构建启动,避免旧容器配置缓存影响
  • 启动后可执行docker compose exec nginx ls /var/www/html/myapp确认容器内可正常看到index.php文件,再访问页面测试

内容的提问来源于stack exchange,提问作者MD66

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:24:22