簡體   English   中英

Websocket導軌(Faye-websocket)握手錯誤代碼200-AWS ElasticBeanstalk,nginx,puma

[英]Websocket rails (Faye-websocket) handshake error code 200 - AWS ElasticBeanstalk, nginx, puma

我正在嘗試啟用啟用了websockets的應用程序,但是嘗試連接時遇到了錯誤:

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 )。 它在本地(與puma一起)運行良好,但是當我嘗試將其部署到運行nginx + puma的AWS ElasticBeanstalk時,websocket請求無法連接。

我正在使用以下JavaScript(使用我自己的域)創建新的WebSocket連接:

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


在學習完本教程之后,我創建了一個中間件類,該類檢查傳入的Websocket請求,並進行相應的處理。 在我的本地服務器上,請求環境哈希看起來像這樣:

“ rack.errors” =>#>,“ rack.multithread” => true,“ rack.multiprocess” => false,“ rack.run_once” => false,“ SCRIPT_NAME” =>“”,“ CONTENT_TYPE” => “文本/純文本”,“ 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” = >“升級”,“ HTTP_PRAGMA” =>“無緩存”,“ HTTP_CACHE_CONTROL” =>“無緩存”,“ 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” =>“ gzip,deflate,sdch”,“ HTTP_ACCEPT_LANGUAGE” =>“ zh-CN,en; q = 0.8”,

在AWS上看起來像這樣:

{“ rack.version” => [1,3],“ rack.errors” =>#,“ rack.multithread” => true,“ rack.multiprocess” => false,“ rack.run_once” => false, “ SCRIPT_NAME” =>“”,“ CONTENT_TYPE” =>“文本/純文本”,“ QUERY_STRING” =>“”,“ SERVER_PROTOCOL” =>“ HTTP / 1.1”,“ SERVER_SOFTWARE” =>“ 2.11.1”,“ GATEWAY_INTERFACE“ =>” CGI / 1.2“,” REMOTE_ADDR“ =>” 127.0.0.1“,” REQUEST_METHOD“ =>” GET“,” 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“ =>”否-緩存”,“ HTTP_CACHE_CONTROL” =>“無緩存”,“ 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; q = 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";
              }
          }
      }


據我了解,這會將請求發送到/ cable到后端rails應用程序,並將連接升級到websockets。 但是,當我嘗試/ cable時,出現404錯誤(因為沒有匹配的路由)。

那么,如何正確使用websockets實現Rails應用程序握手? 任何幫助將非常感激!! 我也嘗試過使用websocket-rails gem並得到握手錯誤代碼500

終於設法使其正常工作! 最后,將以下文件放在.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");

希望它對遇到類似問題的任何人有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM