2016-07-26 233 views
8

當我連接到我的Rails 5 + ActionCable應用程序時,在我的Chrome瀏覽器中獲得WebSocket connection to 'ws://{hostname}/cable' failed: WebSocket is closed before the connection is established.。在我的本地開發環境中,它不會發生。它只發生在我的舞臺和製作環境中。Rails5 + ActionCable:連接到'ws:// {主機名} /電纜'的WebSocket連接失敗:在連接建立之前關閉WebSocket

Successful screenshot on development

Failed screenshot on staging

我使用Amazon ElasticBeanstalk部署我的應用程序。使用chrome開發人員工具監視請求後,我發現與開發環境不同,生產環境中的WebSocket請求不會響應(掛起),因此ActionCable會不斷嘗試連接到WebSocket端點(ws:// {hostname} /電纜)。

的事情是,在我的puma.log,它說是這樣的:

I, [2016-07-26T13:45:53.921154 #32369] INFO -- : Registered connection (Z2lkOi8vYXNrLWNvLWRlL1VzZXIvMg) 
I, [2016-07-26T13:46:05.775788 #32369] INFO -- : Finished "/cable/" [WebSocket] for 121.166.105.106 at 2016-07-26 13:46:05 +0000 
I, [2016-07-26T13:46:18.074895 #32369] INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Started GET "/cable" for 121.166.105.106 at 2016-07-26 13:46:18 +0000 
I, [2016-07-26T13:46:18.075764 #32369] INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Started GET "/cable/" [WebSocket] for 121.166.105.106 at 2016-07-26 13:46:18 +0000 
I, [2016-07-26T13:46:18.075817 #32369] INFO -- : [917fd706-4f1a-4178-bd95-7a33c0c7b621] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket) 

就是升級到WebSocket的成功,但其餘的是未知的。你有解決這個問題的線索嗎?

+0

我通過從Elastic Beanstalk中刪除負載平衡來解決此問題,即通過創建新環境而不自動縮放。我想在負載均衡的時候有一些關於HTTP頭的問題。 –

+0

我有同樣的問題 –

+0

你能否詳細說明一下?你在AWS嗎? –

回答

0

作爲該問題的作者,已經評論過websocket連接失敗的可能原因是由於在錯誤配置Loadbalancer後發生請求重寫。

例如,我遇到了一個錯誤配置的Apache服務器,其中重寫規則已就位,以重寫使用的協議從http到ws的rails應用程序。

如果它幫助其他人在這裏工作的Apache VHost配置,在這種情況下啓用websockets。

<VirtualHost domain.of.the.rails-app:80> 
    ServerName domain.of.the.rails-app 
    DocumentRoot /var/www/apps/rails-app/public 
    ProxyPreserveHost On 
    ProxyPass /error-documents ! 
    ErrorDocument 503 /error-documents/503.html 
    Alias /error-documents /var/www/apps/rails-app/public 
    ProxyPass/http://0.0.0.0:3000/ 
    ProxyPassReverse/http://0.0.0.0:3000/ 
    RewriteEngine on 
    RewriteCond %{HTTP:UPGRADE} websocket [NC] 
    RewriteRule /(.*) ws://localhost:3000/$1 [P] 
</VirtualHost> 
相關問題