使用 Cloud Foundry 和 NginX Build Pack 扩展 Socket.io Node.js 应用程序

Scaling Socket.io Node.js App using Cloud Foundry and NginX Build Pack

我正在尝试使用 Cloud Foundry(在 IBM Cloud 上)横向扩展我的 Socket.io Node.js 服务器。

截至目前,我的 cf manifest.yml 如下所示:

applications:
  - name: chat-app-server
    memory: 512M
    instances: 2
    buildpacks:
      - nginx_buildpack

这样部署就完成了,当然客户端和服务器之间的套接字连接失败了,因为连接不粘。

官方Socket.io文档给出了一个使用NginX来使用多节点的例子。 使用 Socket.io template 使用自定义 nginx.conf 文件时,我遗漏了一些信息(用 ??? 突出显示)。

events { worker_connections 1024; }

http {

  server {
    listen {{port}};
    server_name ???;

    location / {


        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;

        proxy_pass http://nodes;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

  }

    upstream nodes {
       # enable sticky session based on IP
       ip_hash;

       server ???:???;
       server ???:???;
  }
}

我试图找出 cloud foundry 在何处运行 manifest.yml 文件中指定的两个实例,但没有成功。

如何从 Cloud Foundry 获得所需的服务器 addresses/ports? 有没有办法从 CF 中动态获取这些信息?

我正在使用 cf push 部署我的应用程序。

我之前没有使用过 Socket.IO,所以我可能偏离了基础,但通过快速阅读文档,似乎一切都应该可行。

文档中的两点:

a.) 使用 WebSockets 时,这不是问题。 Cloud Foundry 完全支持 WebSockets。希望您的大多数客户都能做到这一点。

b.) 当退回到长轮询时,你需要粘性会话。 Cloud Foundry 支持开箱即用的粘性会话,因此,这应该也能正常工作。关于 CF 对粘性会话的支持,有一个警告,它希望会话 cookie 名称为 JSESSIONID.

同样,我对 Socket.IO 不是很熟悉,但我怀疑它可能在默认情况下使用不同的会话 cookie 名称(Java 之外的大多数事情都是如此)。您只需将会话 cookie 名称更改为 JSESSIONID,粘性会话就可以工作了。

提示:您可以通过在浏览器的开发工具中查看您的 cookie 来检查会话 cookie 名称。

最后的说明。你在这里根本不需要 Nginx。 Gorouter 是 Cloud Foundry 的路由层,将为您处理粘性会话支持。