
Nginx 返回 404 的根本原因是容器内 Web 根目录路径不一致:docker-compose.yml 将代码挂载到 /var/www/html,而 Nginx 配置却指向 /var/www/public,导致静态资源和入口文件无法被正确定位。
nginx 返回 404 的根本原因是容器内 web 根目录路径不一致:`docker-compose.yml` 将代码挂载到 `/var/www/html`,而 nginx 配置却指向 `/var/www/public`,导致静态资源和入口文件无法被正确定位。
在 Laravel 的 Docker 化部署中,Nginx 报 404 Not Found 是高频问题,但往往并非配置逻辑错误,而是路径映射错位所致。从你提供的配置可见:
- docker-compose.yml 中,nginx 服务通过 - ./src/:/var/www/html 将本地 Laravel 项目(含 public/ 目录)挂载至容器内 /var/www/html;
- 而 nginx/conf.d/default.conf 却设置 root /var/www/public; —— 这意味着 Nginx 实际尝试在 /var/www/public 下查找 index.php,但该路径并不存在(真实路径应为 /var/www/html/public)。
✅ 正确做法是统一根目录指向:
将 Nginx 配置中的 root 改为挂载路径下的 public 子目录:
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log debug;
access_log /var/log/nginx/access.log;
root /var/www/html/public; # ✅ 修改此处:/var/www/html → /var/www/html/public
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}⚠️ 关键注意事项:
- 不要修改 volumes 挂载路径(如改成 - ./src/:/var/www/public),否则 PHP-FPM 容器(app 服务)将无法读取 Laravel 源码(它依赖 /var/www/html 下的 artisan、composer.json 等);
- 确保 ./src/ 目录结构正确:必须包含 public/、app/、bootstrap/ 等标准 Laravel 目录;
- 修改 Nginx 配置后,需重启 nginx 容器生效:docker-compose restart nginx;
- 可进入容器验证路径是否存在:docker-compose exec nginx ls -l /var/www/html/public,确认 index.php 可见。
? 进阶建议:
为避免硬编码路径,可在 docker-compose.yml 中为 Nginx 添加环境变量或使用更清晰的挂载别名(如 - ./src:/app),并在 Nginx 配置中同步更新 root /app/public;,提升可维护性。
修复路径一致性后,Nginx 即可正确定位 Laravel 的 public/index.php 入口,404 问题将彻底解决。


















