A good solution for a WebSocket / Socket.IO server (I've tried Nginx, Node, etc.)

后端 未结 3 717
一整个雨季
一整个雨季 2020-12-25 09:09

I\'m interested in setting up a Socket.IO server + Rails web application. However, as many are aware, there are not many web servers that support WebSockets. Here have been

相关标签:
3条回答
  • 2020-12-25 09:37

    You can use bouncy, but I'd recommend HAProxy, which is a better solution for highly trafficked websites. Check this question for a sample configuration: HAProxy + WebSocket Disconnection

    I would recommend using HAProxy + Nginx for serving static files + Node for dynamic stuff & websockets (Socket.IO).

    node-http-proxy is having problems with WebSockets in Node 0.6.x, so you cannot use that at the moment unfortunately.

    0 讨论(0)
  • 2020-12-25 09:39

    Here is a node.js socket.io server. note that this only handles 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);
      });
    });
    

    and the corresponding client:

    <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>
    

    run node server.js to start up the node server and request the index.html from rails.

    If you need to call rails functions from the websocket server you can communicate over http using either the http node module or this library: https://github.com/mikeal/request

    0 讨论(0)
  • 2020-12-25 09:41

    As per alessioalex's request, here's my configuration file. I deleted all the existing comments but added a few that I, myself, would not have figured to be important.

    However, describing what all the parts of this config does is out of the scope of this post, but you can likely find the necessary documentation on the HAProxy website.

    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
    
    0 讨论(0)
提交回复
热议问题