Docker 带有动态容器的Nginx反向代理

Docker 带有动态容器的Nginx反向代理,docker,nginx,docker-compose,Docker,Nginx,Docker Compose,我有一个反向代理,使用docker compose设置nginx。当我与docker compose up一起运行所有服务时,它完全可以工作。但是,我希望能够运行单个容器,并独立于代理容器启动(docker compose-up-service1)和停止它们。以下是我当前nginx配置的一个片段: server { listen 80; location /service1/ { proxy_pass http://service1/; } location /ser

我有一个反向代理,使用docker compose设置nginx。当我与
docker compose up
一起运行所有服务时,它完全可以工作。但是,我希望能够运行单个容器,并独立于代理容器启动(
docker compose-up-service1
)和停止它们。以下是我当前nginx配置的一个片段:

server {
  listen 80;

  location /service1/ {
    proxy_pass http://service1/;
  }

  location /service2/ {
    proxy_pass http://service2/;
  }
}
现在,如果我同时运行service1、service2和代理,一切都会很好。但是,例如,如果我只运行代理和service2,我会得到以下错误:
在/etc/nginx/conf.d/default.conf:13的上游“service1”中找不到主机。这里我想要的行为就是抛出一些HTTP错误,当服务出现时,正确地路由到它


有什么方法可以实现这种行为吗?

听起来您需要使用负载平衡。我相信通过负载平衡,它将尝试在服务器/服务之间共享负载。如果其中一个发生故障,它应该自动使用其他的

范例

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}

文档:

您的问题在于nginx。如果无法解析其中一个上游主机名,它将无法启动

在您的情况下,如果服务未启动,docker服务名称将无法解析

尝试其中一种解决方案,例如在位置级别解析


(编辑)下面的示例对我很有用:

events {
  worker_connections  4096;
}

http {
  server {
    location /service1 {
        resolver 127.0.0.11;
        set $upstream http://service1:80;
        proxy_pass    $upstream;
    }

    location /service2 {
        resolver 127.0.0.11;
        set $upstream2 http://service2:80;
        proxy_pass    $upstream2;
    }
  }
}

我不认为这正是我想要的。当nginx找不到服务1时,并不是因为它意外宕机,而是因为我故意不运行它,所以我希望/service1路由返回404(或其他错误)。然而,在现实世界中,可能是这样的情况-当有人因为任何原因导致服务宕机时,他们不希望自己的站点宕机,他们希望能够在自己的时间内做任何他们想做的事情,在空闲时恢复服务,而不需要停机-这是负载平衡器的一个目的我相信我想要的是我描述的行为,而不是我尝试过的负载平衡器。我最初的错误是
没有定义解析程序来解析…
。将解析器设置为127.0.0.11修复了此问题。但是,它不能正常工作。配置:
set$upstream服务;代理传递http://$upstream/
我只能请求索引(
/
),无论我转到哪个url。但是,如果我只是通过代理http://service/;它工作正常(只要服务在代理之前启动,这就是我试图避免的)。@JohnHoward我已经更新了配置-这个版本似乎适合我。即使service1或service2未启动,nginx也会启动。您还可以通过在location指令中包含
rewrite
url规则来请求任何您喜欢的上游url(而不仅仅是/),这是标准指令无法做到的。也许,如果您添加一个Lua模块,您可以编写一个脚本,但不确定该脚本。