4

我正在使用托管 VM 功能运行 WebSocket 服务器,我想通过以下 URL 在任何端口(最好是端口 80)上向 Internet 公开:mvm.mydomain.com

我还没有取得太大的成功。以下是我用来完成此操作的各种文件的相关部分:

Dockerfile:

EXPOSE 8080 8081

在 Dockerfile 的末尾,启动了一个 Python 应用程序:它响应端口 8080 上的健康检查(我可以验证它是否有效)并响应端口 8081 上的 WebSocket 请求。

应用程序.yaml:

module: mvm
version: 1
runtime: custom
vm: true
api_version: 1

network:
  forwarded_ports: ["8081"]

我使用以下方法将此应用程序部署到云:

$ gcloud preview app deploy .

在云控制台中,我确保 TCP 端口 8080 和 8081 被接受用于传入流量。我还观察到分配给 GCE 实例 (mvm:1) 的 IP 地址是:xyzz

$ 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 端口转发交互中不明白的东西?

如果这可以以某种方式工作,我设想以下将是完成它的最后步骤。

调度.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');
4

1 回答 1

0

很可能appspot.com没有执行端口转发,因为在托管虚拟机(相对较新)发布之前,唯一的流量appspot.com是在端口 80 或 443 上。我建议使用 IP-of -您发现有效的实例方法。

如果您没有完全满意,您应该转到应用引擎的公共问题跟踪器并发布功能请求,让appspot.com路由器检测请求是否指向与托管 VM 对应的模块并尝试端口转发在这种情况下。

问题是,像这样将原始端口放在域的末尾意味着您的浏览器将使用您指定的端口作为到appspot.com的连接参数,而不是作为查询参数,因此appspot.com将不得不监听所有端口并重定向(如果有效)。这可能不安全/效率低下,因此端口号可能是查询参数或域字符串的一部分,类似于如何指定版本和模块......

无论如何,考虑到端口的工作方式,我非常怀疑,如果您的非常简单的示例导致失败,那么该应用程序引擎的appspot.com域目前甚至被设置为处理端口转发到托管 VM 容器。

于 2015-01-02T21:47:45.787 回答