我正在使用托管 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');