Docker化环境Nginx配置问题:Laravel路径指向异常
解决Docker环境下Nginx代理Laravel的404问题
问题核心
访问http://localhost:8000/laravel返回404,Nginx日志显示尝试读取/etc/nginx/html/index.php,而非预期的/usr/src/app路径,原因是Nginx配置的路径解析逻辑错误,未正确关联Laravel容器的文件路径。
排查出的问题点
- 全局根目录未配置:Nginx server块未设置全局
root,导致try_files中的/index.php默认指向Nginx内置的根目录/etc/nginx/html。 - 路径前缀未处理:访问
/laravel路径时,Nginx未去掉前缀直接查找文件,导致尝试读取/usr/src/app/laravel/index.php(实际Laravel的index.php在/usr/src/app/),且兜底的/index.php因无全局root而走默认路径。 - 环境变量替换遗漏:
entrypoint.sh未包含NGINX_ROOT变量,导致模板中的${NGINX_ROOT}无法被正确替换。
修复步骤
1. 修改Nginx配置模板(fpm-template.conf)
更新server块和/laravel location的逻辑,确保路径解析正确:
server { listen 80; # 设置全局根目录,与Laravel容器内的路径一致 root ${NGINX_ROOT}; index index.php; gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon; location /react { proxy_pass http://${NGINX_NODE_HOST}:${NGINX_NODE_PORT}; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } location /laravel { # 重写URI,去掉/laravel前缀,让Laravel处理正确的路径 rewrite ^/laravel/(.*)$ /$1 break; try_files $uri $uri/ /index.php?$query_string; location ~ \.php$ { include fastcgi_params; fastcgi_pass ${NGINX_FPM_HOST}:${NGINX_FPM_PORT}; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; # 传递前缀信息,确保Laravel生成正确的URL fastcgi_param HTTP_X_FORWARDED_PREFIX /laravel; } } client_max_body_size 2m; }
2. 更新entrypoint.sh,补全环境变量替换
添加$NGINX_ROOT到envsubst的变量列表,确保模板中的${NGINX_ROOT}能被正确替换:
#!/bin/bash envsubst '$NGINX_REACT_ROOT $NGINX_LARAVEL_ROOT $NGINX_FPM_HOST $NGINX_FPM_PORT $NGINX_NODE_HOST $NGINX_NODE_PORT $NGINX_ROOT' < /etc/nginx/fpm.tmpl > /etc/nginx/conf.d/default.conf exec nginx -g "daemon off;"
3. 调整docker-compose.yaml中的Nginx挂载(可选但建议)
确保Nginx容器能访问Laravel的静态资源,若需要更完整的路径匹配,可添加全目录挂载:
dev_nginx: # ...其他配置不变 volumes: - .:/usr/src/app # 添加此行,确保Nginx能解析文件路径(可选) - ./public:/usr/src/app/public
验证方法
- 重启所有容器:
docker-compose down && docker-compose up --build - 访问
http://localhost:8000/laravel,确认返回Laravel页面而非404 - 查看Nginx日志:
docker logs dev_nginx,确认不再出现/etc/nginx/html/index.php的错误路径
内容的提问来源于stack exchange,提问作者domjanzsoo
相关产品推荐
相关产品推荐

