簡體   English   中英

服務重置時 NGINX 需要重新啟動

[英]NGINX requires restart when service reset

我們在 docker swarm 中使用 NGINX 作為反向代理。 NGINX 位於覆蓋網絡內,並將外部請求中繼到相關的 swarm 服務。

但是我們有一個問題,每次我們重新啟動/更新或以其他方式關閉 swarm 服務時,NGINX 都會返回502 Bad Gateway 即使在服務重新啟動后,NGINX 仍會繼續提供502服務,並且直到我們重新啟動 NGINX 服務才能糾正這種情況,這顯然違背了在多個地方運行負載均衡器和服務的全部意義。

這是我們的 NGINX CONF:

events {}
http {
  fastcgi_buffers 16 16k;
  fastcgi_buffer_size 32k;
  client_max_body_size 20M;

  large_client_header_buffers 8 256k;
  client_header_buffer_size 256k;

  proxy_buffer_size          128k;
  proxy_buffers              4 256k;
  proxy_busy_buffers_size    256k;

  map $host $client {
     default clientname;
  }

  #Healthcheck
  server {
    listen 443;
    listen 444;
    location /is-healthy {
      access_log off;
      return 200;
    }
  }

 #Example service:
  server {
     listen 443;
     server_name scheduler.clientname.com;

     location / {
        resolver 127.0.0.11 ipv6=off;
        proxy_pass http://$client-scheduler:60911;
        proxy_http_version 1.1;

        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
     }
  }

  #catchll 
  server {
     listen 443;
     listen 444;
     server_name _;

     location / {     
         return 404 'Page not found';
     }
  }
}

我們使用 $client 占位符,否則當其中一項服務關閉時我們甚至無法啟動 nginx。

另一種選擇是使用具有健康檢查的上游指令,它可以很好地工作。 問題在於,如果任何服務不可用,NGINX 甚至不會啟動!

我們做錯了什么?

更新看起來我們想要的東西是不可能的(盡管請證明我錯了!)。 在 docker 和微服務的世界里錯過這樣一個功能似乎很瘋狂!

我們目前正在將 HAPROXY 作為替代方案,因為可以使用default-server init-addr none進行設置,以防止啟動失敗。

這是我的做法,創建一個 max_fails=0 的上游

    upstream docker-api {
        server docker.api:80 max_fails=0;
    }


    # load configs
    server {
        listen 80;
        listen [::]:80;

        server_name localhost;

        location /api {
            proxy_pass http://docker-api;
            proxy_http_version  1.1;
            proxy_cache_bypass  $http_upgrade;

            # Others config...
        }

    }

我在使用 docker-compose 時遇到了同樣的問題。 docker-compose restart后,Nginx 容器無法連接 Web 服務。

最后,我找出了導致此故障的兩種情況。 首先,docker docker-compose restart不遵循depends_on,它應該在web 重啟后重啟nginx。 其次, docker-compose restart給容器docker-compose restart分配一個新的內部ip地址,nginx啟動后不刷新web地址。

我的解決方案是定義一個變量來強制 nginx 每次解析 ip:

location /api {
    $web_service "http://web_container_name:13579"
    proxy_pass $web_service;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM