7

DHHのシンプルなRails 5チャットの例を、AWSの単独のEC2インスタンスに展開しようとしています。コードはこちらです:https://github.com/HectorPerez/chat-in-rails5AWSのActionCable:WebSocketハンドシェイク中のエラー:予期しない応答コード:404

私たちは、このように単一のインスタンスをスピンアップする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はありません、と。 EC2インスタンスにredisをインストールするには、次のような.ebextensions設定ファイルを追加しました:https://gist.github.com/KeithP/08b38189372b7fd241e5#file-ebextensions-redis-config; Gitはコミットしてデプロイします。

しかし、WebSocketをdoesntの仕事:

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

enter image description here

サーバproduction.logが2のための "/ケーブルをGET開始" を示しています。ブラウザのコンソールの検査では、我々は以上の繰り返しとの上にこのエラーが表示すべての "Finished/cable"コール。 は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 
+0

redisがインストールされ、正常に起動したことが確認されました。 production.rbで 'ActionCable.server.config.disable_request_forgery_protection = true'を試した – KeithP

+0

nginxのようなリバースプロキシを使用しているのですか、ポート80で動作するレールアプリに直接接続していますか? – tpbowden

+0

https://gist.github.com/KeithP/f8534c04d20c2b4e4b1d – KeithP

答えて

4

は、AWSでの単一のインスタンスElastic Beanstalkでの展開上のWebSocketチャットの例を実行するには、次の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" 

`

+2

2016年1月にAWSサーバの名前が長くなり、ebデプロイメントに失敗するというメッセージが表示されました。「nginx:emergでserver_names_hashを作成できませんでした。server_names_hash_bucket_size:64を増やす必要があります。回避策として、環境名をできるだけ短くすると、これが倒れることはありません。たとえば、 'dev-env'の代わりに 'dev1'を使用してください。これを反映するために、回答の設定ファイルが更新されました。 – KeithP

+0

ファイルの拡張子は何ですか?次のエラーが発生しました – jasmo2

+0

アプリケーションバージョンのアプリケーションバージョンの.ebextensions/nginx_proxy.configの設定ファイル-8b83-170330_144118に無効なYAMLまたはJSONが含まれています。 YAMLの例外 – jasmo2

関連する問題