web-dev-qa-db-fra.com

Service HAproxy 503 non disponible Aucun serveur n'est disponible pour traiter cette demande

Je suis nouveau dans ce scénario d'équilibrage de charge et je suis chargé de comprendre comment faire fonctionner cet équilibrage de charge.

Mon environnement:

Centos 6.4 64 Bit
Webserver: Lighttpd
All running in ESXI
virtual IP: 192.168.1.6
LB1: 192.168.1.4
LB2: 192.168.1.5
Webserver 1: 192.168.1.12
Webserver 2: 192.168.1.13
Gateway: 192.168.1.1

Essayer d'exécuter un test en laboratoire avant la production avec HAproxy et keepalived. Voici ce que j'ai sur mon paramètre Keepalived:

! Fichier de configuration pour keepalived

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.1.4
   smtp_connect_timeout 30
   router_id 192.168.1.1
}

vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 1                     # check every second
weight 2                       # add 2 points of prio if OK
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101  #priority 101 for master
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.6

    }

    track_script {
    chk_haproxy
            }

            }

et voici mon réglage pour HAproxy

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
#    acl url_static       path_beg       -i /static /images /javascript /stylesheets
#    acl url_static       path_end       -i .jpg .gif .png .css .js

#    use_backend static          if url_static
#    default_backend             view

#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
#    balance     roundrobin
#    server      static 127.0.0.1:4331 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
mode tcp
    balance     roundrobin
    server  server1 192.168.1.12:80 check inter 2000 rise 2 fall 5
    server  server2 192.168.1.13:80 check inter 2000 rise 2 fall 5

Lorsque j'ai démarré HAproxy, j'ai eu cette erreur et je ne sais pas trop par où commencer à chercher à le réparer. Peut-être que quelqu'un qui a fait cela plusieurs fois peut m'aider à faire la lumière?

503 Service Unavailable No server is available to handle this request. 

Cependant, la connexion manuelle au serveur Web1 et au serveur Web2 fonctionne très bien.

Tout ce que je veux, c'est juste un simple équilibrage de charge pour le serveur Web qui se trouve derrière le HAproxy. Tout conseil ou suggestion est absolument apprécié. Veuillez aider? Merci beaucoup.

8
Le Dude

Je n'ai jamais utilisé HAproxy mais une recherche rapide m'amène à penser que vous devez ajouter default_backend app juste en dessous frontend main *:80. Je ne vois nulle part dans cette configuration reliant le backend et le frontend ensemble.

5
yoonix

Le problème est dans votre configuration HAProxy. Lorsque je supprimerai tous les commentaires de votre configuration, j'obtiendrai ceci:

global
  log         127.0.0.1 local2

  chroot      /var/lib/haproxy
  pidfile     /var/run/haproxy.pid
  maxconn     4000
  user        haproxy
  group       haproxy
  daemon

  stats socket /var/lib/haproxy/stats

defaults
  mode                    http
  log                     global
  option                  httplog
  option                  dontlognull
  option http-server-close
  option forwardfor       except 127.0.0.0/8
  option                  redispatch
  retries                 3
  timeout http-request    10s
  timeout queue           1m
  timeout connect         10s
  timeout client          1m
  timeout server          1m
  timeout http-keep-alive 10s
  timeout check           10s
  maxconn                 3000

frontend  main *:80

backend app
  mode tcp
  balance roundrobin
  server  server1 192.168.1.12:80 check inter 2000 rise 2 fall 5
  server  server2 192.168.1.13:80 check inter 2000 rise 2 fall 5

Et maintenant, vous pouvez clairement voir qu'il n'y a aucune configuration de frontend. Les demandes arrivent à HAProxy via frontend main mais HAProxy ne sait pas quels serveurs sont fiables pour le gérer, donc il retournera 503.

Vous devez lier le backend au frontend avec default_backend ou avec acl.

Vous devez également utiliser des statistiques, non seulement avec socket mais aussi avec une interface Web protégée. Je peux vous montrer des informations sur les clusters derrière haproxy, les serveurs hors ligne, les problèmes, les temps de réponse, etc. Très utile pour le débogage.

5
Ondra Sniper Flidr

J'ai reçu une erreur similaire car HAProxy pensait que mon backend était en panne en raison du contrôle de santé par défaut. J'ai désactivé le bilan de santé et le 503 est parti.

J'utilise l'interface graphique de pfsense: enter image description here

2
Charlie

J'ai eu une configuration légèrement différente donc ce n'est pas la réponse à votre problème spécifique, mais cela peut aider les autres personnes rencontrant l'erreur 503 avec HAProxy.

Mon Haproxy a été configuré comme ceci:

use_backend be_external-service-1-0 if { hdr_beg(Host) -i external-service-1-0 }

ce qui signifie que le backend ne sera utilisé que si l'en-tête Host commence par external-service-1-0.

Dans mon cas, la raison de l'erreur 503 était que le client envoyait les en-têtes de demande suivants:

X-App-Id: 98d77fae1082342342323423423452ae203489234

Hôte: external-service-1-0.prod-drb-external.svc.cluster.local: 8080 Connexion: Keep-Alive

Notez cette ligne supplémentaire entre X-App-Id et Host. Une ligne vide fait croire à HAProxy que c'est la fin des en-têtes HTTP, donc il a ignoré l'en-tête Host et n'a pas pu trouver le backend correct.

1
stefan.m