ActionCable Rails 5 (Passenger) - сбой: ошибка при рукопожатии WebSocket: неожиданный код ответа: 404

Я пытаюсь развернуть сервер ActionCable и Rails 5 To Production (DigitalOcean). Я выполнил все шаги, упомянутые в видео Gorails здесь: https://gorails.com/episodes/deploy-actioncable-and-rails-5

Приложение было развернуто с использованием Phusion Passenger + Nginx + Capistrano.

И когда я попытался проверить свой сайт на продакшене, у меня в консоли браузера появилось сообщение об ошибке:

WebSocket connection to 'ws://139.59.175.34/cable' failed: Error during WebSocket handshake: Unexpected response code: 404

Это мои настройки:

/ etc / nginx / sites-enabled / default

server {
        listen 80;
        listen [::]:80 ipv6only=on;

        server_name my_server_domain;
        passenger_enabled on;
        rails_env    production;
        root         /home/deploy/my_app_domain/current/public;

        # ActionCabel config (disable this if u r not using it)
        location /cable {
           passenger_app_group_name actioncable_websocket;
           passenger_force_max_concurrent_requests_per_process 0;
        }

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

production.rb

config.action_cable.url = "/cable"
config.action_cable.allowed_request_origins = ["http://139.59.175.34"]

cable.js

(function() {
  this.App || (this.App = {});

  App.cable = ActionCable.createConsumer("/cable");

}).call(this);

Я попытался изменить конфигурацию ActionCable на config/production.rb на:

  config.action_cable.url = [/ws:\/\/*/, /wss:\/\/*/]
  config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]

но все равно не повезло.


Я также просмотрел журнал production.log на сервере, и это была записанная ошибка:

WebSocket error occurred: One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 0

ОБНОВЛЕНИЕ:

Ниже приведены настройки брандмауэра на сервере:

введите описание изображения здесь


person Ryzal Yusoff    schedule 04.09.2018    source источник
comment
Какая операционная система? Вы проверили брандмауэр? Похоже, бит сокета уже зарезервирован другим запущенным программным обеспечением.   -  person Erowlin    schedule 07.09.2018
comment
@Erowlin Операционная система - Linux 18.04. И да, межсетевой экран неактивен. Пожалуйста, обратитесь к обновлению в моем сообщении выше.   -  person Ryzal Yusoff    schedule 08.09.2018


Ответы (2)


Ваша конфигурация выглядит правильной.

Эта проблема может возникнуть, если у вас запущен брандмауэр.

Проверьте свою конфигурацию iptables (linux), если что-то блокирует ее (хотя у меня нет конкретной строки кода, которую я могу вам дать).

Если вы работаете в Windows, убедитесь, что нет «антивируса» или «брандмауэра», перехватывающего / блокирующего биты. Я слышал, что Node32 - очень хороший кандидат для блокировки веб-сокетов.

Обновление: вы также можете попытаться подключиться, используя wss://139.59.175.34/cable вместо ws://139.59.175.34/cable? (Убедитесь, что ваш NGinx проксирует SSL). https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/.

person Erowlin    schedule 07.09.2018
comment
Операционная система - Linux 18.04. И межсетевой экран неактивен. Пожалуйста, обратитесь к обновлению в моем сообщении выше. Также я пробовал с настройкой SSL, то же самое, это не работает. - person Ryzal Yusoff; 08.09.2018
comment
@RizalYusoff Я сейчас без понятия. Я вернусь к этому, если у меня будет больше. - person Erowlin; 10.09.2018

Наконец я нашел ответ на свою проблему. Оказывается, на моем рабочем сервере не установлен Redis. Мне просто нужно установить Redis, и теперь все работает отлично!

Чтобы проверить, установлен ли у вас Redis на сервере, используйте эту команду:

redis-cli

Если появится консоль Redis, значит, все готово. Если появляется ошибка / предупреждение, вы можете выполнить следующие действия, чтобы установить и запустить redis:

  1. sudo apt install redis-server
  2. redis-server

Надеюсь, это поможет!

person Ryzal Yusoff    schedule 24.10.2018
comment
есть идеи, как установить его на героку? - person Prime; 22.10.2020