HAproxy 503-Dienst nicht verfügbar Für diese Anforderung ist kein Server verfügbar

8

Ich bin neu in diesem Lastausgleichsszenario und muss herausfinden, wie dieser Lastausgleich funktioniert.

Meine Umgebung:

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

Der Versuch, vor der Produktion mit HAproxy einen Test im Labor durchzuführen und zu erhalten. Folgendes habe ich in meiner Keepalived-Umgebung:

! Konfigurationsdatei für 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
            }

            }

und hier ist meine Einstellung für 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

Als ich den HAproxy gestartet habe, ist dieser Fehler aufgetreten und ich bin mir nicht ganz sicher, wo ich anfangen soll, ihn zu beheben. Vielleicht kann mir jemand, der dies schon oft getan hat, helfen, etwas Licht ins Dunkel zu bringen?

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

Die manuelle Verbindung zum Webserver1 und zum Webserver2 funktioniert jedoch einwandfrei.

Ich möchte nur einen einfachen Lastausgleich für den Webserver, der sich hinter dem HAproxy befindet. Jeder Rat oder Vorschlag wird absolut geschätzt. Bitte helfen Sie? Danke vielmals.

Le Dude
quelle

Antworten:

5

Ich habe HAproxy noch nie verwendet, aber eine schnelle Suche lässt mich denken, dass Sie default_backend appsofort unten hinzufügen müssen frontend main *:80. Ich sehe nirgendwo in dieser Konfiguration, die das Backend und das Frontend miteinander verbindet.

yoonix
quelle
Danke @yoonix. Sinnvoll und ich habe es versucht, indem ich das default_backend auskommentierte und die Ansicht in App änderte. und ändere den Modus auf http, da es einen Fehler gibt, der mir sagt, dass ich ihn ändern muss. Das Neustarten von Haproxy ist jetzt sauberer, aber jetzt habe ich einen anderen Fehler erhalten. 404 - Nicht gefunden
Le Dude
Ich würde denken, dass der Fehler tatsächlich vom Backend kommt, nicht von HAproxy. Überprüfen Sie die Anforderungs- und Fehlerprotokolle für die Webserver im Backend.
Yoonix
Du hast mich bis zum Anschlag geschlagen. Ich überprüfe die lighttpd-Konfiguration und die vhost-Konfiguration wurde falsch angezeigt. Ich versuche beispielsweise, eine Verbindung zu testlab.mydomain.com herzustellen, das mit haproxy VIP verknüpft ist. Die Konfiguration von lighttpd vhosts wurde jedoch auf mylab.mydomain.com verwiesen. Somit konnte es nicht gefunden werden und es trat ein Fehler 404 auf. Vielen Dank für den Rat yoonix. Ich werde dies als beantwortet betrachten. :-) Hab einen wunderschönen Tag oder Abend wo immer du bist. :-)
Le Dude
5

Das Problem liegt in Ihrer HAProxy-Konfiguration. Wenn ich alle Kommentare aus Ihrer Konfiguration entferne, erhalte ich Folgendes:

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

Und jetzt können Sie deutlich sehen, dass es überhaupt keine Konfiguration des Frontends gibt. Anfragen kommen über HAProxy über, frontend mainaber HAProxy weiß nicht, welche Server zuverlässig dafür sind, und gibt daher 503 zurück.

Sie müssen das Backend mit default_backendoder mit acl mit dem Frontend verknüpfen.

Sie sollten auch Statistiken verwenden, nicht nur mit Socket, sondern auch mit geschützter Weboberfläche. Ich kann Ihnen Informationen über Cluster hinter Haproxy zeigen, welche Server offline sind, welche Probleme auftreten, über Antwortzeiten und so weiter. Sehr nützlich zum Debuggen.

Ondra Sniper Flidr
quelle
2

Ich habe einen ähnlichen Fehler erhalten, weil HAProxy meinte, mein Backend sei aufgrund der standardmäßigen Integritätsprüfung nicht verfügbar. Ich habe den Gesundheitscheck deaktiviert und der 503 ist weggegangen.

Ich benutze pfsense GUI: Geben Sie hier die Bildbeschreibung ein

Charlie
quelle
Wie haben Sie den Gesundheitscheck deaktiviert? Ich glaube, ich habe das gleiche Problem, bin mir aber nicht 100% sicher, wie ich es deaktivieren soll.
HappyCoder
HappyCoder Ich habe mit einem Screenshot von pfsense aktualisiert, was ich benutze.
Charlie
Vielen Dank! Ich habe das Problem festgestellt, als ich die App aktualisiert habe, habe ich eine Route zu einer Seite unterbrochen, die OK zurückgibt. Haproxy ist so konfiguriert, dass diese Route von Zeit zu Zeit getestet wird, um die Verfügbarkeit sicherzustellen. Ich hätte dies zuerst überprüfen sollen.
HappyCoder
1

Ich hatte eine etwas andere Konfiguration, daher ist dies nicht die Antwort auf Ihr spezifisches Problem, aber es kann anderen helfen, die den 503-Fehler mit HAProxy haben.

Mein Haproxy wurde folgendermaßen konfiguriert:

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

Dies bedeutet, dass das Backend nur verwendet wird, wenn der Host-Header mit external-service-1-0 beginnt.

In meinem Fall war der Grund für den 503-Fehler, dass der Client die folgenden Anforderungsheader gesendet hat:

X-App-ID: 98d77fae1082342342323423423452ae203489234

Host: external-service-1-0.prod-drb-external.svc.cluster.local: 8080 Verbindung: Keep-Alive

Beachten Sie die zusätzliche Zeile zwischen X-App-ID und Host. Eine leere Zeile lässt HAProxy glauben, dass dies das Ende der HTTP-Header ist. Daher wurde der Host-Header ignoriert und das richtige Backend konnte nicht gefunden werden.

stefan.m
quelle
0

PFSense fügt automatisch (und etwas unsichtbar) zusätzliche ACLs hinzu, wenn Sie ein TLS-Zertifikat verwenden. Ich habe einen zweiten virtuellen Host und ein zweites Zertifikat im Abschnitt "Zusätzliche Zertifikate" hinzugefügt. Dadurch wurden die Standardzertifikat-ACLs beibehalten.

Das Deaktivieren dieser ACLs und der Neustart haben den Trick getan.

Geben Sie hier die Bildbeschreibung ein

Charlie
quelle
0

In meinem Fall schien die Konfiguration korrekt zu sein, aber ich bekam immer noch den Fehler. Das Update bestand einfach darin, Haproxy unter Selinux laufen zu lassen oder Selinux auf einer Test-VM vollständig zu deaktivieren.

setsebool -P haproxy_connect_any 1
setenforce 0

Kobi
quelle