Nginx 从 docker-compose 运行返回“在上游找不到主机”

Posted

技术标签:

【中文标题】Nginx 从 docker-compose 运行返回“在上游找不到主机”【英文标题】:Nginx run from docker-compose returns "host not found in upstream" 【发布时间】:2020-06-15 03:11:58 【问题描述】:

我正在尝试通过将 nginx 与此 docker-compose 一起使用来创建针对应用的反向代理:

version: '3'
services:
  nginx_cloud:
    build: './nginx-cloud'
    ports:
        - 443:443
        - 80:80
    networks:
        - mynet
    depends_on:
        - app

  app:
    build: './app'
    expose:
        - 8000
    networks:
        - mynet

networks:
    mynet:

这是我的 nginx conf(缩短):

 server 
  listen 80;
  server_name reverse.internal;

  location / 
    # checks for static file, if not found proxy to app
    try_files $uri @to_app;
  

  location @pto_app 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app:8000;
  
 

当我运行它时,nginx返回:

[emerg] 1#1: host not found in upstream "app" in /etc/nginx/conf.d/app.conf:39

Itriedseveralotherproposedsolutionswithoutanysuccess。奇怪的是,如果我从它工作的容器内部通过 shell 访问手动运行 nginx,我可以 ping app 等。但是从 docker-compose 或直接通过 docker 运行它 本身不起作用。

我尝试设置一个单独的上游,添加 docker 内部解析器,等待几秒钟以确保应用程序已经在运行等,但没有运气。我知道这个问题已经被问过好几次了,但到目前为止似乎没有任何效果。

【问题讨论】:

【参考方案1】:

你能试试下面的服务器定义吗?

server 
    listen       80;
    server_name  reverse.*;

    location / 
        resolver 127.0.0.11 ipv6=off;

        set $target http://app:8080;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass $target;
    


【讨论】:

谢谢,现在我不再收到错误消息,但 nginx 立即退出:“nginx_cloud exited with code 0”来自 docker-compose 或直接通过 docker 运行。日志显示没有任何活动。 好吧,这并没有真正解决它,但它有所帮助,因为使用变量时 nginx 似乎没有超时(??)所以这为我指明了另一个方向:重新启动我的计算机。 docker发生了一些不明显的事情并重新启动解决了它。此外,这不是加载顺序的问题,因为应用程序几乎是立即加载的(我在 nginx 中添加了一个 wait-for-it.sh 以确保在应用程序之后加载 nginx)。谢谢你和马克西姆。【参考方案2】:

app 服务可能无法及时启动。 要诊断问题,请尝试两步法:

docker-compose up -d app

等待 15-20 秒(或应用启动并准备就绪所需的任何时间)

docker-compose up -d nginx_cloud

如果有效,那么您必须在nginx_cloud 服务中更新entrypoint 以等待app 服务。

【讨论】:

以上是关于Nginx 从 docker-compose 运行返回“在上游找不到主机”的主要内容,如果未能解决你的问题,请参考以下文章

在 docker-compose、nginx、mysql 和 php 上运行 wordpress

docker run 和 docker-compose 配置挂载 Volume 并运行 nginx

尝试使用带有自定义 conf.d 的 docker-compose 运行 nginx 时出错

从 docker-compose 替换 NGINX 配置中的环境变量

使用 nginx 将环境变量从 docker-compose 传递到 vue 应用程序

Docker-compose + Nginx SSL反向代理