ActionCable на AWS: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404

Мы пытаемся развернуть простой пример чата Rails 5 DHH на одном автономном экземпляре EC2 на AWS. Код доступен здесь: https://github.com/HectorPerez/chat-in-rails5

Мы использовали Elastic Beanstalk для раскрутки одного экземпляра таким образом:

eb create dev-env -p “64bit Amazon Linux 2015.09 v2.0.4 running Ruby
2.2 (Puma)” –single -i t2.micro --envvars
SECRET_KEY_BASE=g5dh9cg614a37d4bdece9126b42d50d0ab8b2fc785daa1e0dac0383d6387f36b

Это минимальная установка, поэтому здесь нет ни Elasticache, ни балансировщика нагрузки. Чтобы установить Redis на экземпляр EC2, мы добавили файл конфигурации .ebextensions, например: https://gist.github.com/KeithP/08b38189372b7fd241e5#file-ebextensions-redis-config; Git зафиксировать и развернуть.

Но веб-сокет не работает: проверяя консоль браузера, мы видим, что эта ошибка повторяется снова и снова:

application-a57354de3399cd895ca366df9bd7316ab69e81d266b63be7d7be563ebc78ab9d.js:27 
WebSocket connection to ‘ws://dev-env-y2e5dcrxqk.elasticbeanstalk.com/cable’ failed: 
Error during WebSocket handshake: Unexpected response code: 404

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

В журнале сервера production.log отображается 2 «Начатый GET / кабель» для каждого вызова «Завершено / кабельное». От ActiveCable нет сообщений DEBUG:

/var/app/containerfiles/logs/production.log
-------------------------------------

INFO -- : Processing by RoomsController#show as HTML 
DEBUG -- :   [1m[36mMessage Load (0.1ms)[0m  [1m[34mSELECT "messages".* FROM "messages"[0m INFO -- :   Rendered collection (0.0ms) 
INFO -- :   Rendered rooms/show.html.erb within layouts/application (0.5ms)   
INFO -- : Completed 200 OK in 2ms (Views: 1.2ms | ActiveRecord: 0.1ms) 
INFO -- : Started GET "/cable" for <ip_address> at 2016-01-01 17:28:26 +0000 
INFO -- : Started GET "/cable/" for <ip_address> at 2016-01-01 17:28:26 +0000 
INFO -- : Finished "/cable/" for <ip_address> at 2016-01-01 17:28:26 +0000

person KeithP    schedule 30.12.2015    source источник
comment
Мы проверили, что redis установлен и запустился нормально; и попробовал ActionCable.server.config.disable_request_forgery_protection = true в production.rb   -  person KeithP    schedule 31.12.2015
comment
Вы используете обратный прокси, такой как nginx, или подключаетесь напрямую к приложению rails, работающему на порту 80?   -  person tpbowden    schedule 07.01.2016
comment
Пробовали с этой конфигурацией обратного прокси и без нее: gist.github.com/KeithP/f8534c04d20c2b4e4b1d   -  person KeithP    schedule 07.01.2016
comment
Мне удалось заставить его работать со следующей конфигурацией nginx (замените текущие строки 35-38): gist.github .com / tpbowden / d85b72e5c3bf8ef8e97a.   -  person tpbowden    schedule 07.01.2016
comment
Спасибо. теперь мы получаем это в nginx / error.log: * 1 connect () to unix: ///var/www/my_app/tmp/sockets/my_app.sock failed (2: нет такого файла или каталога)   -  person KeithP    schedule 08.01.2016
comment
Если вы используете puma с сокетами unix, тогда это должен быть путь к файлу сокета, у вас должна быть где-то ошибка конфигурации.   -  person tpbowden    schedule 08.01.2016
comment
Спасибо, теперь работает! Бэкэнд восходящего потока конфигураций был исправлен на сервер unix: ///var/run/puma/my_app.sock; Но затем мы получили 404-е на ассеты css и js. Чтобы исправить это, была добавлена ​​дополнительная директива местоположения: location / assets {root / var / app / current / public; }. Обновленная конфигурация обратного прокси: gist.github.com/KeithP/f8534c04d20c2b4e4b1d   -  person KeithP    schedule 09.01.2016


Ответы (1)


Чтобы запустить пример чата веб-сокета на одном экземпляре развертывания Elastic Beanstalk в AWS, вам необходимо добавить следующую конфигурацию прокси-сервера Nginx (примечание: замените env1.t3tiiauce6.us-west-2.elasticbeanstalk.com на свое имя сайта):

.ebextensions / nginx_proxy.config

files:
  "/etc/nginx/conf.d/websockets.conf" :
    content: |
      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;

      server_name env1.t3tiiauce6.us-west-2.elasticbeanstalk.com

      # prevents 502 bad gateway error
      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;

          # prevents 502 bad gateway error
          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 $http_upgrade;
            proxy_set_header Connection "upgrade";
          }
      }
  }

container_commands:
  01restart_nginx:
    command: "nginx -t && service nginx reload"

`

person KeithP    schedule 09.01.2016
comment
В январе 2016 года имена серверов AWS стали длиннее, в результате появилось сообщение об ошибке развертывания eb nginx: Emerg не удалось построить server_names_hash, вам следует увеличить server_names_hash_bucket_size: 64. В качестве обходного пути - если вы сделаете имя своей среды как можно короче, это не вызовет ошибок этого. Например, используйте dev1 вместо dev-env. Конфигурационный файл в ответе был обновлен, чтобы отразить это. - person KeithP; 27.01.2016
comment
какое расширение файла? Я получаю следующую ошибку - person jasmo2; 30.03.2017
comment
Файл конфигурации .ebextensions / nginx_proxy.config в версии приложения app-8b83-170330_144118 содержит недопустимый YAML или JSON. Исключение YAML - person jasmo2; 30.03.2017
comment
правильный ли отступ недопустимого YAML? попробуйте это в парсере вроде этого: yaml-online-parser.appspot.com - person KeithP; 31.03.2017
comment
Спасибо, это была проблема с отступом. Но теперь у меня другая проблема - person jasmo2; 31.03.2017
comment
container_command 01restart_nginx в .ebextensions / nginx_proxy.config не удалось. - person jasmo2; 31.03.2017