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

Docker-Compose部署Nginx代理时提示upstream 'frontend:80'主机未找到

Nginx代理容器无法解析frontend上游主机问题排查

问题场景

尝试用Docker Compose搭建Nginx代理容器,指向另一个运行Nginx的frontend前端容器,两者各有独立配置文件,但代理容器启动时出现上游主机找不到的错误。

配置文件

docker-compose.yml

version: '3'
services:
  frontend:
    restart: always
    hostname: frontend
    build:
      context: ./demo-project
    healthcheck:
      test: ["CMD-SHELL", "wget -qO- http://frontend/ping || exit 1"]
      interval: 1s
      timeout: 3s
      retries: 30
    networks:
      demo-net:
        aliases:
          - frontend

  proxy:
    hostname: proxy
    build:
      context: ./nginx
      dockerfile: Dockerfile
    depends_on:
      frontend:
        condition: service_healthy
    ports:
      - "80:80"
    networks:
      demo-net:
        aliases:
          - proxy
networks:
  demo-net:
    driver: bridge

Nginx代理容器default.conf

upstream frontend_servers {
  server frontend:80;
}

server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass frontend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Nginx代理容器Dockerfile

FROM nginx:latest

COPY ./default.conf /etc/nginx/conf.d/default.conf

错误信息

[emerg] 1#1: host not found in upstream "frontend:80" in /etc/nginx/nginx.conf:26
nginx: [emerg] host not found in upstream "frontend:80" in /etc/nginx/nginx.conf:26

已尝试操作

  • 手动创建Nginx容器加入demo_demo-net网络,进入容器执行ping frontend能成功解析
  • 用Docker Compose生成的镜像手动运行,仍出现相同错误
  • 已给frontend容器添加健康检查,状态显示为健康

疑问点

是否是代理容器在连接到网络前就尝试解析frontend主机导致的问题?


问题原因及解决方法

核心原因

Nginx启动时会强制解析所有上游服务器的IP,即便frontend容器健康检查通过,若Docker网络的DNS解析未完成、或代理容器自身网络初始化未完成,就会触发该错误。

解决方法

方法1:修改Nginx配置,允许上游解析失败后重试

在upstream块中添加Docker内置DNS地址和超时配置,让Nginx不直接崩溃,后续自动重试解析:

upstream frontend_servers {
  server frontend:80;
  resolver 127.0.0.11 valid=30s; # Docker默认内置DNS服务器
  fail_timeout 5s;
}

方法2:给代理容器添加启动前验证脚本

修改代理容器的Dockerfile,新增启动脚本,先确认frontend可访问再启动Nginx:

FROM nginx:latest

COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./start.sh /usr/local/bin/start.sh
RUN chmod +x /usr/local/bin/start.sh

CMD ["/usr/local/bin/start.sh"]

创建start.sh脚本:

#!/bin/bash
# 循环等待frontend可访问
until curl -s http://frontend:80/ping; do
  echo "等待frontend服务就绪..."
  sleep 2
done

# 启动Nginx
nginx -g "daemon off;"

方法3:调整Docker Compose网络配置

在proxy服务中添加links配置辅助DNS解析(v3版本仍可生效):

proxy:
  # 其他配置不变
  links:
    - frontend:frontend

验证要点

  • 执行docker network inspect demo_demo-net,确认两个容器在同一网络内
  • 进入frontend容器执行wget -qO- http://frontend/ping,验证健康检查的有效性

内容的提问来源于stack exchange,提问作者wavor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:42:34