You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose启动Nginx报host not found in upstream "php"错误

错误根因

报错host not found in upstream "php"是两个配置问题叠加导致的:

  1. Docker Compose内置的服务发现机制,会使用yaml里services下定义的服务名作为内部访问域名,你配置里PHP服务的名称是app,但nginx.conf里写的上游地址是php:9000,内部DNS找不到名为php的服务,自然解析失败
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:01:04