2016-06-16 9 views
0

Ich habe ein ungewöhnliches Problem (wie jeder auf dieser Website tut). Ich hasse HAProxy auf Port 80 und 443. Ich entlade SSL-Verschlüsselung zu HAproxy und übergebe den gesamten Verkehr zu meinen Webservern auf Port 80. Es gibt eine Firewall vor meinem HAProxy-Server mit NAT-Regeln, die auf meine internen hörenden IP-Adressen von zeigen HAProxy. Wir erhalten eine ungewöhnliche 503-Nachricht für zufällige IP-Quelladressen über SSL an Port 443. Andere zufällige IP-Adressen funktionieren einwandfrei über SSL. Unser Service ist eine API und die meisten Datenverkehr durchläuft aber ein sehr kleiner Prozentsatz bekommt einen 503.Haproxy 1.5 spezifische Quelle IP-Adresse zeigen <NOSRV> 503 SC in Haproxy Protokoll

ist hier ein HAProxy Protokolleintrag, und man arbeitet, die nicht Arbeits tut:

localhost haproxy[5404]: XXX.XXX.XXX.XXX:54787 [15/Jun/2016:22:46:57.592] https_in_ssl~ http_www2/web1 32/0/0/232/264 200 747 - - ---- 5/4/0/1/0 0/0 "POST /webservices/ourService.asmx HTTP/1.1" 

nicht funktioniert:

Eine Sache, die ich bemerke, ist das Front-End und Back-End sind die gleichen in der nicht funktionierenden Protokolleintrag.

Hier ist meine Config-Datei:

peers prodHAproxypeers 
     peer haproxylb1 10.0.0.145:1024 
     peer haproxylb2 10.0.0.146:1024 

global 
     log  127.0.0.1 local0 
#  log /dev/log local0 
#  log /dev/log local1 notice 
     chroot /var/lib/haproxy 
     stats socket /var/lib/haproxy/stats 
     stats timeout 30s 
     tune.ssl.default-dh-param 2048 
     user haproxy 
     group haproxy 
     daemon 

defaults 
     log global 
     mode http 
     option httplog 
     option dontlognull 
     option redispatch 
     option forwardfor 
     option http-server-close 
     maxconn 5000 
     timeout connect 5s 
     timeout client 5h 
     timeout server 5h 
     timeout queue 30s 
     timeout http-request 5s 
     timeout http-keep-alive 15s 

listen stats *:1936 
     mode http 
     stats enable 
     stats hide-version 
     stats realm Haproxy\ Statistics 
     stats uri /haproxy_stats 
     stats auth admin:hardPassword 
     stats admin if TRUE 

frontend http_in 
     bind *:80 
     ###Add new acl and use_backend entry for each new site 
     ###new backend sections will be needed as well 
     acl is_www1 hdr(host) -i www1.domainname.com 
     acl is_www2 hdr(host) -i www2.domainname.com 
     acl is_www3 hdr(host) -i www3.domainname.com 
     acl is_www4 hdr(host) -i www4.domainname.com 
     acl is_wildcardwww hdr_end(host) -i domainname.com 
     use_backend http_www1 if is_www1 
     use_backend http_www2 if is_www2 
     use_backend http_www3 if is_www3 
     use_backend http_www4 if is_www4 
     use_backend http_www5 if is_www5 
     option forwardfor 
     option http-server-close 

frontend https_in_ssl 
     mode http 
     bind *:443 ssl crt /etc/ssl/private/ no-sslv3 
     reqadd X-Forwarded-Proto:\ https 
     use_backend http_www1 if { ssl_fc_sni www1.domainname.com } 
     use_backend http_www2 if { ssl_fc_sni www2.domainname.com } 

     acl is_ssl_www5 hdr_end(host) -i domainname.com 
     use_backend http_www5 if is_ssl_www5 


backend http_www1 
     balance source 
     cookie SRV_ID prefix 
     stick-table type ip size 1m expire 6h peers prodHAproxypeers 
     stick on src 
     ###This site does not use host header - only the page name is needed### 
#  option httpchk HEAD /Default.aspx 
     ###Added host header so haproxy can route around NLB - use below for checking### 
     option httpchk HEAD /Default.aspx HTTP/1.1\r\nHost:\ www1.domainname.com 
     server p-websvr01 10.0.0.10:80 cookie pweb1 weight 45 check 
     server p-websvr02 10.0.0.11:80 cookie pweb2 weight 45 check 
     server p-websvr03 10.0.0.115:80 cookie pweb3 weight 5 check 
     server p-websvr04 10.0.0.118:80 cookie pweb4 weight 5 check 

