Обновление ActionCable Websocket и ошибка 404 - PullRequest
0 голосов
/ 01 декабря 2018

Я пытался получить ActionCable в Ruby (2.5) в приложении Rails 5.2, работающем над производством в AWS, классическом балансировщике нагрузки, среде Elastic Bean Stalk (пассажирская версия Amazon 64bit Linux 2.7.2, Postgresql).Сначала Redis не работал, поэтому я переключил адаптер на postgresql, который исправил множество ошибок на странице, кроме двух, которые у меня есть в настоящее время.Приложение чата функционирует нормально, за исключением наиболее важной части отправки и получения сообщений без обновлений.ActionCable прекрасно работает в разработке, и я не получаю ни одной ошибки.Я получаю одну ошибку в журналах и одну повторяющуюся ошибку на консоли браузера.

Ниже приведена ошибка в Chrome, которая заполняется каждые несколько секунд.22 Сбой подключения WebSocket к «wss: //www.my-app.com/cable»: Ошибка при рукопожатии WebSocket: Неожиданный код ответа: 404

Также в журналах я получаю эту ошибку:

E, [2018-12-01T00: 09: 22.806141 # 8733] ОШИБКА -: [92c25112-2d7b-4ae5-8567-73f9f1eb73be] Не удалось выполнить обновление до WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: keep-alive, HTTP_UPGRADE:)

Ниже приведены соответствующие файлы для ActionCable.Я перепробовал очень много проблем и разных предложений.Я попытался изменить файл nginx.conf, но всякий раз, когда я помещал какие-либо директивы passenger_ *, которые рекомендовались несколькими источниками, перезапуск NGINX приводил к ошибке, в которой сообщалось [emerg] неизвестная директива .Я попробовал другие решения внутри этого, такие как указание местоположение / кабель , тонна руководств, учебных пособий и сообщений SO, подобных этому, в котором я реализовал и попробовал каждое: ActionCable - не удалось обновить до WebSocket впроизводство

cable.yml

development:
  adapter: postgresql

test:
  adapter: async

production:
  adapter: postgresql
  channel_prefix: production

Production.rb

  config.action_cable.mount_path = '/cable'
  config.action_cable.url = 'wss://mywebsite.com/cable'
  config.action_cable.allowed_request_origins = [ 'http://mywebsite.com',   'https://mywebsite.com' ]

cable.js

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

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

}).call(this);

rout.rb

mount ActionCable.server => '/cable'

application_cable / connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base

    identified_by :current_admin

    def connect
      self.current_admin = find_verified_user
      logger.add_tags "ActionCable", "Admin: #{current_admin.email}"
    end 

    protected 

      def find_verified_user
        verified_user = Admin.find_by(id: cookies.signed['admin.id'])
        if verified_user
          verified_user
        else 
          reject_unauthorized_connection
        end 
      end 
    end
  end   

См. Обновление ниже для конфигурации nginx.

После запуска nginx -t это следующее считывание:

nginx: [alert] не удалось открыть файл журнала ошибок: open () «/var/log/nginx/error.log» не удалось (13: разрешение отклонено) 2018/12/10 20:33:52 [warn] 10587 # 0: директива user имеет смысл только в том случае, если мастер-процесс выполняется с привилегиями суперпользователя, игнорируется в /etc/nginx/nginx.conf:5 2018/12/10 20:33:52 [warn] 10587 # 0: конфликтующее имя сервера "localhost" на 0.0.0.0:80, игнорируется nginx: файл конфигурации /etc/nginx/nginx.conf в порядке 2018/ 12/10 20:33:52 [emerg] 10587 # 0: open () «/var/run/nginx.pid» не удалось (13: разрешение запрещено) nginx: файл конфигурации /etc/nginx/nginx.conf тест не пройден

Большое спасибо за чтение и любую помощь.

ОБНОВЛЕНИЕ

С помощью пользователя Reddit (вот ссылка: reddit post ) Мне удалось устранить ошибку «Не удалось обновить веб-сокет» и ответ 404 «Ошибка рукопожатия».Это было сделано путем удаления конфигурации nginx.conf, которую я описал выше, и добавления ее в файл default.conf в папке nginx / conf.d.Ниже моя новая конфигурация.

 upstream backend {
        server unix:///var/run/puma/my_app.sock;
      }

      server {
        listen 80;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        large_client_header_buffers 8 32k;

        location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-NginX-Proxy true;

          proxy_buffers 8 32k;
          proxy_buffer_size 64k;

          proxy_pass http://backend;
          proxy_redirect off;

          location /assets {
            root /var/app/current/public;
          }

          # enables WS support
          location /cable {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade websocket;
            proxy_set_header Connection Upgrade;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          }
       }
    }

Теперь нет ошибок в моем production.log или в консоли браузера.Тем не менее, у меня все еще есть те тестовые ошибки nginx, и все еще есть ошибка в nginx / error.log.Эта ошибка ниже:

2018/12/10 20:05:02 [ошибка] 7640 # 0: * 533 connect () для unix: /// var / run / puma / my_app.сбой sock (111: соединение отклонено) при подключении к восходящему каналу, клиенту: 172.31.33.196, серверу:, запрос: «GET / HTTP / 1.1», восходящий поток: «http://unix:///var/run/puma/my_app.sock:/", хост:« 172.31.11.174 »

Еще раз спасибо!

...