У меня есть приложение Rails 5, которое использует Action Cable
для функциональности websocket.
В моей среде разработки все работает так, как ожидалось, и клиенты браузера успешно подключаются к каналам Action Cable
.
В моей рабочей среде Action Cable
работал в какой-то момент, но затем внезапно прекратил работу без какой-либо непосредственной очевидной причины.
Если я изменил RAILS_ENV
на production
во время запуска приложения на моей машине разработки Action Cable
, это прекрасно. Что-то кажется другим при запуске приложения на реальной производственной машине, хотя базовая среда одна и та же.
Конкретная ошибка, которую я вижу на консоли Chrome:
mydomain.com/:1 WebSocket connection to 'wss://mydomain.com/cable' failed: WebSocket is closed before the connection is established
. Я получаю аналогичную ошибку в других браузерах, поэтому она не связана с браузером. Я отключил любые рекламные блоки во время тестирования, чтобы убедиться, что они не мешают.
Development.rb Настройка, связанная с ENV:
config.action_cable.url = "ws://localhost:#{port}/cable"
Производственная программа ENV, связанная с 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.