Docker化多Laravel应用访问返回404及FastCGI脚本未知问题
问题解决:Docker化多Laravel应用时App2访问404(Primary script unknown)
问题现象
使用nginxproxy/nginx-proxy反向代理多个Laravel Docker应用,App1(app1.localhost)访问正常,但App2(app2.localhost)返回404,Server容器日志报错:
[error] 22#22: *7 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.18.0.2, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://172.18.0.3:9000", host: "app2.localhost"
核心原因
App2的Nginx配置文件中,网站根目录路径与PHP容器的代码挂载路径不匹配,导致FastCGI无法找到Laravel的入口脚本(index.php)。
App1的代码挂载到/var/www/client,而App2挂载到/var/www/internal,但你的Nginx配置文件(./nginx/nginx.conf)大概率沿用了App1的路径配置,没有针对App2修改。
解决方案
1. 修改App2的Nginx配置文件
打开App2的nginx/nginx.conf,确保以下配置正确:
server { listen 80; server_name localhost; # 根目录指向Laravel的public目录,路径要和App2的挂载目录一致 root /var/www/internal/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # 确保SCRIPT_FILENAME路径正确 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; } }
重点检查:
root路径:必须是/var/www/internal/public(对应App2中代码挂载到/var/www/internal)fastcgi_param SCRIPT_FILENAME:必须使用$document_root$fastcgi_script_name,保证动态路径正确
2. 重启App2容器
修改配置后,重新构建并启动App2:
cd app2 docker-compose down docker-compose up -d --build
3. 额外验证
- 进入App2的PHP容器,确认代码存在于
/var/www/internal目录:
应该能看到Laravel的目录结构(app、public、vendor等)docker exec -it app2-php-1 ls /var/www/internal - 进入App2的Nginx容器,确认配置文件已正确挂载:
检查root路径是否为docker exec -it app2-server-1 cat /etc/nginx/conf.d/default.conf/var/www/internal/public
补充说明
不需要在App2的docker-compose中暴露8002、9002端口,因为nginx-proxy已经负责反向代理,暴露端口会造成端口冲突风险,直接去掉即可:
# 移除这两行 ports: - '8002:80'
PHP容器的9002端口也可以移除,因为内部网络已经可以访问。
内容的提问来源于stack exchange,提问作者Muh Kusnadi
相关产品推荐
相关产品推荐

