0

は、アプリの動作を可能にしますが、接続しようとしたとき、私はエラーに実行しているよ:のWebSocketレール(フェイ-のWebSocket)ハンドシェークエラーコード200 - 私はWebSocketをを取得しようとしているAWS ElasticBeanstalk、nginxの、ピューマ

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

gem faye-websocketを使用するチュートリアル(https://devcenter.heroku.com/articles/ruby-websockets)に従っています。それはローカルで(プーマを使って)うまく動作しますが、nginx + pumaを実行しているAWS ElasticBeanstalkに展開しようとすると、websocketリクエストは接続できません。私は(自分のドメインを持つ)次のJavaScriptを使用して新しいのWebSocket接続を作成してい

:チュートリアル後

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


は、私が入ってくるのWebSocketの要求、およびハンドルをチェックするミドルウェアクラスを作成しましたそれに応じて。

"rack.errors" =>#>、 "rack.multithread" => trueの場合、 "rack.multiprocess" => falseを、「ラック:私のローカルサーバーでは、リクエスト環境ハッシュは次のようになります。 SERVER_PROTOCOL => "HTTP/1.1"、 "SERVER_SOFTWARE" => "run_once" => false、「SCRIPT_NAME」=>「」、「CONTENT_TYPE」=>「text/plain」、「QUERY_STRING」=>「」、 => "/"、 "HTTP_VERSION" => "HTTPリクエスト"、 "GET"、 "GET" HTTP_CACHE_CONTROL =>「no-cache」、「HTTP_UPGRADE」=「HTTP_HOST」=>「HTTP_HOST」=>「localhost:3000」、「HTTP_CONNECTION」=>「アップグレード」、「HTTP_PRAGMA」=>「no-cache」、 (MacOS X 10_10_5)AppleWebKit/537.36(GeckoのようなKHTML)は、「WebSocket」、「HTTP_ORIGIN」=>「http://localhost:3000」、「HTTP_SEC_WEBSOCKET_VERSION」=>「13」、「HTTP_USER_AGENT」=>「Mozilla/Chrome/50.0.2661.102 Safari/537.36 "、" HTTP_ACCEPT_ENCODING "=>" gz rack.version ":; IPは、「、 "HTTP_ACCEPT_LANGUAGE"=> "EN-US、EN、SDCHを収縮Q = 0.8"

{

、AWS上ではこのようになりますのに対し、" "rack.multiprocess" => false、 "rack.run_once" => false、 "SCRIPT_NAME" => "rack.errors" => "、" CONTENT_TYPE "=>" text/plain "、" QUERY_STRING "=>"、 "SERVER_PROTOCOL" => "HTTP/1.1"、 "SERVER_SOFTWARE" => "2.11.1"、 "GATEWAY_INTERFACE" => "CGI => "/"、 "REMOTE_ADDR" => "127.0.0.1"、 "REQUEST_METHOD" => "GET"、 "REQUEST_PATH" => "/"、 "REQUEST_URI" => "/"、 "HTTP_VERSION" => "HTTP/「HTTP_CONNECTION」=>「close」「HTTP_PRAGMA」=>「no-cache」「HTTP_CACHE」「HTTP_CONNECTION」=>「HTTP_HOST」=>「HTTP_X_FORWARDED_FOR」=>「194.80.196.162」「HTTP_CONNECTION」= => "HTTP_ORIGIN" => "http://[domain.com]"、 "HTTP_SEC_WEBSOCKET_VERSION" => "13"、 "HTTP_USER_AGENT" => "Mozilla/5.0(Macintosh; Mac OS X 10_10_5)AppleWebKit/537.36(GeckoのようなKHTML)Chrome/50.0.2661.102 Safari/537.36 "、" HTTP_ACCEPT_ENCODING "=>" gzip、deflate、sdch "、" HTTP_ACCEPT_LANGUAGE "=>" en-US、en; qは= 0.8" 、

だから私は、AWS上でそれを見る、リクエストヘッダHTTP_CONNECTIONとHTTP_UPGRADE WebSocketをに切り替えされていない。しかし、

、私は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"; 
       } 
      } 
     } 


私が理解しているところから、/ cableへのリクエストをバックエンドのrails appにルーティングし、websocketへの接続をアップグレードします。しかし、ケーブルを試してみると、404エラーが発生します(一致するルートがないため)。

どうすればレールソケットのハンドシェークを正しく行うことができますか?どんな助けでも大歓迎です!!私もwebsocket-rails gemを使って試してみましたが、ハンドシェイクエラーコード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"); 

それは同様の問題に遭遇誰でも役に立てば幸い!

関連する問題