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
相关产品推荐
相关产品推荐

