2014-12-24 37 views
4

我正在使用託管虛擬機功能來運行WebSocket服務器,我想通過URL(如:mvm.mydomain)在任何端口(最好是端口80)上公開Internet。 com公開ManagedVM中的多個端口

我還沒有太多的成功。 下面是我用來實現這一目標的各種文件的相關部分:

Dockerfile:

EXPOSE 8080 8081 

在Dockerfile的結束,一個Python應用程序已啓動:它響應端口健康檢查8080(我可以驗證這一點的作品),並響應WebSocket的端口要求8081

的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'); 

回答

0

它很可能是從appspot.com端口轉發不執行,即管理虛擬機的(比較近)發佈之前給出,唯一去往appspot.com的流量是80端口或443端口。我建議使用您發現的IP實例方法。

如果您沒有發現完全滿意,則應該轉到public issue tracker for app engine併發布功能請求以使appspot.com路由器檢測請求是否正在前往與受管VM相對應的模塊,並嘗試進行端口轉發在這種情況下。

問題是,將原始端口放在域名末尾就意味着您的瀏覽器將使用您指定的端口作爲appspot.com的連接參數,而不是查詢參數,因此appspot.com將必須在所有端口上收聽,並在有效時重定向。這可能是不安全/低效的,所以也許端口號可能是查詢參數或域字符串的一部分,類似於如何指定版本和模塊......

無論如何,給定端口我非常懷疑,如果你的簡單例子導致失敗,該應用引擎的域名甚至被設置爲目前處理到託管VM容器的端口轉發。

+1

感謝您的建議。我提交了[ticket](https://code.google.com/p/googleappengine/issues/detail?id=11570) – kvdb