WebSocket / Socket.IO 服务器的好解决方案(我尝试过Nginx,Node等)



我对设置Socket感兴趣。IO服务器+ Rails web应用程序。然而,正如许多人所知,支持WebSockets的web服务器并不多。以下是我到目前为止的两次尝试:

  1. 我尝试了Nginx-module路由。无法获得编译+配置的组合,以使其完全工作。可能是我干的蠢事。

    http://www.letseehere.com/reverse-proxy-web-sockets

  2. 我试着用node-http-proxy写我自己的web服务器,但我有麻烦完全集成这个与Socket。尽管阅读了所有的教程。

    http://github.com/nodejitsu/node-http-proxy

  3. 我试着用bouncy.js写我自己的web服务器,但它很慢。可以是我的代码,也可以是框架。我不知道。

    http://github.com/substack/bouncy

这些是我尝试过的东西,我只是好奇还有谁沿着这些路线最终得到了一些工作(当然,他们做了什么来使它工作)。

根据alessioalex的请求,这是我的配置文件。我删除了所有现有的评论,但添加了一些我自己认为不重要的评论。

但是,描述这个配置的所有部分的功能超出了本文的范围,但是您可能可以在HAProxy网站上找到必要的文档。

global
    maxconn 4096 
    pidfile /var/run/haproxy.pid
defaults
    mode    http
frontend all
    bind 0.0.0.0:80
    mode tcp
    maxconn 200000
    timeout client 86400000
    default_backend www_backend
    # Any URL beginning with socket.io will be flagged as 'is_websocket'
    acl is_websocket path_beg /socket.io
    acl is_websocket hdr(Upgrade) -i WebSocket
    acl is_websocket hdr_beg(Host) -i ws
    # The connection to use if 'is_websocket' is flagged
    use_backend socket_backend_http if is_websocket
    tcp-request inspect-delay 500ms
    tcp-request content accept if HTTP   
backend www_backend
    option httplog
    option httpclose
    balance roundrobin
    option forwardfor
    timeout server 30000
    timeout connect 4000
    server thin1 localhost:4001 weight 1 maxconn 1024 check
    server thin2 localhost:4002 weight 1 maxconn 1024 check
    server thin3 localhost:4003 weight 1 maxconn 1024 check
backend socket_backend_http
    mode http
    option httplog
    option http-server-close
    option forceclose
    no option httpclose
    balance roundrobin
    option forwardfor 
    timeout queue 5000
    timeout server 86400000
    timeout connect 86400000
    timeout check 1s
    server socket1 localhost:5001 weight 1 maxconn 1024 check

这是一个node.js套接字。io服务器。注意这个只有处理websockets。

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')
app.listen(8080);
function handler (req, res) {}
io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

和对应的客户端:

<script src="/path/to/rails/static/files/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost:8080');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

运行node server.js启动节点服务器,从rails请求index.html。

如果你需要从websocket服务器调用rails函数,你可以使用http节点模块或这个库通过http进行通信:https://github.com/mikeal/request

您可以使用bouncy,但我建议您使用HAProxy,它是高流量网站的更好解决方案。检查这个问题的样例配置:HAProxy + WebSocket disconnect

我建议使用HAProxy + Nginx来提供静态文件+ Node来提供动态文件&websockets (socket . io)。

Node -http-proxy在Node 0.6中有WebSockets问题。X,所以你现在不能使用它

最新更新