Я пытаюсь получить WebSockets включен приложение работает, но я бегу в ошибку при попытке подключения:WebSocket рельсы (Faye-WebSocket) код ошибки рукопожатия 200 - AWS ElasticBeanstalk, Nginx, пума
WebSocket connection to 'ws://[domain.com]/' failed: Error during WebSocket handshake: Unexpected response code: 200
Я следую учебнику здесь (https://devcenter.heroku.com/articles/ruby-websockets), который использует gem faye-websocket. Он работает нормально локально (с puma), но когда я пытаюсь развернуть его на AWS ElasticBeanstalk, который запускает nginx + puma, запрос веб-камеры не может подключиться.
Я создаю новое подключение WebSocket со следующим JavaScript (с моим собственным доменом):
var ws = new WebSocket("ws://[domain.com]/");
После урока я создал класс промежуточного слоя, который проверяет входящие запросы на WebSocket и ручки это соответственно. На моем локальном сервере, запрос среда хэш выглядит следующим образом:
"rack.errors" => #> "rack.multithread" => правда "rack.multiprocess" => ложным, «стойку. run_once "=> false," SCRIPT_NAME "=>" "," CONTENT_TYPE "=>" text/plain "," 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 "=>" Upgrade "," HTTP_PRAGMA "=>" no-cache "," HTTP_CACHE_CONTROL "=>" no-cache "," 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 "=>" gz ф, выкачать, SDCH», "HTTP_ACCEPT_LANGUAGE"=> "EN-US, еп, д = 0,8",
В то время как на AWS это выглядит следующим образом:
{ "rack.version" => [1, 3], "rack.errors" => #, "rack.multithread" => true, "rack.multiprocess" => false, "rack.run_once" => false, "SCRIPT_NAME" => " "," CONTENT_TYPE "=>" text/plain "," QUERY_STRING "=>" "," SERVER_PROTOCOL "=>" HTTP/1.1 "," SERVER_SOFTWARE "=>" 2.11.1 "," GATEWAY_INTERFACE "=>" CGI/RE: «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 "=>" no-cache "," HTTP_CACHE _CONTROL "=>" no-cache "," 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; д = 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";
}
}
}
Из того, что я понимаю, это направляет запросы, идущие к/кабелю к файлу backend rails и обновляет соединение с веб-узлами. Однако, когда я пытаюсь/кабель, я получаю ошибку 404 (так как нет соответствующего маршрута).
Итак, как я могу правильно связаться со своими поручнями с websockets? Любая помощь приветствуется!! Я также пробовал использовать драгоценный камень websocket-rails и получил код ошибки рукопожатия 500