这是可能的吗?有可能在Rack之上的Ruby中做这样的事情吗?我看到有websocket -rack,但据我所知,这只是一个机架模块,只服务websocket流量,而不是http也。
所以基本上,正如问题所述,是否有可能在同一端口上使用一台服务器来服务这两种协议,而不是像Faye, websockets-rack或em-websockets这样的东西?
Websockets只是HTTP(s)的协议内升级,所以它们不是普通的TCP socket,而是重用现有的HTTP(s)连接(因此使用相同的端口)。因此,理论上它应该可以工作,而且据我所知,它可以与Perl Mojolicious框架一起工作。但是我不知道它是否工作ruby/rack。
简短的回答是- (AFAIK)没有。
目前,ruby HTTP服务器(如rails或sinatra)和websocket服务器是互斥的。
说完之后,你可以使用第三方来模仿。特别是Ngnix
。使用Nginx
,您可以侦听单个端口,但是,根据路径,决定是否要将请求分派给HTTP服务器或Websocket服务器。
例如,HTTP服务器在端口3000上运行,Websocket服务器在端口3020上运行,然后像这样配置nginx.conf
:
upstream http_app {
server 127.0.0.1:3000;
}
upstream websocket_app {
server 127.0.0.1:3020;
}
server {
listen 80;
server_name .example.com;
access_log /var/www/myapp.example.com/log/access.log;
error_log /var/www/myapp.example.com/log/error.log;
root /var/www/myapp.example.com;
index index.html;
location /web {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://http_app;
}
location /socket {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://websocket_app;
}
}
现在任何对http://www.example.com/web/...
的请求都将到达HTTP服务器,任何对http://www.example.com/socket
的请求都将到达Websocket服务器。