Websockets mit Apache hinter haproxy
Ich hab hier eine Anwendung die WebSocket verwendet und im HA Umfeld läuft (haproxy). Leider benötigt diese Anwendung auch Sessions (sticky) deswegen musste ich ein wenig basteln Bei mir läuft eine node.js Anwendung hinter dem haproxy , für andere Fälle muss man vermutlich noch etwas mit der Konfiguration spielen.
Erstmal habe ich in der vhost des Apaches dafür gesorgt das ws auf den richtigen Server geleitet wird.
vhost
Dann hab ich die haproxy Konfiguration auf die Anwendung zugeschnitten.
haproxy
https://de.wikipedia.org/wiki/WebSocket
https://load-balancer.info/themen/sticky-session-load-balancing/
https://nodejs.org/en/about/
https://www.haproxy.org/#desc
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API
Erstmal habe ich in der vhost des Apaches dafür gesorgt das ws auf den richtigen Server geleitet wird.
vhost
RewriteEngine On RewriteCond %{HTTP:Connection} Upgrade [NC] RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteRule /demoapp/(.*) ws://demo-srv-01:3030/$1 [P,L] RedirectMatch ^/demoapp$ TARGET-URL/demoapp/ ProxyPass /demoapp/ http://demo-srv-01:3030/ ProxyPassReverse /demoapp/ http://demo-srv-01:3030/
Dann hab ich die haproxy Konfiguration auf die Anwendung zugeschnitten.
haproxy
listen demoapp:3030 bind *:3030 # EIO ist immer gesetzt wenn über Websocket acl IsStatus urlp(EIO) 3 use_backend ws_demoapp if IsStatus use_backend default if !IsStatus backend ws_demoapp mode http # eventuell gesetzte Header löschen rspdel ^Server:.* rspdel ^X-Powered-By:.* # und durch Server demoapp Header ersetzen rspadd Server:\ demoapp # diese Seite muss HTTP-Status 200 liefern damit der HA erkennt das alles ok ist option httpchk HEAD /lbhealth # check auf Status wenn der 200 ist ist alles ok http-check expect status 200 # using the `io` cookie set upon handshake cookie io prefix indirect nocache # Server Endpunkte server wsdemoapp01 ws-demo-srv-01:8200 check cookie monitor01 server wsdemoapp02 ws-demo-srv-02:8200 check cookie monitor02 backend default mode http # eventuell gesetzte Header löschen rspdel ^Server:.* rspdel ^X-Powered-By:.* # und durch Server demoapp Header ersetzen rspadd Server:\ demoapp # Server Endpunkte wird normal gebalancet balance leastconn server node01 ws-demo-srv-01:80 check cookie node01 server node02 ws-demo-srv-02:80 check cookie node02Quellen & Info :
https://de.wikipedia.org/wiki/WebSocket
https://load-balancer.info/themen/sticky-session-load-balancing/
https://nodejs.org/en/about/
https://www.haproxy.org/#desc
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API