Amazon web services AWS上的ActionCable:WebSocket握手期间出错:意外响应代码:404

Amazon web services AWS上的ActionCable:WebSocket握手期间出错:意外响应代码:404,amazon-web-services,deployment,redis,ruby-on-rails-5,actioncable,Amazon Web Services,Deployment,Redis,Ruby On Rails 5,Actioncable,我们正在尝试将DHH的简单Rails 5聊天示例部署到AWS上一个独立的EC2实例。代码可在以下位置获得: 我们使用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=g5dh9cg614a37d4bdece9126b42d50d0ab8b2

我们正在尝试将DHH的简单Rails 5聊天示例部署到AWS上一个独立的EC2实例。代码可在以下位置获得:

我们使用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配置文件,如下所示:;Git提交和部署

但是websocket不起作用:检查浏览器控制台时,我们看到这个错误一次又一次地重复:

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

server production.log为每个“已完成/电缆”调用显示2个“已启动/电缆”。 没有来自ActiveCable的调试消息:

/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
/var/app/containerfiles/logs/production.log
-------------------------------------
信息--:由RoomsController处理#显示为HTML
调试--:[1m[36mm消息加载(0.1ms)[0m[1m[34m选择“消息”。*从“消息”[0m信息--:呈现的集合(0.0ms)
信息--:布局/应用程序中的渲染房间/show.html.erb(0.5ms)
信息--:在2ms内完成200 OK(视图:1.2ms |活动记录:0.1ms)
信息--:2016-01-01 17:28:26+0000开始获取“/电缆”
信息--:在2016-01-01 17:28:26+0000开始获取“/电缆/”
信息--:2016-01-01 17:28:26+0000时完成的“/电缆/”

要在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"

`

我们检查了redis的安装和启动是否正常;并在生产中尝试了“ActionCable.server.config.disable\u request\u forgery\u protection=true”。RBA您是否使用nginx之类的反向代理或直接连接到在端口80上运行的rails应用程序?是否尝试了此反向代理配置:我成功获得了它与以下nginx配置一起工作(替换当前的第35-38行):谢谢。我们现在在nginx/error.log:*1 connect()到unix:///var/www/my_app/tmp/sockets/my_app.sock 失败(2:没有这样的文件或目录)AWS服务器名称在2016年1月变长,导致eb部署失败消息“nginx:emerg无法生成服务器名称\u散列,您应该增加服务器名称\u散列\u bucket\u大小:64"。作为一种解决方法-如果您尽可能缩短环境名称,则不会出现这种情况。例如,使用“dev1”而不是“dev env”。答案中的配置文件已更新以反映这一点。文件扩展名是什么?我收到下一个错误,即应用程序版本app-8b83-170330中的配置文件.ebextensions/nginx_proxy.config_144118包含无效的YAML或JSON。YAML例外是正确缩进的无效YAML吗?请在这样的解析器中尝试:谢谢,这是缩进问题。但现在我遇到了另一个问题