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

我使用socket.io创build了我的第一个node.js应用程序。 具体来说,我实现了由socket.io发布的聊天示例 。 它在当地是完美的。 然后我尝试将其部署到Google App Engine(使一些代码调整为节点工作)。

一切都显示出来,表明节点部分工作正常。 然而,聊天不起作用,表明socket.io部分不起作用。 您可以在这里看到已部署的应用程序(和页面源代码)。

我需要额外做些什么吗? 在YAML或JSON文件中的东西?

yaml含量:

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计算引擎上有一个聊天服务器。

但作为在谷歌应用引擎上使用socket.io的概念certificate,与在websockets的google appengine示例中显示的非常相似。

在socket.io的情况下,请在服务器端执行以下步骤。 下面的代码片段。

  1. 创build第二个快递中间件和服务器。
  2. 附加/使用新的服务器的socket.io。
  3. 听港口(65080)。
  4. 在Google计算引擎上打开防火墙(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" 

我希望Google能够及时提供一个可以立即投入使用的解决scheme,因为这将成为任何PaaS-arsenal的关键装备。

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

  • 打开服务器的防火墙端口,以便客户端可以访问您的服务器
  • 在Google App Engine中获取您的内部IP,以便客户端知道要连接的IP
  • 通过类似于其他API或HTML页面的东西,从您的服务器回应您的IP

应该是这样的(不要拿我的话来说吧,这是我对文档做了一些研究之后才发现的),希望它有帮助!

从Google App Engine中获取外部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"