Не удается подключить кабель действий (не удалось обновить до WebSocket)
У меня возникла проблема при подключении к веб-сокету в не-средах разработки с этими сообщениями журнала
Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: close, HTTP_UPGRADE: )
Finished "/cable/"[non-WebSocket] for 127.0.0.1 at 2016-07-06 09:44:29 +1000
Я немного отладил и понял, что запрос, отправленный браузером /javascript, не совсем совпадает с запросом, полученным от Unicorn(работает с nginx).
Заголовок запроса браузером
GET ws://cc-uat.com.au/cable HTTP/1.1
Host: cc-uat.com.au
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://cc-uat.com.au
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Cookie: <Lot of cookies>
Sec-WebSocket-Key: QGdJkYIA2u7vtmMVXfHKtQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Protocol: actioncable-v1-json, actioncable-unsupported
Соединение здесь 'upgrade', но в запросе websocket соединение 'закрыто'(возможно, nginx его испортил?)
И этот кусок кода в драйвере websocket терпит неудачу
def self.websocket?(env)
connection = env['HTTP_CONNECTION'] || ''
upgrade = env['HTTP_UPGRADE'] || ''
env['REQUEST_METHOD'] == 'GET' and
connection.downcase.split(/ *, */).include?('upgrade') and
upgrade.downcase == 'websocket'
end
Обновления
Это моя конфигурация nginx
upstream app {
server unix:/home/osboxes/sites/actioncable-examples/shared/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name localhost;
root /home/osboxes/sites/actioncable-example/public;
try_files $uri/index.html $uri @app;
location @app {
proxy_pass http://app;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
Я установил сервер actioncable на / кабель
mount ActionCable.server => "/cable"
С изменениями nginx я могу успешно получить рукопожатие, но сервер не может отправить сердцебиение, и соединение продолжает падать.
Started GET "/cable" for 127.0.0.1 at 2016-07-07 05:48:06 +0100
Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2016-07-07 05:48:06 +0100
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)
2 ответа
Вы установили config.action_cable.allowed_request_origins
в production.rb, чтобы разрешить соединения с вашего рабочего домена? В моем nginx.conf также есть
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto http;
Я не совсем уверен, действительно ли они необходимы, но это работает для меня.
Rails 5 Action Cable CORS:
создать файл ruby т.е. action_cable.rb
в my_rails_project/config/initializers
и добавьте следующий код.
if Rails.env.development?
Rails.application.config.action_cable.allowed_request_origins = ['http://localhost:3001', 'http://127.0.0.1:3001']
end
вы сделали.
Благодаря приведенному выше ответу я получал аналогичную ошибку. Проблема заключалась в том, что я сохранил URL-адрес серверной части вconfig.action_cable.allowed_request_origins
при изменении его на URL-адрес интерфейса проблема решена. Чтобы быть более понятным, у меня есть font-end,backend в совершенно разных доменах