Docker Compose启动Nginx报host not found in upstream "php"错误
错误根因
报错host not found in upstream "php"是两个配置问题叠加导致的:
- Docker Compose内置的服务发现机制,会使用yaml里
services下定义的服务名作为内部访问域名,你配置里PHP服务的名称是app,但nginx.conf里写的上游地址是php:9000,内部DNS找不到名为php的服务,自然解析失败 - Nginx默认会在启动阶段强制校验所有上游域名的可解析性,就算把服务名改对,如果Nginx启动瞬间PHP-FPM服务还没完成初始化,依然会抛出同类解析错误导致启动失败
修复方案
按以下顺序调整配置即可解决:
- 修正nginx.conf中的上游服务名
打开./nginx/conf.d/nginx.conf,找到第12行的fastcgi_pass php:9000;,把域名改成docker-compose里定义的PHP服务名app,同时用变量形式传值绕过Nginx启动时的强校验:location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; set $fpm_host app; fastcgi_pass $fpm_host:9000; # 替换原来的php:9000配置 fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } - 在nginx.conf的http层级添加Docker内置DNS配置
在server块外部(和server块同级)添加resolver配置,指定Docker内部DNS地址,避免运行时解析失败:resolver 127.0.0.11 ipv6=off valid=10s; server { listen 80; index index.php index.html; server_name localhost; root /var/www/public; # 其余原有server配置保持不变 } - (可选)优化服务启动依赖顺序
打开docker-compose.yaml,给app服务添加健康检查,调整webserver的依赖规则,确保PHP服务就绪后再启动Nginx:version: '3' services: webserver: build: context: . dockerfile: Dockerfile.nginx ports: - '8000:80' image: nginx container_name: nginx_cont restart: unless-stopped volumes: - ./src:/var/www - ./nginx/conf.d:/etc/nginx/conf.d/ depends_on: app: condition: service_healthy # 等app健康检查通过再启动 app: build: context: . dockerfile: Dockerfile.laravel image: laravel container_name: laravel_cont restart: unless-stopped volumes: - ./src:/var/www - ./src/config/php/local.ini:/usr/local/etc/php/conf.d/local.ini healthcheck: # 添加PHP-FPM健康检查 test: ["CMD-SHELL", "php-fpm -t"] interval: 3s timeout: 2s retries: 5 - 重启服务生效
清理旧的故障容器,重新构建启动:docker-compose down docker-compose up -d --build
验证
执行docker-compose ps查看容器状态,nginx_cont和laravel_cont状态均为Up即启动成功,访问http://localhost:8000可正常加载Laravel首页。
内容的提问来源于stack exchange,提问作者Saurav
相关产品推荐
相关产品推荐

