【问题标题】:Exposing multiple ports from within a ManagedVM从 ManagedVM 中公开多个端口
【发布时间】:2014-12-24 14:27:44
【问题描述】:

我正在使用托管 VM 功能运行一个 WebSocket 服务器,我想通过如下 URL 在任何端口(最好是端口 80)上向 Internet 公开该服务器: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 实例 (mvm:1) 的 IP 地址是: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');

【问题讨论】:

    标签: google-app-engine websocket docker gcloud


    【解决方案1】:

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

    如果您没有完全满意,您应该转到public issue tracker for app engine 并发布功能请求,让appspot.com 路由器检测请求是否指向与托管 VM 对应的模块并尝试在这种情况下的端口转发。

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

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

    【讨论】:

    • 感谢您的建议。我提交了ticket
    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2020-07-21
    相关资源
    最近更新 更多