Ruby on rails 操作电缆无法连接(升级到WebSocket失败)
我在使用这些日志消息连接到非开发环境中的websocket时遇到问题Ruby on rails 操作电缆无法连接(升级到WebSocket失败),ruby-on-rails,nginx,ruby-on-rails-5,actioncable,Ruby On Rails,Nginx,Ruby On Rails 5,Actioncable,我在使用这些日志消息连接到非开发环境中的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(使用ng
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
更新
这是我的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;
}
我已在/cable上安装了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)
您是否在production.rb中设置了
config.action\u cable.allowed\u request\u origins
,以允许从您的生产域进行连接?
在我的nginx.conf中还有
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto http;
我不完全确定他们是否真的需要,但这对我来说很有效 Rails 5动作电缆CORS: 在
myrails\u project/config/initializers
中创建一个ruby文件,即action\u cable.rb
,并添加以下代码
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\u cable中。将其更改为前端url时允许的请求\u来源问题得到了解决。更清楚地说,我在完全不同的域中使用了font-end和backend您正在运行哪个版本的Nginx?我认为WebSocket从1.3开始就得到了支持。您是否按照建议设置了升级
和连接
标题?更新了问题@JuliuszGoneraThis适用于我的Nginx 1.7.12:谢谢@JuliuszGonera我的Nginx配置正在工作..但仍然不适用于unicorn它适用于puma。。你的独角兽版本是什么?确认需要做两件事。正如下面的回答中所提到的,您需要设置config.action\u cable.allowed\u request\u origins
。此外,如果你的应用程序运行在nginx proxy之后,你需要代理@juliuszGonera提到的setu头。另请参见nginx.org/en/docs/http/websocket.html。
if Rails.env.development?
Rails.application.config.action_cable.allowed_request_origins = ['http://localhost:3001', 'http://127.0.0.1:3001']
end