it-swarm.com.ru

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

Я пытаюсь развернуть ActionCable и Rails 5 на рабочий сервер (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

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

/и т.д./Nginx/сайты с поддержкой/по умолчанию

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

UPDATE:

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

enter image description here

6
Rizal Yusoff

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

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

redis-cli

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

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

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

0
Rizal Yusoff

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

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

Проверьте в вашей конфигурации 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/

0
Erowlin