【问题标题】:Load balancer/reverse proxy: "upstream server temporarily disabled while connecting to upstream" in docker-swarm?负载均衡器/反向代理:docker-swarm 中的“上游服务器在连接到上游时暂时禁用”?
【发布时间】:2019-10-12 01:07:20
【问题描述】:

我在 docker-swarm 中运行 1 个管理器和 2 个工作节点。

工作节点运行 3 个堆栈与 php/nginx 网站,因此在浏览器中加载“This is site*/(worker1 or worker2)”的 site1、site2、site3。 当我在其中一个节点上放置反向代理时,效果很好。

但我想在管理节点上放置一个负载均衡器/反向代理,我还禁用了其他 2 个堆栈,因此在此示例中,只有“site1”堆栈位于两个工作节点上。他们的IP是“10.0.14.16”和“10.0.14.17”。

这是 LB/RP nignx 配置文件。

   upstream site1_nginx  {
     server 10.0.14.16;
     server 10.0.14.17;
   }
   server {
       listen 80;
       server_name site1.local;

       location / {
           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 http://site1_nginx;

       }
   }

这是 nignx 的 docker compose 文件:

version: '3'

services:
  nginx:
      image: nginx:latest
      deploy:
        placement:
          constraints:
            - node.role==manager
        mode: global
      ports:
          - "80:80"
      volumes:
          - "./conf.d/:/etc/nginx/conf.d"

      networks:
          - reprox
networks:
  reprox:
    external: true

但我在创建服务时收到此错误:

loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:00 [error] 6#6: *12 connect() failed (111: Connection refused) while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.17:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:00 [warn] 6#6: *12 upstream server temporarily disabled while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.17:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:00 [error] 6#6: *12 connect() failed (111: Connection refused) while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.16:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:00 [warn] 6#6: *12 upstream server temporarily disabled while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.16:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1    | 2019/10/11 14:36:01 [error] 6#6: *12 no live upstreams while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://site1_nginx/", host: "site1.local"

另外如果需要,site1 nginx 站点配置:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    index index.php index.html;
    server_name site1.local;
    resolver 127.0.0.11;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /code;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        set $upstream php:9000;        
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $upstream;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

docker 网络很好,我在 php 和 nignx 之间确实有一个覆盖网络和网络。

【问题讨论】:

    标签: docker nginx load-balancing reverse-proxy docker-swarm


    【解决方案1】:

    Docker swarm 有自己的负载均衡器、网络和 DNS 系统。如果您想使用自己的平衡器,则无需定义节点的 IP 地址,因为 docker 提供了抽象并为您管理服务发现。

    由于routing mesh,使用 IP 路由的解决方案不会像您想象的那样工作。所有请求都得到负载平衡,而不考虑获取流量的节点。您可以访问 IP1 并且由于路由网格 IP2 可以处理请求。

    您想要将您的站点称为您定义为服务名称的 DNS 记录。

    这样

    upstream site1_nginx  {
        server site1:80;
    }
    

    site1docker-compose.yml中定义的服务名称(nginx的DNS名称为nginx)。

    您可以将服务称为特定副本,但您需要自己实施健康检查。

    upstream site1_nginx  {
        server site1.1:80;
        server site1.2:80;
        server site1.3:80;
    }
    

    【讨论】:

    • 我只是得到这个错误:``` loadbalancer_nginx.0.sfs1ty1pajt9@ubuntu-vm1 | 2019/10/14 09:47:16 [错误] 6#6: *5 连接到上游时没有实时上游,客户端:10.255.0.2,服务器:,请求:“GET / HTTP/1.1”,上游:“@ 987654322@", host: "site1.local" ``` 当我删除并创建服务时:``` 在 /etc/nginx/conf.d/site1.conf 的上游“site1:80”中找不到主机:10 ```
    • 你有 nginx 作为 docker swarm 服务网络的一部分,还是单独安装在主机上?
    • 有一个名为“reprox”的覆盖网络,正如您在 docker compose 文件中看到的那样,它指定 nginx LB/RP 连接到它,site1_nginx 也连接到该网络(即 nginx 是在工作节点的堆栈中与 site1_php 一起运行,php 通过单独的网络连接到该 nginx)。就像我说的,当我在工作节点上运行反向代理时,它会加载站点,但是当我删除该反向代理并将其放在没有任何服务的管理器节点上时,它不会自动连接到堆栈工作节点,即使它们在同一个“reprox”网络上。
    • 我关注这个教程:thepolyglotdeveloper.com/2017/05/… 但它不会让我有这个部分:```worker_processes 1;事件 {worker_connections 1024; } http { 发送文件; ``` 所以当我删除这些行时 nginx 会加载,但是我得到 502 bad gateway。
    • 我也更新了这个问题。 stackoverflow.com/questions/58393434/…
    猜你喜欢
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2022-10-15
    • 2017-07-27
    • 2019-05-31
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多