Работает ли Rails с Action Cable с проксированием NGiNX перед Puma?

Я знаю, что есть еще 1-2 вопроса по этой теме, но ни один из них, похоже, не охватывает мою точку зрения и не предлагает решения;

Консоль моего браузера говорит:

WebSocket connection to 'wss://sucker.alco.dk/cable' failed: WebSocket is closed before the connection is established.

Я бы легко согласился на это, если бы только «кабель» вообще работал :( Работа в разработке заставила меня броситься в банк, но, увы, в производстве все не так блестяще, я боюсь :(

Мой Ruby довольно старый — 2.1.2p95 — мой Rails несколько новее:

# Gemfile
gem 'rails', '~> 5.1.6', '>= 5.1.6.2'
gem 'mysql2', '>= 0.4.4', '< 0.6.0'
gem 'puma', '~> 3.7'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'redis', '~> 4.0'

Я добавил задачу на github.com/puma/puma, но как и другие участники из этого сообщества отмечают, что они используют почти те же самые настройки - с успехом - поэтому они любезно указывают пальцем на Rails; В основном я думаю, что упускаю какую-то глупую деталь :$

На github.com/wdiechmann/sucker есть демонстрационный проект, если вы готовы к некоторой отладке, но доброе слово, мокрый платок на лоб или полное молчание - я не привередлив ;)

РЕДАКТИРОВАТЬ 24.05.2019

Мой production.log никоим образом не выглядит запуганным — все я

I, [2019-05-24T07:19:01.182723 #21335]  INFO -- : [9855de1f-65b0-41d5-bdd1-726dad5a875e] Started GET "/cable" for 92.246.28.33 at 2019-05-24 07:19:01 +0200
I, [2019-05-24T07:19:01.183340 #21335]  INFO -- : [9855de1f-65b0-41d5-bdd1-726dad5a875e] Started GET "/cable/" [WebSocket] for 92.246.28.33 at 2019-05-24 07:19:01 +0200
I, [2019-05-24T07:19:01.183425 #21335]  INFO -- : [9855de1f-65b0-41d5-bdd1-726dad5a875e] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)
I, [2019-05-24T07:19:11.398314 #21335]  INFO -- : Finished "/cable/" [WebSocket] for 92.246.28.33 at 2019-05-24 07:19:11 +0200
I, [2019-05-24T07:19:12.545945 #21335]  INFO -- : [6d9a5967-57c7-45bf-b99e-2f3d74ba72f6] Started GET "/cable" for 92.246.28.33 at 2019-05-24 07:19:12 +0200
I, [2019-05-24T07:19:12.546559 #21335]  INFO -- : [6d9a5967-57c7-45bf-b99e-2f3d74ba72f6] Started GET "/cable/" [WebSocket] for 92.246.28.33 at 2019-05-24 07:19:12 +0200
I, [2019-05-24T07:19:12.546677 #21335]  INFO -- : [6d9a5967-57c7-45bf-b99e-2f3d74ba72f6] Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)
I, [2019-05-24T07:19:22.914389 #21335]  INFO -- : Finished "/cable/" [WebSocket] for 92.246.28.33 at 2019-05-24 07:19:22 +0200

Но мне нравится верить, что я пропустил хотя бы пару строк «журнала» (например, как это показано в моем development.log)

Started GET "/cable" for ::1 at 2019-05-24 07:39:47 +0200
Started GET "/cable/" [WebSocket] for ::1 at 2019-05-24 07:39:47 +0200
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
MessageChannel is transmitting the subscription confirmation
MessageChannel is streaming from message_channel

- и я бы очень хотел, чтобы моя консоль DevTools заткнулась - и канал действительно работал, очевидно :$


person walt_die    schedule 23.05.2019    source источник


Ответы (2)


если вы используете https, добавьте в конфигурацию вашего nginx сайта следующее:

location /cable {
  proxy_pass http://app;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-Proto https;
  proxy_redirect off;
}

Это проверено и работает отлично :-)

person Roc Khalil    schedule 23.05.2019
comment
да - ну - люди постоянно говорят мне об этом ;) (если вы посмотрите на неудачный проект - это то, что я настроил - и прямо сейчас я даже попытался удалить последний комментарий слева от proxy_set_header X-Forwarded-For...- увы, безрезультатно - person walt_die; 24.05.2019

Я провел почти 40 часов, облаивая почти каждое второе «дерево в городе» :)

(Короткий) ответ на этот вопрос: да!

(Несколько) более длинный ответ: будьте очень осторожны, чтобы иметь полный контроль как над своим оборудованием, так и/или над виртуальной машиной (в моем примере я ковылял со старым дистрибутивом Debian, исправленным миллион раз всевозможными вещами, работающими почти 10 других приложений, каждое со своим набором «специальных предложений»!

Мой совет: возьмите с собой свежую коробку для первого выстрела — когда вы разберетесь в технологии и тонкостях и почувствуете себя авантюристом, ищите старый дистрибутив Slackware из 98-го года и вложите его в свое удовольствие :)

(Очень длинный) ответ: клонировать https://github.com/wdiechmann/sucker.git для некоторых начальных пинков шин

Привет, Вальтер

person walt_die    schedule 25.05.2019