복붙노트

[REDIS] AWS에 ActionCable : 예기치 않은 응답 코드 : 404 웹 소켓 핸드 셰이크 중에 오류

REDIS

AWS에 ActionCable : 예기치 않은 응답 코드 : 404 웹 소켓 핸드 셰이크 중에 오류

우리는 DHH의 간단한 단일 5 채팅 예 레일 배포하려고, 자기는 AWS의 EC2 인스턴스를 포함. 코드는 여기에 있습니다 : https://github.com/HectorPerez/chat-in-rails5

따라서 우리는 단일 인스턴스를 회전하는 탄성 콩 줄기를 사용 :

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 인스턴스에 레디 스를 설치하려면 우리는이 같은 파일을 config (설정) .ebextensions 추가 : https://gist.github.com/KeithP/08b38189372b7fd241e5#file-ebextensions-redis-config을; 커밋 및 배포 GIT.

그러나 웹 소켓 나던 작업 : 브라우저 콘솔을 검사, 우리는이 오류가 이상 반복 이상 참조 :

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

서버 production.log 쇼 2는 모든 "완료 / 케이블"통화 "GET / 케이블 시작". 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

해결법

  1. ==============================

    1.AWS에서 단일 인스턴스 탄성 콩 줄기 배포에 웹 소켓 채팅 예제를 실행하려면 다음 Nginx에 프록시 설정을 추가해야합니다 (참고 : 교체 "env1.t3tiiauce6.us-west-2.elasticbeanstalk.com"당신의 사이트 이름을 가진) :

    AWS에서 단일 인스턴스 탄성 콩 줄기 배포에 웹 소켓 채팅 예제를 실행하려면 다음 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. from https://stackoverflow.com/questions/34536926/actioncable-on-aws-error-during-websocket-handshake-unexpected-response-code by cc-by-sa and MIT license