WebSocket 在 tcp 模式下不能与 HAProxy 一起工作
WebSocket not working with HAProxy in tcp mode
在此处考虑此 HAProxy
配置:
global
chroot /var/lib/haproxy
user haproxy
group haproxy
defaults
timeout connect 10s
timeout client 50s
timeout server 50s
frontend fe_https_tomcat
mode tcp
bind *:443 ssl crt /path/cert.pem alpn h2,http/1.1
default_backend be_tomcat
backend be_tomcat
mode tcp
server localhost localhost:8081 check
我遇到的问题是 WebSocket 似乎无法通过。我的猜测是在 tcp 模式下一切都会通过。好像没有...:-)
当正在建立 WebSocket 连接时,服务器响应错误 403
。
请注意,使用以下 http 模式设置,WebSocket 就可以正常工作:
frontend fe_http_8080
mode http
bind *:8080
default_backend be_tomcat_8080
backend be_tomcat_8080
mode http
server localhost localhost:8081 check
请注意,我需要 tcp 模式才能使 http/2 正常工作。
问题最终与 HAProxy 无关,而是与 Spring 中的 WebSocket 设置有关。
这修复了它:
-registry.addHandler(webSocketHandler, "/ws");
+registry.addHandler(webSocketHandler, "/ws").setAllowedOrigins("*");
在此处考虑此 HAProxy
配置:
global
chroot /var/lib/haproxy
user haproxy
group haproxy
defaults
timeout connect 10s
timeout client 50s
timeout server 50s
frontend fe_https_tomcat
mode tcp
bind *:443 ssl crt /path/cert.pem alpn h2,http/1.1
default_backend be_tomcat
backend be_tomcat
mode tcp
server localhost localhost:8081 check
我遇到的问题是 WebSocket 似乎无法通过。我的猜测是在 tcp 模式下一切都会通过。好像没有...:-)
当正在建立 WebSocket 连接时,服务器响应错误 403
。
请注意,使用以下 http 模式设置,WebSocket 就可以正常工作:
frontend fe_http_8080
mode http
bind *:8080
default_backend be_tomcat_8080
backend be_tomcat_8080
mode http
server localhost localhost:8081 check
请注意,我需要 tcp 模式才能使 http/2 正常工作。
问题最终与 HAProxy 无关,而是与 Spring 中的 WebSocket 设置有关。 这修复了它:
-registry.addHandler(webSocketHandler, "/ws");
+registry.addHandler(webSocketHandler, "/ws").setAllowedOrigins("*");