Rails5 + ActionCable: соединение WebSocket с «ws://{hostname}/cable» не удалось: WebSocket закрывается до того, как соединение установлено

Я получаю WebSocket connection to 'ws://{hostname}/cable' failed: WebSocket is closed before the connection is established. в своем браузере Chrome при подключении к моему приложению Rails 5 + ActionCable. В моей локальной среде разработки этого не происходит. Это происходит только в моей постановочной и производственной среде.

Успешный снимок экрана при разработке

Неудачный снимок экрана при подготовке

Я использую 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 прошло успешно, но остальное неизвестно. Есть ли у вас какие-либо подсказки по решению этой проблемы?


person Yoonjae Yoo    schedule 26.07.2016    source источник
comment
Я решил эту проблему удалением балансировки нагрузки из Elastic Beanstalk, то есть созданием новой среды без автоматического масштабирования. Я предполагаю, что возникла проблема с заголовком HTTP при балансировке нагрузки.   -  person Yoonjae Yoo    schedule 27.07.2016
comment
у меня такая же проблема   -  person Kendall Weihe    schedule 27.07.2016
comment
не могли бы вы уточнить? ты на АВС?   -  person Kendall Weihe    schedule 28.07.2016
comment
Удалось ли вам найти решение этой проблемы с помощью Load Balancer?   -  person Jorge de los Santos    schedule 29.05.2018


Ответы (1)


Как уже прокомментировал автор вопроса, вероятная причина этого сбоя в соединении через веб-сокет была связана с перезаписью запроса при неправильно настроенном балансировщике нагрузки.

Например, я столкнулся с неправильно настроенным сервером Apache, где были правила перезаписи для перезаписи используемого протокола с http на ws для приложения rails.

Если это поможет другим, вот рабочая конфигурация Apache VHost, которая в этом случае включает веб-сокеты.

<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>
person sebisnow    schedule 01.03.2018