2012-10-23 15 views
5

नवीनतम क्रोम ब्राउज़र के साथ लटकता है, मैं sockjs क्लाइंट का उपयोग बैकएंड सर्वर के साथ संवाद करने के लिए कर रहा हूं जो haproxy के पीछे है। मेरे लोकहोस्ट पर (बीच में haproxy के बिना), यह ठीक काम कर रहा है - क्लाइंट websocket प्रोटोकॉल का उपयोग कर संदेश भेज, भेज और प्राप्त कर सकता है। उदाहरण के लिए:वेबस्केट हैंडशेक हैप्रोक्सी

conn.onopen = function() { 
    if (conn.readyState === SockJS.OPEN) { 
     conn.send("hello server"); 
     console.log("msg sent"); 
    } 
}; 

एक बार मैं HAProxy साथ सर्वर पर तैनात, अजीब बात होता sockjs सोचता है कि (conn.readyState === SockJS.OPEN में और के रूप में 'भेजा संदेश' कंसोल लॉग में दिखाई देता है), तथापि, websocket हाथ मिलाना कनेक्शन खुला बस लटकता है और संदेश सर्वर द्वारा कभी प्राप्त नहीं होता है।

Oct 23 09:08:25 localhost.localdomain haproxy[14121]: 129.xx.xxx.105:55000 [23/Oct/2012:09:08:24.459] public www/content 777/0/0/1/778 200 375 - - ---- 3/3/0/1/0 0/0 "GET /sockjs/info HTTP/1.1" 
Oct 23 09:10:54 localhost.localdomain haproxy[14121]: 129.xx.xxx.105:55015 [23/Oct/2012:09:08:25.398] public www/content 0/0/0/1/149017 101 147 - - CD-- 4/4/0/0/0 0/0 "GET /sockjs/478/kyi342s8/websocket HTTP/1.1" 

सूचना है कि दूसरी लॉग संदेश केवल प्रकट होता है जब मैं बंद haproxy पीछे बैकएंड सर्वर: नीचे क्या मैं haproxy लॉग में देखते हैं। शट डाउन से पहले, लॉग में कोई त्रुटि नहीं है लेकिन वेबस्केट हैंडशेक पूरा नहीं होता है और सर्वर द्वारा कोई संदेश प्राप्त नहीं होता है।

Chrome के डेवलपर टूल का उपयोग करके नेटवर्क टैब में, मैं निम्न देखें:

Request URL:ws://www.mysite.com/sockjs/478/kyi342s8/websocket 
Request Method:GET 
Status Code:101 Switching Protocols 

Request Headers 
Connection:Upgrade 
Host:www.mysite.com 
Origin:http://www.mysite.com 
Sec-WebSocket-Extensions:x-webkit-deflate-frame 
Sec-WebSocket-Key:TFEIKYhlqWWBZKlXzXAuWQ== 
Sec-WebSocket-Version:13 
Upgrade:websocket 
(Key3):00:00:00:00:00:00:00:00 

Response Headers 
Connection:Upgrade 
Sec-WebSocket-Accept:D+s3va02KH6QTso24ywcdxcfDgM= 
Upgrade:websocket 
(Challenge Response):00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 

और दोनों के नेटवर्क टैब के अंतर्गत websocket वस्तु शो 'लंबित' की 'प्रकार' और 'समय विलंबता' डेवलपर उपकरण।

global 
     log 127.0.0.1 local1 info 
     log 127.0.0.1 local1 notice 
     #log loghost local0 info 
     maxconn 4096 
     chroot /usr/share/haproxy 
     uid 99 
     gid 99 
     daemon 
     #debug 
     #quiet 

defaults 
     log    global 
     mode   http 
     option   httplog 
     option   dontlognull 
     retries   3 
     option   redispatch 
     maxconn   500 
     timeout connect 6s 

