I have two backends (b1, b2) sitting behind the same frontend (f1) in HAProxy, routing based on host name. I can establish websocket to both b1 and b2 from my laptop, however if I try to establish websocket to b2 from b1 (through f1) I get 1006 error (closed abnormaly - unexpected EOF). Pinging b2 from b1 succeeds. Here's my config:
frontend f1
bind 192.168.1.1:443 name 192.168.1.1:443 ssl crt-list /var/etc/haproxy/ReverseProxyHTTP.crt_list
mode http
log global
option httplog
option http-keep-alive
option forwardfor
http-request set-header X-Forwarded-Proto http if !https
http-request set-header X-Forwarded-Proto https if https
timeout client 30000
acl b1 var(txn.txnhost) -m beg -i b1
acl b2 var(txn.txnhost) -m beg -i b2
acl hdr_connection_upgrade hdr(Connection) -i upgrade
acl hdr_upgrade_websocket hdr(Upgrade) -i websocket
use_backend b1ws if b1 hdr_connection_upgrade hdr_upgrade_websocket
use_backend b1 if b1
use_backend b2 if b2
backend b1ws
mode http
id 119
log global
stick-table type ip size 50k expire 30m
stick on src
balance source
timeout connect 30000
timeout server 30000
retries 3
server s1 192.168.1.2:443 id 101 ssl verify none resolvers globalresolvers
backend b1
mode http
id 117
log global
stick-table type ip size 50k expire 30m
stick on src
balance source
timeout connect 30000
timeout server 30000
retries 3
server s1 192.168.1.2:443 id 101 ssl verify none resolvers globalresolvers alpn h2,http/1.1
backend b2
mode http
id 120
log global
stick-table type ip size 50k expire 30m
stick on src
balance source
timeout connect 30000
timeout server 30000
retries 3
timeout tunnel 3600s
server s2 192.168.1.3:443 id 101 ssl verify none resolvers globalresolvers
Note: b1 and b1ws point to the same server & port tho b1 prefers http2 for grpc. If websocket header is present, b1ws will be used.