【问题标题】:A good solution for a WebSocket / Socket.IO server (I've tried Nginx, Node, etc.)WebSocket / Socket.IO 服务器的一个很好的解决方案(我尝试过 Nginx、Node 等)
【发布时间】:2012-01-27 11:07:45
【问题描述】:

我有兴趣设置一个 Socket.IO 服务器 + Rails Web 应用程序。然而,正如许多人所知,支持 WebSocket 的 Web 服务器并不多。到目前为止,这是我的 2 次尝试:

  1. 我尝试了 Nginx-module 路由。无法获得编译+配置的组合以使其完全正常工作。可能对我来说有些愚蠢。

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

  2. 我尝试使用 node-http-proxy 编写自己的 Web 服务器,但尽管阅读了所有教程,但我无法将其与 Socket.IO 完全集成。

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

  3. 我尝试使用 bouncy.js 编写自己的 Web 服务器,但速度非常慢。可能是我的代码,可能是框架。我不知道。

    http://github.com/substack/bouncy

这些是我尝试过的事情,我只是好奇还有谁走上了这些路线并最终得到了一些工作(当然,他们做了什么来让它工作)。

【问题讨论】:

  • 问题不清楚,你的目标是什么?代理到rails?为了提供有用的信息:我用 node.js 轻松设置了 socket.io,但我将它用作独立的网络服务器(通常使用 express.js)
  • @ChrisBiscardi 我想听听任何让 Socket.IO 与 Rails 应用程序一起工作的人,以及他们采取了哪些步骤来使其工作...... express.js 的问题在于(1) 我已经有很多遗留的 Rails 代码和 (2) 我用过的两个用于集成 WebSockets 的框架,我的结果如上所示。

标签: node.js websocket socket.io


【解决方案1】:

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

但是,描述此配置的所有部分的作用超出了本文的范围,但您可以在 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

【讨论】:

【解决方案2】:

这是一个 node.js socket.io 服务器。请注意,这处理 websocket。

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

【讨论】:

  • 感谢这篇文章。我已经看过socket.io 上的文档,所以我很清楚这是起点。我在这篇文章中提出的问题是如何同时处理 WebSocket 和标准 HTTP 请求。
  • 这样就可以了。 80 端口上的旧 Ruby 代码和 8080 端口上的节点/websockets。你想用节点处理 HTTP 吗?
【解决方案3】:

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

我建议使用 HAProxy + Nginx 提供静态文件 + Node 提供动态内容和 websockets (Socket.IO)。

node-http-proxy 在 Node 0.6.x 中遇到了 WebSockets 的问题,因此很遗憾您目前无法使用它。

【讨论】:

  • 刚刚开始工作。从头到尾没有遵循任何一个教程,但一系列技巧似乎奏效了。看来我以后会更多地使用 HAProxy。
  • @robinhoode 太好了,也许您可​​以在这里发布配置,以便人们稍后查看。我对 HAProxy 玩了一点,需要在我的下一个项目中实现它,但到目前为止它一直很棒。例如,Trello.com 在生产中使用它。
猜你喜欢
  • 2012-10-16
  • 2012-08-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2015-08-19
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多