2017-02-16 22 views
22

У меня есть приложение Rails 5, которое использует Action Cable для функциональности websocket.ActionCable больше не работает в рабочей среде

В моей среде разработки все работает так, как ожидалось, и клиенты браузера успешно подключаются к каналам 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" 

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 – edwardmp

+0

Я не могу комментировать эту проблему из-за отсутствия rep; что вы используете для этого? Nginx? Apache? Тот факт, что он работает с установкой 'production' локально, указывает на проблему с конфигурацией веб-сервера. Какой контейнер Docker вы используете? Какая ОС работает на вашем NAS? Нужна вся эта информация. – FanaHOVA

ответ

7

теперь я могу с уверенностью заключить, что это ошибка, вероятно, в самой Rails/ActionCable. Это подтверждается другими отчетами, и, как я сказал, в какой-то момент он работал нормально, это было, когда я использовал Rails .Когда я обновился до 5.0.1, он сломался и остался сломанным на 5.0.2. Я открываю проблему в GitHub issue tracker проекта Rails.

Редактировать Июль 2017: Rails что-то изменило в отношении того, как он читает и записывает в сокет Rack, однако используемое вами программное обеспечение веб-сервера должно поддерживать эти неблокирующие методы чтения и записи. В моем случае, Puma в то время не было, поэтому веб-порты не работали. Для Puma теперь появилась новая версия с обходным решением для этой проблемы.

+0

В моем случае это была неправильная memoization модели 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.

Теперь проблема я вижу здесь является wss://#{hostname}, будет пытаться прослушивать по умолчанию порт 443 для безопасного трафика вместо вашего перенаправлен порт 3000

+0

. Вы верны, на моей машине dev я не использую SSL. Порт 443 перенаправляется на 3000, так что это не должно иметь никакого значения, не так ли? – edwardmp

+0

Вам нужно добавить порт в URL. Ваш хостинг-сервер puma позаботится об управлении трафиком. – Mozfox

+0

Хорошо, позвольте мне попробовать, хотя не должно быть разницы из-за пересылки между двумя портами. – edwardmp