2017-04-07 93 views
0

我們有一種架構,其中多個主機上有多個API。每個API都位於AWS ELB後面。我們希望在前面放置一個代理,將基於URI的請求路由到ELB。嘗試使用HAProxy將請求轉發給ELB的奇怪行爲/錯誤

我至今大部分工作,但約3出10個請求導致以下錯誤(使用捲曲,但問題是沒有捲曲):

curl: (35) Unknown SSL protocol error in connection to test-router.versal.com:-9847 

我有一種感覺, ELB是罪魁禍首。 SSL在那裏終止。

這裏是我們HAProxy的配置:

global 
    log 127.0.0.1 local0 
    log 127.0.0.1 local1 notice 
    maxconn 10240 
    user haproxy 
    group haproxy 
    daemon 
    debug 
    stats socket /var/run/haproxy.sock 
    log-send-hostname test-router.domain.com 
    description "HAProxy on test-router.domain.com" 

defaults 
    log  global 
    mode http 
    option httplog 
    option dontlognull 
    retries 3 
    option redispatch 
    option forwardfor 
    option httpclose 
    option dontlognull 
    option tcpka 
    maxconn 10240 
    timeout connect 10000ms 
    timeout client 600000ms 
    timeout server 600000ms 

frontend public 
    bind *:80 
    bind *:443 
    acl elb0 path_beg /elb0 
    acl elb1 path_beg /elb1 
    use_backend elb0 if elb0 
    use_backend elb1 if elb1 

    bind 0.0.0.0:443 ssl crt /etc/ssl/cert.pem no-sslv3 ciphers AES128+EECDH:AES128+EDH 

backend elb0 
    server server_vcat elb0.domain.com:443 ssl verify none 

backend elb1 
    server server_laapi elb1.domain.com:443 ssl verify none 

回答

1

的SSL從捲曲在ELB終止。它終止於HAProxy的,在你的配置...

bind 0.0.0.0:443 ssl crt /etc/ssl/cert.pem no-sslv3 ciphers AES128+EECDH:AES128+EDH 

...然後一個完全不同的SSL會話被HAProxy的連接到ELB上建立:

server ... ssl verify none 

的SSL問題在這種配置下ELB不可能通過HAProxy傳播回捲曲。

的問題是在你的HAProxy的配置,在這裏:

bind *:443 

刪除了這一行。這是多餘的(並且不正確)。

您正在告訴HAProxy綁定到端口443兩次:一次講SSL,一次而不是講SSL。

因此,根據統計,在大約50%的連接嘗試中,curl發現HAProxy在端口443上不會講SSL - 它只是講HTTP,而curl不能(也不應該)適度地處理。

我相信這個(錯誤)配置不會被HAProxy檢測到,不是因爲一個實際的錯誤,而是因爲HAProxy內部實現了一些方法,涉及多進程部署和熱重載,其中如果將HAProxy綁定到相同的套接字不止一次是有效的。

+0

當然,現在很明顯。我從未考慮的一條線。非常感謝你。你的答案是無價的。 –