ActionCable Rails 5 (Passenger) - сбой: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404 - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь развернуть сервер 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

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

/ и т.д. / 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

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

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

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

redis-cli

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

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

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

0 голосов
/ 07 сентября 2018

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

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

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

...