Node.js 如何将socket.io部署到Google App Engine?
我使用socket.io创建了我的第一个node.js应用程序。具体来说,我实现了socket.io发布的。它在本地运行得非常好。然后我尝试将其部署到谷歌应用程序引擎(对节点进行一些代码调整以使其工作) 所有显示都表明节点部分工作正常。但是,聊天不起作用,表明socket.io部分不起作用。您可以看到已部署的应用程序(和页面源) 我还需要做些什么吗?yaml或json文件中有什么内容 yaml内容: json内容: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的示例应用程序,您需要执行以下操作才能
Google有一个使用WebSockets的示例应用程序,您需要执行以下操作才能使其正常工作:
- 为服务器打开防火墙端口,以便客户端可以访问您的服务器
- 在Google App Engine中获取您的内部IP,以便客户端知道要连接到哪个IP
- 通过RESTAPI或HTML页面等方式从服务器回显您的IP
简而言之,这不能在生产中实现,而且似乎是这样。正确的架构是在googlecomputeengine上安装一个聊天服务器 但作为概念证明,在google app engine上使用socket.io与中所示非常相似 对于socket.io,请在服务器端执行以下步骤。下面是代码片段
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"