0

Я пытаюсь получить WebSockets включен приложение работает, но я бегу в ошибку при попытке подключения:WebSocket рельсы (Faye-WebSocket) код ошибки рукопожатия 200 - AWS ElasticBeanstalk, Nginx, пума

WebSocket connection to 'ws://[domain.com]/' failed: Error during WebSocket handshake: Unexpected response code: 200 

Я следую учебнику здесь (https://devcenter.heroku.com/articles/ruby-websockets), который использует gem faye-websocket. Он работает нормально локально (с puma), но когда я пытаюсь развернуть его на AWS ElasticBeanstalk, который запускает nginx + puma, запрос веб-камеры не может подключиться.

Я создаю новое подключение WebSocket со следующим JavaScript (с моим собственным доменом):

var ws = new WebSocket("ws://[domain.com]/"); 


После урока я создал класс промежуточного слоя, который проверяет входящие запросы на WebSocket и ручки это соответственно. На моем локальном сервере, запрос среда хэш выглядит следующим образом:

"rack.errors" => #> "rack.multithread" => правда "rack.multiprocess" => ложным, «стойку. run_once "=> false," SCRIPT_NAME "=>" "," CONTENT_TYPE "=>" text/plain "," QUERY_STRING "=>" "," SERVER_PROTOCOL "=>" HTTP/1.1 "," SERVER_SOFTWARE "=>" 2.11.1 "," GATEWAY_INTERFACE "=>" CGI/1.2 "," REQUEST_METHOD "=>" GET "," REQUEST_PATH "=>"/"," REQUEST_URI "=>"/"," HTTP_VERSION "=>" HTTP/1.1 "," HTTP_HOST "=>" localhost: 3000 "," HTTP_CONNECTION "=>" Upgrade "," HTTP_PRAGMA "=>" no-cache "," HTTP_CACHE_CONTROL "=>" no-cache "," HTTP_UPGRADE "= > «websocket», «HTTP_ORIGIN» => «http://localhost:3000», «HTTP_SEC_WEBSOCKET_VERSION» => «13», «HTTP_USER_AGENT» => «Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, как и Gecko) Chrome/50.0.2661.102 Safari/537.36 "," HTTP_ACCEPT_ENCODING "=>" gz ф, выкачать, SDCH», "HTTP_ACCEPT_LANGUAGE"=> "EN-US, еп, д = 0,8",

В то время как на AWS это выглядит следующим образом:

{ "rack.version" => [1, 3], "rack.errors" => #, "rack.multithread" => true, "rack.multiprocess" => false, "rack.run_once" => false, "SCRIPT_NAME" => " "," CONTENT_TYPE "=>" text/plain "," QUERY_STRING "=>" "," SERVER_PROTOCOL "=>" HTTP/1.1 "," SERVER_SOFTWARE "=>" 2.11.1 "," GATEWAY_INTERFACE "=>" CGI/RE: «REQUEST_PATH» => «/», «REQUEST_URI» => «/», «HTTP_VERSION» => «HTTP/1.0 "," HTTP_HOST "=>" [domain.com] "," HTTP_X_FORWARDED_FOR "=>" 194.80.196.162 "," HTTP_CONNECTION "=>" закрыть "," HTTP_PRAGMA "=>" no-cache "," HTTP_CACHE _CONTROL "=>" no-cache "," HTTP_ORIGIN "=>" http://[domain.com] "," HTTP_SEC_WEBSOCKET_VERSION "=>" 13 "," HTTP_USER_AGENT "=>" Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, например, Gecko) Chrome/50.0.2661.102 Safari/537.36 "," HTTP_ACCEPT_ENCODING "=>" gzip, deflate, sdch "," HTTP_ACCEPT_LANGUAGE "=>" en-US, en; д = 0,8" ,

Так что я могу видеть, что на AWS, заголовки запросов HTTP_CONNECTION и HTTP_UPGRADE не переключаясь к WebSockets.

Однако, я попытался установить мою конфигурацию Nginx, но я не могу понять, как это работает (например https://gist.github.com/KeithP/f8534c04d20c2b4e4b1d)

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"; 
       } 
      } 
     } 


Из того, что я понимаю, это направляет запросы, идущие к/кабелю к файлу backend rails и обновляет соединение с веб-узлами. Однако, когда я пытаюсь/кабель, я получаю ошибку 404 (так как нет соответствующего маршрута).

Итак, как я могу правильно связаться со своими поручнями с websockets? Любая помощь приветствуется!! Я также пробовал использовать драгоценный камень websocket-rails и получил код ошибки рукопожатия 500

ответ

1

Наконец-то ему удалось заставить его работать! В конце концов, следующий файл положить в папке .ebextensions получил это происходит:

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

    location/{ 
    proxy_pass http://my_app; # match the name of upstream directive which is defined in another file 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 

    location /websocket { 
    proxy_pass http://my_app/websocket; 
    proxy_set_header Host $host; 
    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; 
    } 
} 

И мой Javascript изменен:

var ws = new WebSocket("ws://[domain.com]/websocket"); 

Надеется, что это помогает любому, кто попадается подобными вопросы!