Подтвердить что ты не робот

Конфигурация NGINX для Rails 5 ActionCable с puma

Я использую Jelastic для моей среды разработки (еще не в производстве). Мое приложение работает с Unicorn, но я обнаружил websockets с ActionCable и интегрировал его в свое приложение.

Все работает нормально в локальном режиме, но при развертывании в моей среде Jelastic (с конфигурацией по умолчанию NGINX/Unicorn) я получаю это сообщение в своей консоли javascript, и я ничего не вижу в своем журнале доступа

WebSocket connection to 'ws://dev.myapp.com:8080/' failed: WebSocket is closed before the connection is established.

Раньше у меня была локальная среда, и я решил ее, добавив в файл конфигурации необходимый ActionCable.server.config.allowed_request_origins. Поэтому я дважды проверил мою конфигурацию разработки для этого, и это нормально.

Вот почему мне было интересно, есть ли что-то конкретное для конфигурации NGINX, кроме того, что объясняется на ActionCable git page

bundle exec puma -p 28080 cable/config.ru

Для моего приложения я следил за всем: введите ссылку здесь, но ничего не сказано о конфигурации NGINX

Я знаю, что websocket с ActionCable является совершенно новым, но я надеюсь, что кто-то сможет дать мне преимущество в этом

Большое спасибо

4b9b3361

Ответ 1

Хорошо, поэтому мне наконец удалось исправить мою проблему. Вот несколько шагов, которые позволили сделать эту работу:

1.nginx: Я действительно не знаю, нужно ли это, но поскольку мое приложение работает с Unicorn, я добавил это в свой nginx conf

upstream websocket {
  server 127.0.0.1:28080;
}

server {
  location /cable/ {
    proxy_pass http://websocket/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
  }
}

И затем в моем config/environments/development.rb файле:

config.action_cable.url = "ws://my.app.com/cable/"

2. Появление источника запроса: я заметил, что мое соединение было отклонено, даже если я использовал ActionCable.server.config.allowed_request_origins в моем файле config/environments/development.rb. Мне интересно, не связано ли это с дефолтом разработки как http://localhost:3000, как указано в документации. Поэтому я добавил следующее:

ActionCable.server.config.disable_request_forgery_protection = true

У меня еще нет производственной среды, поэтому я еще не могу проверить, как это будет.

3.Redis пароль: как указано в документации, я использовал config/redis/cable.yml, но у меня была эта ошибка:

Error raised inside the event loop: Replies out of sync: #<RuntimeError: ERR operation not permitted>
/var/www/webroot/ROOT/public/shared/bundle/ruby/2.2.0/gems/em-hiredis-0.3.0/lib/em-hiredis/base_client.rb:130:in `block in connect'

Итак, я понял, как я устанавливал свой пароль для моего сервера redis, не очень хорошо.

На самом деле вам нужно сделать что-то вроде этого:

development:
  <<: *local
  :url: redis://user:[email protected]:6379
  :host: my.redis.com
  :port: 6379

И теперь все работает отлично, и Actioncable действительно впечатляет.

Возможно, некоторые из моих проблем были тривиальны, но я делюсь ими и как я их разрешил, чтобы каждый мог выбрать что-то, если нужно