Hi,

On Wed, 2022-03-30 at 12:19 +0000, Ralf Saier wrote:
> Hello,
>  
> when testing with HTTP/2 we found a behaviour, we did not expect:
>  
> we use switching between different backends by use of a map file, e.g.:
> use_backend %[url,map_beg(/etc/haproxy/pool.map,defaultbackend)]
>  
> With HTTP/1.1 this works fine in haproxy.
> But with HTTP/2, it does not work.
> 

I think with HTTP/2 %[url] is
https://dom.ain/path...
and with HTTP/1.1 %[url] is just path (I think this has been discussed on
list, but at the moment I can't find a link).

Have you tried with %[path,map_beg(/etc/haproxy/pool.map,defaultbackend)] ?

-Jarno

>  
> Here‘s a minimal configuration file to reproduce this:
>  
> ----------------------------------------------------
> global
>         log /dev/log local0 warning
>  
> #       log /dev/log    local0
> #       log /dev/log    local1 notice
>  
>         chroot /var/lib/haproxy
>         stats socket /run/haproxy/admin.sock mode 660 level admin expose-
> fd listeners
>         stats timeout 30s
>         user haproxy
>         group haproxy
>         daemon
>  
>         # Default SSL material locations
>         ca-base /etc/ssl/certs
>         crt-base /etc/ssl/private
>  
>         # See:
> https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
>         ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-
> AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-
> SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-
> AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
>         ssl-default-bind-ciphersuites
> TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
>         ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
>  
> defaults
>         log     global
>         mode    http
>         option  httplog
> #       option  dontlognull
>         timeout connect 5000
>         timeout client  50000
>         timeout server  50000
>  
> backend defaultbackend
>     log     global
>     mode        http
>     http-response set-header X-Info "defaultbackend : %s"
>  
>     server default_1 127.0.0.1:81
>  
> backend backend_2
>     log     global
>     mode        http
>     http-response set-header X-Info "backend_2 : %s"
>  
>     server default_2 127.0.0.1:81
>  
>  
> backend backend_3
>     log     global
>     mode        http
>     http-response set-header X-Info "backend_3 : %s"
>  
>     server default_3 127.0.0.1:81
>  
>  
> frontend ssl
>     log    global
>     mode   http
>  
>     option  httplog
>  
>     bind *:443 alpn h2,http/1.1 ssl crt /etc/haproxy/x.pem
>  
>     acl is_path_3 path_beg /3
>     use_backend backend_3 if is_path_3
>  
>     use_backend %[url,map_beg(/etc/haproxy/pool.map,defaultbackend)]
>     default_backend  defaultbackend
>  
> ----------------------------------------------------
>  
> Content of /etc/haproxy/pool.map is:
> /2      backend_2
>  
> ----------------------------------------------------
>  
> HAProxy Version:
> haproxy -vvv
> HAProxy version 2.5.5-1ppa1~focal 2022/03/14 -https://haproxy.org/
> Status: stable branch - will stop receiving fixes around Q1 2023.
> Known bugs: http://www.haproxy.org/bugs/bugs-2.5.5.html
> Running on: Linux 5.4.0-104-generic #118-Ubuntu SMP Wed Mar 2 19:02:41 UTC
> 2022 x86_64
> Build options :
>   TARGET  = linux-glibc
>   CPU     = generic
>   CC      = cc
>   CFLAGS  = -O2 -g -O2 -fdebug-prefix-map=/build/haproxy-d3zlWl/haproxy-
> 2.5.5=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-
> time -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wundef -Wdeclaration-after-
> statement -fwrapv -Wno-address-of-packed-member -Wno-unused-label -Wno-
> sign-compare -Wno-unused-parameter -Wno-clobbered -Wno-missing-field-
> initializers -Wno-cast-function-type -Wtype-limits -Wshift-negative-value
> -Wshift-overflow=2 -Wduplicated-cond -Wnull-dereference
>   OPTIONS = USE_PCRE2=1 USE_PCRE2_JIT=1 USE_OPENSSL=1 USE_LUA=1 USE_SLZ=1
> USE_SYSTEMD=1 USE_PROMEX=1
>   DEBUG   =
>  
> Feature list : +EPOLL -KQUEUE +NETFILTER -PCRE -PCRE_JIT +PCRE2 +PCRE2_JIT
> +POLL +THREAD +BACKTRACE -STATIC_PCRE -STATIC_PCRE2 +TPROXY +LINUX_TPROXY
> +LINUX_SPLICE +LIBCRYPT +CRYPT_H +GETADDRINFO +OPENSSL +LUA +ACCEPT4 -
> CLOSEFROM -ZLIB +SLZ +CPU_AFFINITY +TFO +NS +DL +RT -DEVICEATLAS -
> 51DEGREES -WURFL +SYSTEMD -OBSOLETE_LINKER +PRCTL -PROCCTL +THREAD_DUMP -
> EVPORTS -OT -QUIC +PROMEX -MEMORY_PROFILING
>  
> Default settings :
>   bufsize = 16384, maxrewrite = 1024, maxpollevents = 200
>  
> Built with multi-threading support (MAX_THREADS=64, default=1).
> Built with OpenSSL version : OpenSSL 1.1.1f  31 Mar 2020
> Running on OpenSSL version : OpenSSL 1.1.1f  31 Mar 2020
> OpenSSL library supports TLS extensions : yes
> OpenSSL library supports SNI : yes
> OpenSSL library supports : TLSv1.0 TLSv1.1 TLSv1.2 TLSv1.3
> Built with Lua version : Lua 5.3.3
> Built with the Prometheus exporter as a service
> Built with network namespace support.
> Built with libslz for stateless compression.
> Compression algorithms supported : identity("identity"),
> deflate("deflate"), raw-deflate("deflate"), gzip("gzip")
> Support for malloc_trim() is enabled.
> Built with transparent proxy support using: IP_TRANSPARENT
> IPV6_TRANSPARENT IP_FREEBIND
> Built with PCRE2 version : 10.34 2019-11-21
> PCRE2 library supports JIT : yes
> Encrypted password support via crypt(3): yes
> Built with gcc compiler version 9.4.0
>  
> Available polling systems :
>       epoll : pref=300,  test result OK
>        poll : pref=200,  test result OK
>      select : pref=150,  test result OK
> Total: 3 (3 usable), will use epoll.
>  
> Available multiplexer protocols :
> (protocols marked as <default> cannot be specified using 'proto' keyword)
>               h2 : mode=HTTP       side=FE|BE     mux=H2      
> flags=HTX|CLEAN_ABRT|HOL_RISK|NO_UPG
>             fcgi : mode=HTTP       side=BE        mux=FCGI    
> flags=HTX|HOL_RISK|NO_UPG
>        <default> : mode=HTTP       side=FE|BE     mux=H1       flags=HTX
>               h1 : mode=HTTP       side=FE|BE     mux=H1      
> flags=HTX|NO_UPG
>        <default> : mode=TCP        side=FE|BE     mux=PASS     flags=
>             none : mode=TCP        side=FE|BE     mux=PASS    
> flags=NO_UPG
>  
> Available services : prometheus-exporter
> Available filters :
>         [SPOE] spoe
>         [CACHE] cache
>         [FCGI] fcgi-app
>         [COMP] compression
>         [TRACE] trace
>  
> ----------------------------------------------------
> We set response-header „X-Info“, to see which backend is chosen.
> When we use http/1.1 everything works fine:
>  
> root@ubuntu2004:/etc/haproxy# curl --http1.1  -kvhttps://127.0.0.1/x
> ...
> < HTTP/1.1 200 OK
> < date: Wed, 30 Mar 2022 12:05:21 GMT
> < server: Apache/2.4.41 (Ubuntu)
> < last-modified: Wed, 30 Mar 2022 11:25:27 GMT
> < etag: "5-5db6dcd63b259"
> < accept-ranges: bytes
> < content-length: 5
> < x-info: defaultbackend : default_1                   <--default backend
> OK
> < 
> test
> * Connection #0 to host 127.0.0.1 left intact
>  
> root@ubuntu2004:/etc/haproxy# curl --http1.1  -kvhttps://127.0.0.1/2/x
> ...
> < HTTP/1.1 200 OK
> < date: Wed, 30 Mar 2022 12:05:24 GMT
> < server: Apache/2.4.41 (Ubuntu)
> < last-modified: Wed, 30 Mar 2022 11:28:30 GMT
> < etag: "7-5db6dd8521aec"
> < accept-ranges: bytes
> < content-length: 7
> < x-info: backend_2 : default_2                     <-- backend_2 OK
>  
> < 
> test 2
> * Connection #0 to host 127.0.0.1 left intact
>  
> root@ubuntu2004:/etc/haproxy# curl --http1.1  -kvhttps://127.0.0.1/3/x
> ...
> < HTTP/1.1 200 OK
> < date: Wed, 30 Mar 2022 12:05:26 GMT
> < server: Apache/2.4.41 (Ubuntu)
> < last-modified: Wed, 30 Mar 2022 11:46:32 GMT
> < etag: "7-5db6e18c50c11"
> < accept-ranges: bytes
> < content-length: 7
> < x-info: backend_3 : default_3             <-- backend_3 OK
>  
> < 
> test 3
> * Connection #0 to host 127.0.0.1 left intact
>  
>  
> When we use HTTP/2, switching to backend_2 does not work:
>  
> root@ubuntu2004:/etc/haproxy# curl --http2  -kvhttps://127.0.0.1/2/x
> …
> < HTTP/2 200
> < date: Wed, 30 Mar 2022 12:09:04 GMT
> < server: Apache/2.4.41 (Ubuntu)
> < last-modified: Wed, 30 Mar 2022 11:28:30 GMT
> < etag: "7-5db6dd8521aec"
> < accept-ranges: bytes
> < content-length: 7
> < x-info: defaultbackend : default_1  <-- here we expect backend_2
> < 
> test 2
> * Connection #0 to host 127.0.0.1 left intact
>  
> Can you please check this?
>  
> Kind Regards
> Ralf Saier
> Senior Software Developer
> Tel.+49 721 663035-253
> e-mailsa...@econda.de
>  
> Angaben zum Absender:
> econda GmbH, Zimmerstr. 6, 76137 Karlsruhe
> Geschäftsführer: Christian Hagemeyer, Dr. Philipp Sorg
> Handelsregister: Amtsgericht Mannheim HRB 110559
>  
>  
>  
>  

-- 
Jarno Huuskonen

Reply via email to