公开ManagedVM中的多个端口

我正在使用Managed VMfunction来运行一个WebSocket服务器,我想通过以下URL访问任何端口(最好是端口80)的Internet:mvm.mydomain.com

我还没有太多的成功。 以下是我用来完成这个任务的各种文件的相关部分:

Dockerfile:

EXPOSE 8080 8081 

在Dockerfile的最后,启动了一个Python应用程序:它响应8080端口的运行状况检查(我可以validation这个工作),并响应端口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可以接收传入stream量。 我也观察到分配给GCE实例(mvm:1)的IP地址是:xyzz

 $ curl http://xyzz:8080/_ah/health $ curl http://mvm.my-app-id.appspot.com/_ah/health 

200 OK回应。

使用一些JavaScript连接WebSocket服务器也是如此:

 new WebSocket('ws://xyzz: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'); 

appspot.com端口转发可能不会执行,因为在(相对较新的)托pipeVM版本之前,转到appspot.com的唯一stream量是在端口80或443上。build议使用您发现的IP实例方法。

如果您没有find完全令人满意的地方,则应该前往应用引擎的公共问题跟踪器,并发布function请求以使appspot.com路由器检测请求是否正在前往与托pipe虚拟机相对应的模块并尝试这种情况下的端口转发。

问题是,将原始端口放在域名的末尾,这意味着您的浏览器将使用您指定的端口作为appspot.com的连接参数,而不是查询参数,所以appspot.com将不得不所有端口和redirect如果有效。 这可能是不安全/低效的,所以也许端口号可能是一个查询参数或域string的一部分,类似于如何指定版本和模块…

无论如何,考虑到端口的工作方式,如果你的例子很简单,导致失败,我甚至怀疑这个应用引擎的appspot.com域甚至设置了处理端口转发到托pipe虚拟机的容器。