backend http_www2 
     balance roundrobin 
     stick-table type ip size 1m expire 6h peers prodHAproxypeers 
     stick on src 
     ###This site uses host headers so this type of check is required### 
     option httpchk HEAD /default.htm HTTP/1.1\r\nHost:\ www2.domainname.com 
     server p-websvr01 10.0.0.10:80 cookie pweb1 weight 45 check 
     server p-websvr02 10.0.0.11:80 cookie pweb2 weight 45 check 
     server p-websvr03 10.0.0.113:80 cookie pweb3 weight 5 check 
     server p-websvr04 10.0.0.116:80 cookie pweb4 weight 5 check 

backend http_www3 
     balance roundrobin 
     cookie SRV_ID prefix 
     stick-table type ip size 1m expire 6h peers prodHAproxypeers 
     stick on src 
     ###This site does not use host header - only the page name is needed### 
     option httpchk HEAD /login.aspx HTTP/1.1\r\nHost:\ www3.domainname.com 
     server p-websvr01 10.0.0.10:80 cookie pweb1 weight 45 check 
     server p-websvr02 10.0.0.11:80 cookie pweb2 weight 45 check 
     server p-websvr03 10.0.0.113:80 cookie pweb3 weight 5 check 
     server p-websvr04 10.0.0.116:80 cookie pweb4 weight 5 check 

backend http_www4 
     balance roundrobin 
     cookie SRV_ID prefix 
     stick-table type ip size 1m expire 6h peers prodHAproxypeers 
     stick on src 
     ###This site uses host header so this type of check is required### 
     option httpchk HEAD /default.aspx HTTP/1.1\r\nHost:\ www4.domainname.com 
     server p-websvr01 10.0.0.10:80 cookie pweb1 weight 45 check 
     server p-websvr02 10.0.0.11:80 cookie pweb2 weight 45 check 
     server p-websvr03 10.0.0.113:80 cookie pweb3 weight 5 check 
     server p-websvr04 10.0.0.116:80 cookie pweb4 weight 5 check 

backend http_www5 
     balance roundrobin 
     cookie SRV_ID prefix 
     stick-table type ip size 1m expire 6h peers prodHAproxypeers 
     stick on src 
     ###This site uses host header so this type of check is required### 
     option httpchk HEAD /default.aspx HTTP/1.1\r\nHost:\ www5.domainname.com 
     server p-websvr01 10.0.0.10:80 cookie pweb1 weight 45 check 
     server p-websvr02 10.0.0.11:80 cookie pweb2 weight 45 check 
     server p-websvr03 10.0.0.115:80 cookie pweb3 weight 5 check 
     server p-websvr04 10.0.0.117:80 cookie pweb4 weight 5 check 
+0

offtopic. Kein Programmierproblem. Dies ist mehr Server/Netzwerk-Zeug. Versuchen Sie es mit Serverfault. –

Antwort

1

Es scheint, dass die https_in_ssl Frontend die Anfrage behandelt, aber da keiner der Backends (http_www1, http_www2 und http_www5) Sie einen Fehler 503 erhalten werden ausgewählt (= no Backend ausgewählt, in diesem Fall). Dies liegt daran, dass der Hostname nicht www1.domainname.com, www2.domainname.com oder * .domainname.com lautet. Sie können versuchen, den Host-HTTP-Header wie erläutert zu erfassen und sehen, was der tatsächliche Wert ist und warum dies fehlschlägt.

Nicht sicher, warum Sie ssl_fc_sni anstelle von hdr (Host) gewählt haben, scheint dies eine bad idea und auch die Ursache für Ihr Problem sein.

+0

Danke für Ihre Eingabe. Wir haben einen tcpdump und einen dreiteiligen Dienst gemacht, aber wir konnten keinen Unterschied feststellen, warum dieser eine Client nicht funktioniert hat, aber die anderen 200 Clients. Am Ende haben wir ssl durch HAProxy an die Webserver weitergegeben. Danke für den Link zum Forenbeitrag mit einer Platzhalter-URL. Dies wird helfen. – Brad

+0

War der Host für alle Anfragen identisch oder zumindest "akzeptabel"? Wenn es so wäre, dann hättest du tatsächlich ein seltsames Problem ... sonst macht es völlig Sinn, dass die Dinge anders handelten. – advance512