2016-03-28 33 views
9

Başarısız ActionCable'ı kullanmak için geçtiğimiz günlerde raylar projemi Rails4'ten 5.0.0.beta3'e değiştirdim.Nginx ve Unicorn ile ActionCable nasıl üretilir?

ActionCable sunucum unicorn içinde çalıştırılıyor. Gelişimde tüm işler iyi. üretiminde ben

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 

var Ve bu mesajı bir döngü içinde tekrar tekrar yinelenir.

Bunu işlemek için stackoverflow'ta pek çok seçenek denedim ama hiçbir şey yardımcı olmaz. Benim nginx yapılandırma: ActionCable.server.config.disable_request_forgery_protection = true

Benim cable.coffee dosyayı

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

Benim config/cable.yml dosya

:

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; 
} 

istek ı ettik geçici başlatıcılar bu kodu kullanmak izin verildiğinden emin olmak için

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

Bu soruda çok deneyimli değilim, bu nedenle herhangi bir yardım harika olurdu.

+0

Rotalarınızda 'mountCable.server => '/ cable'' var mı? – siegy22

+0

@yzalavin Bunu çözebildiniz mi? Aynı problemi görüyorum. –

+0

@R_G Aynı konuya da sahibim. Sorunları bulabildin mi? Tek boynuzlu attığım hatalardan, istemcilere ping gönderemiyorum ve böylece istemci yeniden bağlanmaya çalışıyor. Yani bağlantı deyimleri döngü içinde. Diğer yöndeki akışın neden çalışmadığından emin değilsiniz – sethi

cevap

1

rack-timeout uygulandım. Doğru zaman aşımlarını ayarlamak problemimi düzeltti.

use Rack::Timeout, service_timeout: 5 
0

Bu Web sitem için kullanmak yapılandırma olduğunu ve ince (Rails 5 + Nginx + Unicorn + çalışıyor görünüyor şu şekildedir: bu değişkenleri ayarlamak için uygun yöntem config.ru kullanım açıklamada ise Capistrano). Parçacıkta göründüğünüze ilişkin ekler h5bp/server-configs-nginx'dan geliyor, ancak yapılandırmanızın neden çalışmadığının bir nedeni olabileceğini düşünmüyorum.

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

location /cable bölümde
//= require action_cable 
//= require_self 
//= require_tree ./channels 

(function() { 
    this.App || (this.App = {}); 

    App.cable = ActionCable.createConsumer(); 

}).call(this); 
3

proxy_set_header Host $http_host;

olmalı bir çizgi eklemeniz gerekir:

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; 
    } 
+0

bu benim için çalıştı :) –