使用nginx的多个上游faye websocket服务器

使用nginx的多个上游faye websocket服务器,nginx,websocket,thin,faye,Nginx,Websocket,Thin,Faye,我想集群我的faye websocket服务器。单台服务器运行良好,但我想做好扩展的准备。 我的第一次尝试是在不同的套接字上启动一些精简服务器,然后将它们添加到nginx中我的服务器的上游 bayeux消息分布在集群中,但chrome开发工具显示大约16个 websocket 101连接在联网面板的框架选项卡中关闭连接: Connection Close Frame (Opcode 8) Connection Close Frame (Opcode 8, mask) 所有faye实例的服务器端

我想集群我的faye websocket服务器。单台服务器运行良好,但我想做好扩展的准备。 我的第一次尝试是在不同的套接字上启动一些精简服务器,然后将它们添加到nginx中我的服务器的上游

bayeux消息分布在集群中,但chrome开发工具显示大约16个 websocket 101连接在
联网
面板的
框架
选项卡中关闭连接:

Connection Close Frame (Opcode 8)
Connection Close Frame (Opcode 8, mask)
所有faye实例的服务器端都有一大堆
/meta/connect
/meta/handshake

摘录:

D, [2013-11-15T15:34:50.215631 #5344] DEBUG -- : {"channel"=>"/meta/connect",  "clientId"=>"q7odwfbovudiw87dg0jke3xbrg51tui", "connectionType"=>"callback-polling", "id"=>"p"}
D, [2013-11-15T15:34:50.245012 #5344] DEBUG -- : {"channel"=>"/meta/connect", "clientId"=>"ckowb5vz9pnbh7jwomc8h0qsk8t0nus", "connectionType"=>"callback-polling", "id"=>"r"}
D, [2013-11-15T15:34:50.285460 #5344] DEBUG -- : {"channel"=>"/meta/handshake", "version"=>"1.0", "supportedConnectionTypes"=>["callback-polling"], "id"=>"u"}
D, [2013-11-15T15:34:50.312919 #5344] DEBUG -- : {"channel"=>"/meta/handshake", "version"=>"1.0", "supportedConnectionTypes"=>["callback-polling"], "id"=>"w"}
D, [2013-11-15T15:34:50.356219 #5344] DEBUG -- : {"channel"=>"/meta/handshake", "version"=>"1.0", "supportedConnectionTypes"=>["callback-polling"], "id"=>"y"}
D, [2013-11-15T15:34:50.394820 #5344] DEBUG -- : {"channel"=>"/meta/handshake", "version"=>"1.0", "supportedConnectionTypes"=>["callback-polling"], "id"=>"10"}
启动精简服务器(每个服务器在其自己的终端中):

我的精简配置:

---
environment: development
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 100
require: []
wait: 30
# socket: /tmp/faye.sock
daemonize: false
rackup: config.ru
我的NGINX配置:

upstream thin_cluster {
  server unix:/tmp/faye.1.sock fail_timeout=0;
  server unix:/tmp/faye.2.sock fail_timeout=0;
  server unix:/tmp/faye.3.sock fail_timeout=0;
}

server {
  # listen 443;
  server_name ~^push\.mysite\.dev(\..*\.xip\.io)?$;
  charset UTF-8;
  tcp_nodelay on;

  # ssl on;
  # ssl_certificate  /var/www/heypresto/certificates/cert.pem;
  # ssl_certificate_key /var/www/heypresto/certificates/key.pem;
  # ssl_protocols TLSv1 SSLv3;

  location / {
    proxy_pass http://thin_cluster;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    break;
  }
}
我认为为WebSocket设置更多的上游太好了,这是不真实的,而且它会起作用,但它看起来太接近了

编辑:我意识到这可能行不通,我可能应该创建N个服务器(push1.mysite.dev、push2.mysite.dev等),并让后端告诉前端要连接哪个服务器


不过,如果有什么想法的话…

websocket rails也有同样的问题。你能填写一下你认为失败的原因吗?我想应该没问题吧?当你发布一条消息时,复杂性就来了。你如何发布到正确的faye服务器,以便它可以将消息发送到连接的客户端。我想,对所有faye服务器进行全局发布是可行的。至于最初的操作码8掩码错误,我想知道它的解释。我知道这很旧,但是你可以使用faye redis插件使用多个faye服务器。通常,faye会在自己的进程中将所有连接状态详细信息保存在内存中,因此一个faye不会知道是否有人在监听另一个faye服务器。Faye redis将状态存储在redis中,可以由尽可能多的Faye服务器共享,只要您的redis服务器可以处理。因此,如果使用redis进行存储,那么发布到faye服务器push1.mysite.dev的消息仍然会被发送到收听push2.mysite.dev的客户端。谢谢,这很有趣!你有没有可能补充一个完整的答案?
upstream thin_cluster {
  server unix:/tmp/faye.1.sock fail_timeout=0;
  server unix:/tmp/faye.2.sock fail_timeout=0;
  server unix:/tmp/faye.3.sock fail_timeout=0;
}

server {
  # listen 443;
  server_name ~^push\.mysite\.dev(\..*\.xip\.io)?$;
  charset UTF-8;
  tcp_nodelay on;

  # ssl on;
  # ssl_certificate  /var/www/heypresto/certificates/cert.pem;
  # ssl_certificate_key /var/www/heypresto/certificates/key.pem;
  # ssl_protocols TLSv1 SSLv3;

  location / {
    proxy_pass http://thin_cluster;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    break;
  }
}