用于 HTTP 但不是 WebSockets 的 HAProxy SSL 重定向

Posted

技术标签:

【中文标题】用于 HTTP 但不是 WebSockets 的 HAProxy SSL 重定向【英文标题】:HAProxy SSL Redirect for HTTP but not WebSockets 【发布时间】:2013-12-24 16:29:34 【问题描述】:

我将 HAProxy 作为负载平衡器和动态重定向器连接到我的 web 服务器和 websocket 服务器,以便它们可以在同一个端口上运行。我的 Web 套接字服务器需要在 ha 代理上终止 SSL。

我想配置 HAProxy,以便将 http 流量重定向到 https,但 websockets 在 bot 端口 80 和 443(ws 和 wss)上工作。这可能吗?

我目前的配置是:

global
 maxconn 50000
 user root
 group root
 stats socket /tmp/haproxy
 node lb1
 nbproc 1
 #daemon
 #debug

defaults
 log global
 retries 3
 option dontlog-normal
 timeout connect 10000ms
 timeout client 10000ms
 timeout server 10000ms
 timeout tunnel 24h
 maxconn 50000
 mode http
 option http-server-close


backend wwwServers
 mode http
 balance roundrobin
 option httpchk HEAD / HTTP/1.1
 server www1 127.0.0.1:1138 check

backend wsServers
 server ws1 127.0.0.1:1137 check

frontend  secured
 bind :443 ssl crt /cert/cert.pem
 reqadd X-Forwarded-Proto:\ https
 default_backend wwwServers

frontend unsecured
 bind :80
 acl is_websocket hdr(Upgrade) -i WebSocket
 use_backend wsServers if is_websocket
 redirect scheme https if ! ssl_fc 
 default_backend wwwServers

但这会在升级之前重定向 websocket 连接,因为 ha 代理在我运行它时会执行以下操作: 放置在“use_backend”规则之后的“重定向”规则仍将在之前处理。

任何帮助将不胜感激。

谢谢,

【问题讨论】:

我找到了一种解决方案use_backend wsServers if is_websocket default_backend wwwServers 如果您找到了解决方案,请将其作为答案发布,并将您的答案标记为正确,这样该问题就不会继续显示为“未解决”。 【参考方案1】:

解决方法如下:

frontend  secured
    bind :443 ssl crt /path/to/certificate.pem
    reqadd X-Forwarded-Proto:\ https
    acl is_websocket hdr(Upgrade) -i WebSocket
    use_backend wsServers if is_websocket
    default_backend wwwServers
frontend unsecured
    bind :81,:80
    acl is_websocket hdr(Upgrade) -i WebSocket
    redirect scheme https if ! ssl_fc  !is_websocket
    use_backend wsServers if is_websocket
    default_backend wwwServers

如果建立了非 ssl 非 websocket 连接,则会重定向。

【讨论】:

以上是关于用于 HTTP 但不是 WebSockets 的 HAProxy SSL 重定向的主要内容,如果未能解决你的问题,请参考以下文章

用于 Windows CE/Mobile 的 C++ 中的 HTTP Websockets 客户端库

用于 websockets 内部的 Chrome DevTools 网络工具

WebSockets 或 Http 哪一个用于实时应用程序?

Ktor websockets 身份验证

Websockets 应用开发

是否可以使用带有所需端口的 http 方案,比如 6500,而不是 WebSockets 中的 ws 和 wss 方案?