mit*_*val 16 ruby ruby-on-rails nginx ruby-on-rails-5 actioncable
ActionCable在生产中不起作用.适用于开发,但不适用于生产.
在Ubuntu 14.04上使用Puma运行Nginx.我已经检查过redis-server已启动并正在运行.
Rails -v 5.0.0.1
production.log:
INFO -- : Started GET "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
ERROR -- : Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: close, HTTP_UPGRADE: )
INFO -- : Finished "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
Run Code Online (Sandbox Code Playgroud)
客户要求:
GET ws://mityakoval.com/cable HTTP/1.1
Host: mityakoval.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://mityakoval.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2,nb;q=0.2
Cookie: _vaktdagboka_session=******
Sec-WebSocket-Key: *******
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Protocol: actioncable-v1-json, actioncable-unsupported
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 404 Not Found
Server: nginx/1.4.6 (Ubuntu)
Date: Fri, 25 Nov 2016 13:52:21 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache
X-Request-Id: d6374238-69ef-476e-8fc5-e2f8bbb663de
X-Runtime: 0.002500
Run Code Online (Sandbox Code Playgroud)
nginx.conf:
upstream puma {
server unix:///home/mityakoval/apps/vaktdagboka/shared/tmp/sockets/vaktdagboka-puma.sock;
}
server {
listen 80 default_server deferred;
# server_name example.com;
root /home/mityakoval/apps/vaktdagboka/current/public;
access_log /home/mityakoval/apps/vaktdagboka/current/log/nginx.access.log;
error_log /home/mityakoval/apps/vaktdagboka/current/log/nginx.error.log info;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri @puma;
location @puma {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://puma;
}
location /cable {
proxy_pass http://puma;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
error_page 500 502 503 504 /500.html;
client_max_body_size 10M;
keepalive_timeout 10;
}
Run Code Online (Sandbox Code Playgroud)
cable.yml:
redis: &redis
adapter: redis
url: redis://127.0.0.1:6379
production: *redis
development:
adapter: async
test:
adapter: async
Run Code Online (Sandbox Code Playgroud)
在production.rb:
config.action_cable.allowed_request_origins = ["http://mityakoval.com"]
Run Code Online (Sandbox Code Playgroud)
在routes.rb:
mount ActionCable.server, at: '/cable'
Run Code Online (Sandbox Code Playgroud)
更新:
别忘了重新启动nginx :)这对我来说是个问题.
您应该将proxy_pass属性值更改http://puma为http://puma/cable.
因此,正确的location部分/cable将是:
location /cable {
proxy_pass http://puma/cable;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
Run Code Online (Sandbox Code Playgroud)
虽然其他帖子已经正确发布了解决方案,但我想我会发布更多关于如何确定问题所在/为其他 nginx 新手修复问题的信息。
你会知道你的nginx的配置需要proxy_set_header Upgrade在你装行为电缆如果轨道误差包含路径HTTP_UPGRADE:。(意味着没有传递给 HTTP_UPGRADE)。解决问题后,我的日志显示HTTP_UPGRADE: websocket
Gotchya 1:如操作所述,请确保在进行更改后重新启动 nginx(我这样做是错误的)。
Gotchya 2:还要在 nginx 配置中查找包含语句,因为您的配置可能会拆分到多个文件中。该location /cable {部分应该server {在我的情况下丢失的内部,因为它与我暂时没有注意到的包含语句位于不同的配置文件中。
类似的错误但不同的问题:您的 rails 日志将在日志中包含一个额外的错误,就在 OP 提到的那个说不允许原点之前,即当您的 rails 配置需要更新时,另一个答案提到更新 config.action_cable。 allowed_request_origins。
日志记录可能会随着 Rails 发生变化,但希望这有助于澄清问题所在以及我作为对 nginx 一无所知的人遇到的一些问题。
需要 NGINX 配置更改的分辨率才能接受此操作电缆请求。
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Run Code Online (Sandbox Code Playgroud)
将以上行添加到 nginx 站点配置中的位置块中,然后重新启动 nginx。
Jer*_*emy -3
您的 Cable.yml 文件应如下所示:
production:
adapter: redis
url: <%=ENV['REDIS_URL']%>
Run Code Online (Sandbox Code Playgroud)
然后你应该在环境中设置这个密钥,应该看起来像这样:
REDIS_URL: 'redis://redistogo:keyblahblahblhblah'
Run Code Online (Sandbox Code Playgroud)
另外,你应该在 production.rb 中包含以下内容:
config.web_socket_server_url = "wss://YOUR_URL.com/cable"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9277 次 |
| 最近记录: |