2017-02-16 32 views
22

我有一個Rails 5應用程序,它使用Action Cable作爲websocket功能。ActionCable不再在生產環境中工作

在我的開發環境中,一切都按預期工作,瀏覽器客戶端成功連接到Action Cable頻道。

在我的生產環境Action Cable正在某個時間點工作,但之後突然停止運行,沒有任何明顯的原因。

如果我在開發計算機上運行應用程序Action Cable時將RAILS_ENV更改爲production工作正常。在實際生產機器上運行應用程序時,情況似乎有所不同,但基本環境相同。

特定的錯誤我在Chrome控制檯中看到:

mydomain.com/:1 WebSocket connection to 'wss://mydomain.com/cable' failed: WebSocket is closed before the connection is established。我在其他瀏覽器中看到類似的錯誤,所以它似乎不是瀏覽器相關的。我在測試時禁用了任何adblockers,以確保它們不會發生干擾。

Development.rb ENV相關的設置:

config.action_cable.url = "ws://localhost:#{port}/cable" 

Production.rb ENV相關的設置:

hostname = ENV.fetch('HOSTNAME') 
    port = ENV.fetch('PORT') 
    base_url = "#{hostname}:#{port}" 

    config.action_cable.url = "wss://#{hostname}/cable" 
    config.action_cable.allowed_request_origins = ["https://#{base_url}", "https://#{hostname}"] 

我用Puma作爲一個網絡服務器。網絡服務器提供安裝有效證書的SSL連接。在生產機器上,Puma在端口3000上提供應用程序,但將其轉發到路由器中的端口443

在我的開發機器和生產環境中運行應用程序的唯一顯着差異是在生產中使用SSL。

+0

您使用AWS嗎? – Shannon

+0

@Shannon Nope,在Synology NAS上使用Docker容器託管 – edwardmp

+0

由於缺乏代表,我無法對此問題發表評論;你用什麼來服務這個? Nginx的? Apache的?它在本地設置「production」的事實表明Web服務器配置存在問題。你運行什麼Docker容器?您的NAS上運行什麼操作系統?需要所有這些信息。 – FanaHOVA

回答

7

我現在可以有把握地斷定這是一個錯誤的默認端口443上,大概在軌道/ ActionCable本身。其他報告證實了這一點,正如我曾經說過的那樣,它運行良好,這是我使用Rails 時的情況。當我更新到5.0.1時,它打破了,並且它在5.0.2上仍然被破壞。我正在Rails項目的GitHub issue tracker上打開一個問題。

編輯2017年7月:Rails確實改變了它如何讀取和寫入機架套接字,但是您使用的實際webserver軟件需要支持這些非阻塞讀取和寫入方法。就我而言,彪馬當時並沒有因此websocket不起作用。對於彪馬,現在有一個解決此問題的新版本。

+0

在我的情況下,這是一個AR模型的錯誤記憶,所以相應的模型未被加載到不同的聊天室。 – artificis

2

根據您的問題聲明

  • 您的開發環境中工作,因爲你已經將它設置爲處理不安全的網絡流量,但在生產環境設置來處理安全流量。

Development.rb ENV相關的設置:

config.action_cable.url = "ws://localhost:#{port}/cable" 

Production.rb ENV相關的設置:

config.action_cable.url = "wss://#{hostname}/cable" 

根據您的網絡設置已配置您的SSL端口重定向到端口3000 a發送來自PUMA rb服務器的Web服務請求。

現在我看到了這裏的問題是wss://#{hostname}將嘗試偵聽安全流量,而不是你的重定向端口3000

+0

你是對的,在我的開發機器上我沒有使用SSL。端口443被轉發到3000,所以不應該有任何區別,對吧? – edwardmp

+0

您需要在url中添加端口。您的託管服務器美洲獅將負責處理流量。 – Mozfox

+0

好吧,讓我試試,雖然應該沒有區別,因爲兩個端口之間的轉發 – edwardmp

相關問題