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