我正在使用托管虚拟机功能来运行我想通过以下网址在任何端口(最好是端口80)上暴露给互联网的WebSocket服务器:mvm.mydomain.com
我还没有取得多大成功。 以下是我用来完成此操作的各种文件的相关部分:
Dockerfile:
EXPOSE 8080 8081
在Dockerfile的末尾,启动了一个Python应用程序:它响应端口8080上的运行状况检查(我可以验证这是否有效)并响应端口8081上的WebSocket请求。
的app.yaml:
module: mvm
version: 1
runtime: custom
vm: true
api_version: 1
network:
forwarded_ports: ["8081"]
我使用以下方法将此应用部署到云端
$ gcloud preview app deploy .
在云端控制台中,我确保接收TCP端口8080和8081用于传入流量。我还观察到分配给GCE实例的IP地址(mvm:1)是:x.y.z.z。
$ curl http://x.y.z.z:8080/_ah/health
$ curl http://mvm.my-app-id.appspot.com/_ah/health
请同时使用200 OK
。
使用一些JavaScript连接WebSocket服务器也可以:
new WebSocket('ws://x.y.z.z:8081');
到目前为止一切顺利。除非这不起作用(超时):
new WebSocket('ws://mvm.my-app-id.appspot.com:8081');
我想知道为什么上面的WebSocket命令不起作用。 也许我在GAE / GCE端口转发交互中无法理解的东西?
如果这可以以某种方式工作,我设想以下将是完成它的最后步骤。
dispatch.yaml:
dispatch:
# Send all websocket traffic to the ManagedVM module.
- url: "mvm.mydomain.com/*"
module: mvm
我还在mvm.mydomain.com设置了GAE自定义域名CNAME。
使用JavaScript连接WebSocket服务器应该像:
new WebSocket('ws://mvm.mydomain.com:8081');
答案 0 :(得分:0)
由于在托管虚拟机的(相对较新的)发布之前,appspot.com
的唯一流量是appspot.com
,因此很可能未执行appspot.com
的端口转发。在端口80或443上。我建议使用您发现的IP实例方法。
如果您没有完全满意,则应转到public issue tracker for app engine并发布功能请求,让appspot.com
路由器检测请求是否指向对应的模块在这种情况下,到托管VM并尝试端口转发。
问题是,将原始端口放在域的末尾就像这意味着您的浏览器将使用您指定的端口作为appspot.com的连接参数,而不是查询参数,因此appspot.com将具有监听所有端口并重定向(如果有效)。这可能是不安全/低效的,因此端口号可能是查询参数或域字符串的一部分,类似于可以指定版本和模块...
无论如何,考虑到端口的工作方式,我非常怀疑,如果您的简单示例导致失败,那么应用引擎的{{1}}域甚至可以设置为处理端口转发到目前为止管理VM容器。