2016-07-05 9 views
10

मैं इन लॉग संदेशोंकार्रवाई केबल (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 

मैं एक छोटे से debuggged के साथ गैर विकास के वातावरण में WebSocket से कनेक्ट करने में एक मुद्दा हो रहा है और अनुरोध भेजा पता लगा ब्राउज़र/जावास्क्रिप्ट द्वारा यूनिकॉर्न (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 

यहां कनेक्शन 'अपग्रेड' लेकिन WebSocket अनुरोध कनेक्शन 'बंद' है (शायद nginx यह खिलवाड़ कर रहा है ऊपर?) है

और यह है WebSocket ड्राइवर में कोड का टुकड़ा विफल हो रहा है

def self.websocket?(env) 
     connection = env['HTTP_CONNECTION'] || '' 
     upgrade = env['HTTP_UPGRADE'] || '' 

     env['REQUEST_METHOD'] == 'GET' and 
     connection.downcase.split(/ *, */).include?('upgrade') and 
     upgrade.downcase == 'websocket' 
end 

अपडेट

यह मेरा 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; 
} 

मैं/केबल

mount ActionCable.server => "/cable" 
nginx परिवर्तनों के साथ

मैं सफलतापूर्वक हाथ मिलाना है करने में सक्षम हूँ लेकिन सर्वर दिल भेजने में सक्षम नहीं है पर actioncable सर्वर घुड़सवार है धड़कता है और कनेक्शन गिरता रहता है।

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) 
+1

आप Nginx का कौन सा संस्करण चल रहे हैं? मुझे लगता है कि वेबसाकेट 1.3 के बाद से समर्थित हैं। क्या आपने https://www.nginx.com/blog/websocket-nginx/ सुझावों के रूप में 'अपग्रेड' और' कनेक्शन 'शीर्षलेख सेट किए हैं? –

+0

अद्यतन प्रश्न !! @JuliuszGonera – sethi

+1

यह मेरे लिए Nginx 1.7.12 के साथ काम करता है: https://gist.github.com/jgonera/91aa8c1f4e38bf0169ccc3adc00be90c –

उत्तर

2

आप अपने उत्पादन डोमेन से कनेक्शन की अनुमति के लिए production.rb में config.action_cable.allowed_request_origins सेट किया है? मेरी nginx.conf में वहाँ भी

proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-Proto http; 

है मैं पूरी तरह यकीन है कि अगर वे वास्तव में आवश्यक हैं नहीं हूँ, लेकिन यह मेरे लिए काम करता है।

+0

क्या आपने इसे यूनिकॉर्न पर आजमाया है? कौन सा संस्करण? – sethi

0

रेल 5 कार्रवाई केबल CORS:

my_rails_project/config/initializers में एक गहरे लाल रंग का फ़ाइल यानी action_cable.rb बना सकते हैं और निम्न कोड जोड़ें।

if Rails.env.development? 
    Rails.application.config.action_cable.allowed_request_origins = ['http://localhost:3001', 'http://127.0.0.1:3001'] 
end 

आप कर चुके हैं।

संबंधित मुद्दे