Nginx反向代理与动态容器

时间:2018-08-06 01:37:40

标签: docker nginx docker-compose

我有一个使用docker compose设置的nginx反向代理。当我与<html> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css"> <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script> </head> <body> <!-- Bootstrap docs: https://getbootstrap.com/docs --> <div id="myGroup" class="container"> <div class="panel"> <h2>My "collapse" example</h2> <div class="row"> <div class="col-sm-6"> <h3>SOME STATIC TEXT</h3> </div> <div class="col-sm-3"> <a class="btn btn-link" id="checkout_click" data-toggle="collapse" href="#collapseOne" role="button" aria-expanded="false" aria-controls="collapseOne"> <strong>LINK BUTTON</strong> </a> </div> <div class="col-sm-3"> <a class="btn btn-danger btn-lg btn-block text-bold" id="booking_click" data-toggle="collapse" href="#collapseTwo" role="button" aria-expanded="false" aria-controls="collapseTwo"> <strong>BUTTON</strong> </a> </div> </div> <div class="row"> <div class="col-sm-12"> <div class="collapse" id="collapseOne"> <div class="bg-info text-white first"> FIRST ROW CONTENT </div> </div> </div> <div class="col-sm-12"> <div class="collapse" id="collapseTwo"> <div class="bg-success text-white second"> SECOND ROW CONTENT </div> </div> </div> </div> </body> </html>一起运行所有服务时,它可以完全正常工作。但是,我希望能够运行单个容器,并独立于代理容器启动(docker-compose up)和停止它们。这是我当前的nginx配置的片段:

docker-compose up service1

现在,如果我同时运行service1,service2和代理,一切都很好。但是,例如,如果我运行代理并且仅运行service2,则会出现以下错误:server { listen 80; location /service1/ { proxy_pass http://service1/; } location /service2/ { proxy_pass http://service2/; } } 。我要在这里执行的操作是仅引发一些HTTP错误,并在该服务确实出现时适当地路由到它。

有什么办法可以得到这种行为?

2 个答案:

答案 0 :(得分:1)

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

示例

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

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

文档:http://nginx.org/en/docs/http/load_balancing.html

答案 1 :(得分:1)

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

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

请尝试一种解决方案here,例如在位置级别进行解决。


(编辑)以下示例对我有用:

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;
    }
  }
}