frontend public 
     mode http 
     bind *:80 
     timeout client 300s 
     option http-server-close 
     #option   http-pretend-keepalive 
     # define ACLs 
     acl host_static hdr_beg(host) -i static. data. 
     acl host_www hdr_beg(host) -i www. 
     acl url_static path_end .ico .txt .pdf .png .jpg .css .js .csv 
     acl is_stats path_beg /haproxy/stats 
     # define rules 
     use_backend nginx if host_static or host_www url_static 
     use_backend stats if is_stats 
     default_backend www 

backend nginx 
     timeout server 20s 
     server nginx 127.0.0.1:8484 

backend stats 
     stats enable 
     stats uri /haproxy/stats 

backend www 
     timeout server 300s 
     option forwardfor 
     #no option httpclose 
     option http-server-close 
     server sockcontent 127.0.0.1:8080 

क्या किसी को पता है कि क्यों यह हो रहा है:

अंत में, यह मेरा haproxy config (संस्करण 1.4.22) क्या है? क्या यह haproxy कॉन्फ़िगरेशन, या यहां तक ​​कि सर्वर की कुछ सामान्य नेटवर्क सेटिंग्स (उदा। iptables) के कारण है?

पीएस मैंने http-pretend-keepalive को haproxy में सक्षम करने का प्रयास किया है, लेकिन यह काम नहीं करता है।

उत्तर

1

सबसे अधिक संभावना, आप अपने नेटवर्क में पारदर्शी फ़ायरवॉल है और यह बंदरगाह 80

के लिए जा रहा है कि मामला है सत्यापित करने के लिए WebSocket कनेक्शन को खराब करता:

  1. मेक haproxy और भिन्न पोर्ट पर सुनने अगर कोशिश यह काम करना शुरू कर दिया;
  2. अपने नेटवर्क के बाहर अपनी सेवा तक पहुंचने का प्रयास करें।

यदि यह काम करना शुरू करता है, तो आपके नेटवर्क में कुछ गड़बड़ है।

दुर्भाग्यवश, सॉकजेएस इस मामले में फ़ॉलबैक परिवहन का उपयोग नहीं करेगा, क्योंकि क्लाइंट इसे कनेक्ट करता है, लेकिन कनेक्शन वास्तव में स्थापित नहीं किया गया था।

संभावित समाधान के रूप में: हैप्रोक्सी दो बंदरगाहों पर, अपने वेब यातायात के लिए पोर्ट 80 पर और सॉकजेएस यातायात के लिए अलग-अलग बंदरगाह पर सुनें। यह गारंटी देता है कि पारदर्शी HTTP प्रॉक्सी आपके वेबसाइकिल कनेक्शन से गड़बड़ नहीं करेंगे।

1

मुझे पहले से ही इस मामले का सामना करना पड़ा है, मुझे याद नहीं है कि यह कौन सा सर्वर था, लेकिन यह वेबसॉकेट स्पेक के साथ पूरी तरह से अनुपालन नहीं था। दरअसल, यह असफल रहा क्योंकि इसे "अपग्रेड" टोकन के साथ कनेक्शन हेडर में "करीबी" टोकन मिला, जबकि spec का कहना है कि "अपग्रेड" टोकन की आवश्यकता है और (सौभाग्य से) अन्य लोगों को अस्वीकार करने का सुझाव नहीं देता है।

सिद्धांत रूप में, यदि आप टिप्पणी करते हैं तो "विकल्प http-pretend-keep-alive" विकल्प का उपयोग करते हैं, तो इसे काम करना चाहिए। कम से कम इसने मेरे लिए किया। लेकिन शायद यहां एक अलग मुद्दा है।

2

की तरह @ जोस ने कहा, यह फ़ायरवॉल का गलत व्यवहार करने की गलती है। कुछ कहते हैं कि उदाहरण के लिए फोर्टिगेट इसका कारण बनता है।

अधिक चर्चा: https://github.com/sockjs/sockjs-client/issues/94

SSL पर सेवित SockJS समस्या को हल करने लगता है।

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