我有两个WebSocket服务器都运行在80和443以外的不同端口上。这两个服务器在防火墙后面运行,只有端口80和443打开。
WebSocket Server A:800 |
|-----|FireWall:80 & 443|-----> INTERNET
WebSocket Server B:801 |
我正在寻找的是我的客户在不知道他们的端口的情况下连接到WebSocket服务器的方式,而且没有为任何其他端口而不是80和443打开防火墙。
所以我想可能我的防火墙和WebSocket服务器之间的中间服务器(或代理服务器)可以配置为当客户端在端口80或443(要通过防火墙)上请求www.mywebsite.com/a
时中间服务器将客户端连接到WebSocket服务器A.当客户端在端口80或443上请求www.mywebsite.com/b
时,中间服务器将他连接到WebSocket服务器B.这可能吗?如果有的话,是否有任何你知道的服务器实现了这个功能?
在另一个注释(可能没有太大差异)上,TCP hole punch与我上面解释的方法之间会有什么不同?
答案 0 :(得分:2)
这称为“WebSockets反向代理”。您需要在防火墙和WebSocket服务器之间使用另一个逻辑或物理节点。您可能在同一系统上运行所有三个节点,这就是我提到“逻辑”的原因。
这个空间正在迅速变化,解决方案相当不成熟。您的案例的最佳选择可能是使用HAProxy for WebSocket reverse proxy。搜索“WebSocket反向代理”以获取更多信息。 This article有点旧,但应该给你一个合理的选项概述。
更新:看起来昨天刚刚登陆Nginx的WebSocket代理支持:press release,commit with example
答案 1 :(得分:1)
由于答案中提供了link @kanaka,我设法将HAProxy配置为根据URI重定向我的请求。所以这就是我所做的:
make
HAProxy后,您可以在usr/local/sbin
下找到haproxy。该脚本以-f
标志运行,用于配置文件。查看/etc/
,如果您没有任何haproxy.cfg
,只需mkdir -p /etc/haproxy
,然后vi /etc/haproxy.cfg
并粘贴您的配置。 1.5版的配置文件描述为here,其中包含可以使用的所有参数。这就是我的haproxy.cfg
文件的样子:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
uid 99
gid 99
daemon
defaults
log global
mode http
option httplog
option dontlognull
retries 3
option redispatch
option http-server-close
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
frontend public
bind *:80
acl is_websocket1 path_beg -i /a # if the path starts with /a
acl is_websocket2 path_beg -i /b # if the path starts with /b
use_backend ws1 if is_websocket1
use_backend ws2 if is_websocket2
default_backend www
backend www
timeout server 30s
server www1 127.0.0.1:8001 # the port we have our webserver running on
backend ws1
timeout server 600s
server ws1 127.0.0.1:800 # the port we have our websocket server 1 running on
backend ws2
timeout server 600s
server ws2 127.0.0.1:801 # the port we have our websocket server 2 running on