Доступ к Haproxy множественным бэкендам с одним и тем же путем

1 KrisK [2015-05-28 16:54:00]

У меня есть 4 приложения Java, работающих на моем сервере, 2 первичных и 2 субпапса, которые мне нужно получить через Haproxy.

app1 → прослушивает tcp: 8442, доступ к которому осуществляется через app1.domain.org subapp1 → прослушивает tcp: 9001 и доступен с помощью пути app1.domain.org/abc

app2 → прослушивает tcp: 8444, доступ к которому осуществляется через app2.domain.org subapp2 → прослушивает tcp: 9000 и получает доступ с помощью пути app2.domain.org/abc

поэтому доступ к дополнительным приложениям осуществляется по тому же пути

У меня возникли проблемы с получением Haproxy для направления запросов в соответствующее приложение. С включенной конфигурацией доступ к основным приложениям работает нормально, но в зависимости от порядка инструкций use_backend все запросы вспомогательных приложений маршрутизируются на один и тот же задний конец (который когда-либо указан первым). Никакой разницы не наблюдается, если я переупорядочиваю ACL. Кажется, что ACL неправильно соответствует входящему запросу.

Любая помощь приветствуется!

моя конфигурация:

global
    log localhost   local1  
    log-send-hostname server-hostname   
    maxconn 1024                
    user root                   
    group root                  
    daemon                      
    pidfile /var/run/haproxy.pid
    ssl-default-bind-options no-sslv3 no-tls-tickets  

defaults
    log global                  
    mode http                   
    option  dontlognull         
    option forwardfor           
    no option http-server-close  
    no option accept-invalid-http-request   
    timeout client 600s                     
    timeout client-fin 10s                  
    timeout server 600s                     
    stats enable
    stats auth user:password
    stats uri /haproxyStats

listen admin
    mode http
    bind *:8080
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth user:password

frontend http-in
    bind *:80                           
    acl invalid_src  src          0.0.0.0/7 224.0.0.0/3
    acl invalid_src  src_port     0:1023            
    http-request deny if invalid_src                    
    option tcplog                       
    log-format %ci\ %f\ %b\ %ST\ %{+Q}r\ %Tr   
    redirect scheme https code 301 if !{ ssl_fc }   

frontend https-in
    bind *:443 ssl crt /etc/haproxy/ssl.cert        
    mode http

    acl test_sapp path_beg -i /abc 
    acl test_sapp hdr(host) -m dom -i *app2.domain.com*

    acl prod_sapp path_beg -i /abc 
    acl prod_sapp hdr(host) -m dom -i *app1.domain.com*

    acl test_app1 hdr_end(host) -i app2.domain.com
    acl prod_app1 hdr_end(host) -i app1.domain.com

    acl invalid_src  src          0.0.0.0/7 224.0.0.0/3
    acl invalid_src  src_port     0:1023            
    http-request deny if invalid_src
    option tcplog   
    log-format %r
    reqadd X-Forwarded-Proto:\ https                

    use_backend sapp-test if test_sapp
    use_backend sapp-prod if prod_sapp

    use_backend app-prod if prod_app1
    use_backend app-test if test_app1

    timeout client 600s                 
    timeout client-fin 10s              

backend app-prod
    balance leastconn
    option httpclose
    option forwardfor
    server prod-web-node 127.0.0.1:8442 cookie A check 
    timeout server 600s                 

backend app-test
    option httpclose
    option forwardfor
    server test-web-node 127.0.0.1:8444 cookie A check
    timeout server 600s                 

backend sapp-prod
    balance leastconn
    option httpclose
    option forwardfor
    server prod-mdr-node 127.0.0.1:9001 cookie A check
    timeout server 600s                 

backend sapp-test
    balance leastconn
    option httpclose
    option forwardfor
    server test-mdr-node 127.0.0.1:9000 cookie A check
    timeout server 600s 

haproxy


1 ответ


3 Решение JamesStewy [2015-05-30 06:31:00]

Это непроверено, но я думаю, что этот интерфейс https-in должен работать:

frontend https-in
    bind *:443 ssl crt /etc/haproxy/ssl.cert        
    mode http

    acl prod_domain hdr(host) -i app1.domain.com
    acl test_domain hdr(host) -i app2.domain.com

    acl sub_app path_beg -i /abc 

    acl invalid_src  src          0.0.0.0/7 224.0.0.0/3
    acl invalid_src  src_port     0:1023            
    http-request deny if invalid_src
    option tcplog   
    log-format %r
    reqadd X-Forwarded-Proto:\ https                

    use_backend sapp-test if sub_app test_domain
    use_backend sapp-prod if sub_app prod_domain

    use_backend app-prod if prod_domain
    use_backend app-test if test_domain

    timeout client 600s                 
    timeout client-fin 10s

Ключ находится в use_backend sapp-test use_backend sapp-prod и use_backend sapp-prod где бэкэнд выбирается, только если оба sub_app acl и test_domain/prod_domain acl истинны. В противном случае он возвращается к окну app-prod back или app-test.

Надеюсь, это поможет :)