如何在生产中使用Nginx和UnicornconfigurationActionCable?

我最近把我的rails项目从Rails4切换到5.0.0.beta3来使用真棒ActionCable。

我的ActionCable服务器在独angular兽内运行。 在开发中一切正常。 在生产中,我有

Started GET "/cable" for xxx.xxx.xxx.xxx at 2016-03-28 18:06:38 +0300 Started GET "/cable/" [WebSocket] for xxx.xxx.xxx.xxx at 2016-03-28 18:06 Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket) Registered connection (189772ff-6229-48f1-ae7f-d9a96ad3a6c3) Finished "/cable/" [WebSocket] for xxx.xxx.xxx.xxx at 2016-03-28 18:06:35 

而这个信息在一个循环中反复重复。

我已经在stackoverflow尝试了很多选项来处理这个,但没有什么帮助。 我的nginxconfiguration:

  upstream unicorn { server unix:/tmp/unicorn.my_app.sock fail_timeout=0; } server { server_name www.my_app.com; return 301 $scheme://my_app.com$request_uri; } server { listen 80 default deferred; server_name my_app.com; root /var/www/my_app/current/public; location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; } try_files $uri/index.html $uri @unicorn; location @unicorn { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://unicorn; } location /cable { proxy_pass http://unicorn/cable; proxy_http_version 1.1; proxy_set_header Upgrade websocket; proxy_set_header Connection Upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 /500.html; keepalive_timeout 5; } 

为了确保请求被允许,我已经在初始化程序中临时使用这个代码: ActionCable.server.config.disable_request_forgery_protection = true

我的cable.coffee文件

  @App ||= {} App.cable = ActionCable.createConsumer "/cable" 

我的config/cable.yml文件

 production: adapter: redis url: redis://localhost:6379/1 

在这个问题上我不是很有经验,所以任何帮助都会很棒。

location /cable线段需要添加一行proxy_set_header Host $http_host;

应该:

 location /cable { proxy_pass http://unicorn/cable; proxy_http_version 1.1; proxy_set_header Upgrade websocket; proxy_set_header Connection Upgrade; 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; } 

我实现了机架超时 。 设置正确的超时更正了我的问题。 设置这些变量的正确方法是在config.ru使用语句中,如下所示:

 use Rack::Timeout, service_timeout: 5 

这是我用于我的网站的配置,似乎工作正常(Rails 5 + Nginx + Unicorn + Capistrano)。 包括你看到的代码片段是从h5bp / server-configs-nginx ,但我不认为他们可能是你的配置不起作用的原因。

 upstream example_app { server unix:/home/username/www/example.com/current/tmp/sockets/unicorn.example.com.sock fail_timeout=0; } server { listen 80; server_name example.com www.example.com; return 301 https://example.com$request_uri; } server { listen 443 ssl; server_name www.example.com; include h5bp/directive-only/ssl.conf; ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; return 301 https://example.com$request_uri; } server { listen 443 ssl; server_name example.com; include h5bp/directive-only/ssl.conf; ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; root /home/username/www/example.com/current/public; # Set maximum request body size for uploads client_max_body_size 25m; try_files $uri/index.html $uri @unicorn; location @unicorn { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto https; proxy_redirect off; proxy_pass http://example_app; } location /cable { proxy_pass http://example_app; proxy_http_version 1.1; proxy_set_header Upgrade websocket; proxy_set_header Connection Upgrade; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto https; proxy_redirect off; } access_log /var/log/nginx/example.com/access.log; error_log /var/log/nginx/example.com/error.log; charset utf-8; server_tokens off; error_page 404 /404.html; include h5bp/basic.conf; } 

cable.yml

 production: adapter: redis url: redis://localhost:6379/1 

cable.js

 //= require action_cable //= require_self //= require_tree ./channels (function() { this.App || (this.App = {}); App.cable = ActionCable.createConsumer(); }).call(this);