Docker环境下Nginx访问API路由出现404 Not Found问题求助
解决方案:Docker环境下Nginx访问API返回404的排查步骤
1. 检查Nginx站点核心配置(default.conf)
你仅提供了全局nginx.conf,但实际处理请求的是conf.d/default.conf,这个文件的配置错误是404的最常见诱因。请确保配置正确指向PHP-FPM容器,且根目录与挂载路径匹配:
示例正确的default.conf配置:
server { listen 80; server_name localhost; # 根目录需匹配nginx容器内的项目路径:你的nginx挂载了 .:/var/www/html/,app容器工作目录为/var/www/html/app root /var/www/html/app; index index.php index.html; # 适配API框架的路由重写(如Laravel/ThinkPHP等) location / { try_files $uri $uri/ /index.php$is_args$args; } # 转发PHP请求到PHP-FPM容器 location ~ \.php$ { fastcgi_pass app:9000; # 同网络下直接用容器名访问,无需映射外部端口 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 静态文件直接返回,减少PHP-FPM负载 location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ { expires max; log_not_found off; } }
2. 确认挂载路径一致性
app容器挂载规则:.:/var/www/html/app,工作目录也为此路径nginx容器挂载规则:.:/var/www/html/,因此nginx内的项目根目录必须设为/var/www/html/app,否则nginx无法找到你的PHP文件
3. 验证PHP-FPM连通性
在nginx容器内测试与app容器的PHP-FPM连接:
# 进入nginx容器 docker exec -it app-nginx sh # 测试PHP-FPM响应 curl -X POST http://app:9000 -d "SCRIPT_NAME=/index.php&REQUEST_METHOD=GET"
返回PHP相关内容则连接正常;若超时,检查网络配置(你的app_api桥接网络配置无误,容器应能互相访问)
4. 修复文件权限问题
容器内项目文件权限错误会导致nginx或PHP-FPM无法读取文件:
# 进入app容器 docker exec -it app sh # 基础权限设置 chown -R www-data:www-data /var/www/html/app chmod -R 755 /var/www/html/app # 若为Laravel等框架,需额外设置存储目录权限 chmod -R 775 /var/www/html/app/storage
5. 查看日志定位具体错误
通过日志排查404的根本原因:
# 查看nginx错误日志 docker logs app-nginx # 查看PHP-FPM运行日志 docker logs app
日志会明确显示是文件不存在、权限不足还是路由配置错误。
额外注意事项
app容器的9002:9000端口映射是对外暴露的,nginx无需使用此端口,同网络内直接通过容器名app:9000访问即可- 确保你的API框架已开启URL重写,且根目录配置与容器内路径一致
内容的提问来源于stack exchange,提问作者bhabishya chaudhary
相关产品推荐
相关产品推荐

