问题描述
ActionCable在生产中不起作用.在开发中效果很好,但在生产中效果不佳.
ActionCable doesn't work in production. Works well in development, but not in production.
在Ubuntu 14.04上使用Puma运行Nginx.我已检查redis服务器是否已启动并正在运行.
Running Nginx with Puma on Ubuntu 14.04. I have checked that redis-server is up and running.
Rails -v 5.0.0.1
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
来自客户的请求:
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
响应:
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
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; }
cable.yml:
redis: &redis adapter: redis url: redis://127.0.0.1:6379 production: *redis development: adapter: async test: adapter: async
在production.rb中:
config.action_cable.allowed_request_origins = ["http://mityakoval.com"]
在routes.rb中:
mount ActionCable.server, at: '/cable'
更新:
别忘了重启nginx :)那对我来说是个问题.
Don't forget to restart nginx :) That was the problem for me.
推荐答案
您应将proxy_pass属性的值从http://puma更改为http://puma/cable.
You should change the value of proxy_pass property from http://puma to http://puma/cable.
因此,/cable的正确location部分将为:
Therefore, the correct location section for the /cable will be:
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"; }
这篇关于ActionCable-无法在生产中升级到WebSocket的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!