如何将 socket.io 部署到 Google App Engine



我用 socket.io 创建了我的第一个节点.js应用程序。具体来说,我实现了 socket.io 发布的聊天示例。它在本地完美运行。然后我尝试将其部署到Google App Engine(对节点进行一些代码调整)。

所有显示都表明节点部分运行良好。但是,聊天不起作用,表明 socket.io 部分不起作用。可以在此处查看已部署的应用(和页面源代码)。

我还需要做任何额外的事情吗?yaml 或 json 文件中有内容?

亚姆林内容:

runtime: nodejs
vm: true
skip_files:
  - ^(.*/)?.*/node_modules/.*$

JSON内容:

{
  "name": "Chaty",
  "description": "chatrooms app",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "McChatface",
  "engines": {
    "node": "~4.2"
  },
  "scripts": {
    "start": "node app.js",
    "monitor": "nodemon app.js",
    "deploy": "gcloud preview app deploy"
  },
  "dependencies": {
    "express": "^4.13.4",
    "socket.io": "^1.4.6"
  }
}

简而言之,这不能在生产中完成,它似乎是正在进行的工作。正确的架构是在谷歌计算引擎上有一个聊天服务器,如此处所述。

但是,作为在Google App Engine上使用 socket.io 的概念证明,与Google appengine示例中显示的websockets非常相似。

如果出现 socket.io 请在服务器端执行以下步骤。下面的代码片段。

  1. 创建第二个快速中间件和服务器。
  2. 将 socket.io 与新服务器连接/使用。
  3. 侦听端口 (65080)。
  4. 在谷歌计算引擎上为端口 (65080) 打开防火墙。
  5. 链接到工作存储库。

服务器端 socket.io 更改

    var app_chat = require('express')();
    var server1 = require('http').Server(app_chat);
    var io = require('socket.io')(server1);
    server1.listen(65080);
    io.on('connection', function (socket) {
      console.log('user connected');
      socket.on('chat_message', function (data) {
        console.log('client sent:',data);
        socket.emit('chat_message', 'Server is echoing your message: ' + data);
      });
    });

通过命令打开防火墙

gcloud compute firewall-rules create default-allow-websockets 
    --allow tcp:65080 
    --target-tags websocket 
    --description "Allow websocket traffic on port 65080"

我希望谷歌尽快提出一个生产就绪的解决方案,因为这将成为任何PaaS武器库中的关键武器。

GAE 对持久套接字连接的支持于 2019 年 2 月推出!

要完成此操作,您需要使用 flex 环境并修改app.yaml以包含session_affinity

network:
  session_affinity: true

请注意,我仍然必须打开端口 65080 才能使其正常工作,但我不需要其他更改。

阅读以下信息:

https://cloud.google.com/appengine/docs/flexible/nodejs/using-websockets-and-session-affinity

Google 这里有一个使用 WebSockets 的示例应用程序,您需要执行以下操作才能使其正常工作:

  • 为服务器打开防火墙端口,以便客户端可以访问您的服务器
  • 在 Google App Engine 中获取您的内部 IP,以便客户知道要连接到哪个 IP
  • 通过 rest API 或 HTML 页面等方式从服务器中回显您的 IP

应该是这样(不过不要相信我的话,这是我在对文档进行一些研究后能够发现的),希望它有所帮助!

从谷歌应用引擎中获取您的外部IP

var METADATA_NETWORK_INTERFACE_URL = 'http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip';
function getExternalIp (cb) {
    var options = {
        url: METADATA_NETWORK_INTERFACE_URL,
        headers: {
            'Metadata-Flavor': 'Google'
        }
    };
    request(options, function (err, resp, body) {
        if (err || resp.statusCode !== 200) {
            console.log('Error while talking to metadata server, assuming localhost');
            return cb('localhost');
        }
        return cb(body);
    });
}

打开防火墙端口

gcloud compute firewall-rules create default-allow-websockets 
    --allow tcp:65080 
    --target-tags websocket 
    --description "Allow websocket traffic on port 65080"

这个 app.yaml 配置对我有用:

runtime: nodejs
env: flex
manual_scaling:
instances: 1
network:
 session_affinity: true

我通过以下命令启用了防火墙规则:

gcloud compute firewall-rules create default-allow-websockets     --allow 
tcp:65080     --target-tags websocket     --description "Allow websocket 
traffic on port 65080"

最新更新