容器外Nginx代理容器内PHP-FPM报错:upstream主机'app'无法找到
解决Nginx无法解析upstream主机'app'的问题
问题根源
Docker Compose里的服务名app是Docker内部网桥网络的专属域名,只有同一Docker网络里的容器能直接识别。VM里的Nginx不在这个网络体系内,自然找不到app这个主机。
快速修复:改用VM本地地址
因为你的Docker容器已经把9000端口映射到了VM的9000端口,直接修改Nginx配置里的fastcgi_pass即可:
- 编辑Nginx站点配置:
location ~ \.php$ { try_files $uri =404; fastcgi_pass localhost:9000; # 替换原来的 app:9000 fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
- 重启Nginx生效:
sudo systemctl restart nginx
进阶方案:让Nginx加入Docker网络
如果想继续用app作为主机名,可将VM的Nginx接入Docker Compose的网络:
- 先查询Docker Compose创建的网络名:
docker network ls # 一般格式为「项目目录名_default」,比如 backend_prep_default
- 将VM的默认网络接口接入该Docker网络(需root权限):
# 替换 YOUR_NETWORK_NAME 为上一步查到的实际网络名 docker network connect YOUR_NETWORK_NAME docker0
操作完成后,Nginx就能直接解析app主机名,无需修改原有配置。
额外检查项
- 确认Nginx的
root路径正确:当前配置的/var/www/public需对应到你的项目目录,应修改为/var/www/backend/prep/public,否则后续会出现文件找不到的错误。 - 确保Docker容器正常运行:执行
docker-compose up -d启动容器,再用docker-compose ps检查容器状态。
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

