ActionCable в ElasticBeanstalk завершается с ошибкой, которую невозможно отследить - PullRequest
0 голосов
/ 29 мая 2018

ElasticBeanstalk - это конфигурация балансировки нагрузки приложений.Это Ruby on Rails с Passenger, Puma и NGINX (стек Ruby AWS по умолчанию).

Я форсирую ssl, и у меня все работает отлично, за исключением веб-сокетов, которые, похоже, (заблокированы |отбрасываются | сломана).

Первая ошибка отображается в консоли: (URL-адрес - мой домен)

WebSocket connection to 'wss://<URL>/cable' failed: WebSocket is closed before the connection is established.

Этот запрос не выполняется с (OPCODE -1) во внешнем интерфейсе.

При проверкеЖурналы сервера, у меня есть access.log, который показывает:

/cable"499, что не очень описательная ошибка.

И рельсы production.log показывают:

Started GET "/cable/" [WebSocket] for 152.170.14.251 at 2018-05-28 21:01:27 +0000

Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)

Registered connection (Z2lkOi8vYXNlc29yLWFwcC9JZGVudGl0eS81:Z2lkOi8vYXNlc29yLWFwcC9Vc2VyLzI)

WebSocket error occurred: wrong number of arguments (given 2, expected 1)

Иногда я видел эту другую ошибку:

NoMethodError: undefined method `+' for nil:NilClass

File "/opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/websocket-driver-0.7.0/lib/websocket/driver/hybi.rb" line 11 in generate_accept
File "/opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/websocket-driver-0.7.0/lib/websocket/driver/hybi.rb" line 76 in initialize
File "/opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/websocket-driver-0.7.0/lib/websocket/driver.rb" line 160 in new
File "/opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/websocket-driver-0.7.0/lib/websocket/driver.rb" line 160 in rack
File "/opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/actioncable-5.2.0/lib/action_cable/connection/client_socket.rb" line 47 in initialize

И этот файл показал, что ключ отсутствует.

Следуя этой ошибке, я обнаружил эту проблему:

Rails Issue

Это привело меня к этому окончательному файлу:

Файловая переменная, которая, кажется, отсутствует

Это, наконец, привело меня кэто конфигурации, которые могут отсутствовать:

socket.env

После долгих исследований я оказался в исходном коде гема и выглядит как кодировканекоторые символы дают сбой и создают странную строку, которую ActionCable не может проанализировать:

Открытая проблема в Github

1 Ответ

0 голосов
/ 31 мая 2018

Для стека Ruby AWS по умолчанию (вы упомянули) вам необходимо отредактировать конфигурацию nginx по умолчанию для поддержки веб-сокетов.Конфигурацию nginx по умолчанию для стека Elastic Beanstalk / Ruby / Puma можно найти здесь.

В основном вам потребуется добавить следующие заголовки http для веб-сокетов:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

Чтобы сделать это, добавьте папку .ebextensions в корневой каталог вашего проекта и поместите в нее файл конфигурации с настроенной версией конфигурации по умолчанию.Пример:

# .ebextensions/001_nginx.conf

files:
   "/opt/elasticbeanstalk/support/conf/webapp_healthd.conf":
     owner: root
     group: root
     mode: "000644"
     content: |
       upstream my_app {
         server unix:///var/run/puma/my_app.sock;
       }

       log_format healthd '$msec"$uri"'
                       '$status"$request_time"$upstream_response_time"'
                       '$http_x_forwarded_for';

       server {
         listen 80;
         server_name _ localhost; # need to listen to localhost for worker tier

         if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
           set $year $1;
           set $month $2;
           set $day $3;
           set $hour $4;
         }

         access_log  /var/log/nginx/access.log  main;
         access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;

         location / {
           proxy_pass http://my_app; # match the name of upstream directive which is defined above
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection "Upgrade";
         }

         location /assets {
           alias /var/app/current/public/assets;
           gzip_static on;
           gzip on;
           expires max;
           add_header Cache-Control public;
         }

         location /public {
           alias /var/app/current/public;
           gzip_static on;
           gzip on;
           expires max;
           add_header Cache-Control public;
         }
       }

container_commands:
  99_restart_nginx:
    command: "service nginx restart || service nginx start"

После развертывания этой конфигурации, если у вас есть настройка SSH для вашего экземпляра EB, вы можете войти в SSH и проверить конфигурацию nginx, чтобы увидеть, используется ли ваша измененная версия.Если вы не видите изменений здесь или в журналах и это не рабочий экземпляр, вы можете рассмотреть возможность перестройки среды из консоли AWS.

...