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

Node.js 如何将socket.io部署到Google App Engine?,node.js,google-app-engine,socket.io,google-cloud-platform,Node.js,Google App Engine,Socket.io,Google Cloud Platform,我使用socket.io创建了我的第一个node.js应用程序。具体来说,我实现了socket.io发布的。它在本地运行得非常好。然后我尝试将其部署到谷歌应用程序引擎(对节点进行一些代码调整以使其工作) 所有显示都表明节点部分工作正常。但是,聊天不起作用,表明socket.io部分不起作用。您可以看到已部署的应用程序(和页面源) 我还需要做些什么吗?yaml或json文件中有什么内容 yaml内容: json内容: Google有一个使用WebSockets的示例应用程序,您需要执行以下操作才能

我使用socket.io创建了我的第一个node.js应用程序。具体来说,我实现了socket.io发布的。它在本地运行得非常好。然后我尝试将其部署到谷歌应用程序引擎(对节点进行一些代码调整以使其工作)

所有显示都表明节点部分工作正常。但是,聊天不起作用,表明socket.io部分不起作用。您可以看到已部署的应用程序(和页面源)

我还需要做些什么吗?yaml或json文件中有什么内容

yaml内容:

json内容:


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

  • 为服务器打开防火墙端口,以便客户端可以访问您的服务器
  • 在Google App Engine中获取您的内部IP,以便客户端知道要连接到哪个IP
  • 通过RESTAPI或HTML页面等方式从服务器回显您的IP
应该是这样的(不过不要相信我的话,这是我在对文档做了一些研究后发现的),希望它能有所帮助

从Google App Engine中获取外部IP 打开防火墙端口
简而言之,这不能在生产中实现,而且似乎是这样。正确的架构是在googlecomputeengine上安装一个聊天服务器

但作为概念证明,在google app engine上使用socket.io与中所示非常相似

对于socket.io,请在服务器端执行以下步骤。下面是代码片段

  • 创建第二个express中间件和服务器
  • 在新服务器上附加/使用socket.io
  • 收听端口(65080)
  • 在谷歌计算引擎上为端口(65080)打开防火墙
  • 链接到

  • 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对持久套接字连接的支持已经到来

    要实现这一点,您需要使用
    flex
    环境,并修改
    app.yaml
    以包含
    session\u affinity

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

    阅读deets网站:


    这个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"
    

    我觉得我已经很接近了,但还没开始工作。我打开了防火墙端口并部署了GoogleWebSocket项目。成功了。但我还不知道如何使它与socket.io一起工作。因为socket.io正在使用8080中侦听的服务器和express启动服务器var server=app.listen(process.env.PORT | | |'8080',0.0.0.0',function(){console.log('按Ctrl+C退出');});var io=require('socket.io')(服务器);示例应用程序的链接已断开;这一条似乎很接近:谷歌示例应用程序的链接断开了;这一个似乎很接近:我在控制台中收到此错误无法加载资源:net::ERR\u CONNECTION\u TIMED\u移动设备上有任何问题吗?桌面上的一切都很好,但在我的iPhone(safari和chrome)上它无法连接。此外,我还没有打开任何其他端口…一切都通过8080。最后,我的应用程序正在使用我已经准备好的https,这可能会导致问题……我在这里被难住了。我在手机上仍然有问题。我试着使用https,但chrome似乎不接受这个证书。即使Safari也可以,同样的引擎@汤姆:你有没有想过?我将尝试将我的后端移动到AWS。这对我来说是有效的。对于我的应用程序引擎实例,只有yaml配置足够,不需要更改防火墙设置
    gcloud compute firewall-rules create default-allow-websockets \
        --allow tcp:65080 \
        --target-tags websocket \
        --description "Allow websocket traffic on port 65080"
    
    network:
      session_affinity: true
    
    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"