2010-12-05 14 views
43

मैं एक सबडोमेन पर, node.js ऐप पर अनुरोध भेजने के लिए हैप्रोक्सी का उपयोग कर रहा हूं।हैप्रोक्सी + वेबसॉकेट डिसकनेक्शन

मैं वेबसाकेट को काम करने में असमर्थ हूं। अब तक मैं केवल क्लाइंट को वेबसॉकेट कनेक्शन स्थापित करने में सक्षम हूं लेकिन फिर एक डिस्कनेक्शन है जो बहुत जल्द बाद में आता है।

मैं उबंटू पर हूं। मैं socket.io और node-websocket-server के विभिन्न संस्करणों का उपयोग कर रहा हूं। ग्राहक या तो सफारी या क्रोम के नवीनतम संस्करण हैं। HAProxy संस्करण 1.4.8

है यहाँ मैं वेब और मेलिंग सूची trawled है लेकिन सुझाव दिया समाधान के किसी भी काम करने के लिए नहीं मिल सकता है मेरी HAProxy.cfg

global 
    maxconn 4096 
    pidfile /var/run/haproxy.pid 
    daemon 

defaults 
    mode http 

    maxconn 2000 

    option http-server-close 
    option http-pretend-keepalive 

    contimeout  5000 
    clitimeout  50000 
    srvtimeout  50000 

frontend HTTP_PROXY 
    bind *:80 

    timeout client 86400000 

    #default server 
    default_backend NGINX_SERVERS 

    #node server 
    acl host_node_sockettest hdr_beg(host) -i mysubdomain.mydomain 

use_backend NODE_SOCKETTEST_SERVERS if host_node_sockettest 


backend NGINX_SERVERS 
server THIS_NGINX_SERVER 127.0.0.1:8081 

backend NODE_SOCKETTEST_SERVERS 
timeout queue 5000 
timeout server 86400000 

server THIS_NODE_SERVER localhost:8180 maxconn 200 check 

है।

(ps इस serverfault के लिए हो सकता है, लेकिन वहाँ इतने पर अन्य HAProxy सवाल कर रहे हैं, इसलिए मैं यहाँ पोस्ट करने के लिए चुना है)

उत्तर

60

अपग्रेड socket.io के नवीनतम संस्करण (0.6 के साथ प्रॉक्सी में सक्षम होना चाहिए। 8 ->npm install [email protected], जो हैप्रोक्सी के साथ काम करने के लिए पैच किया गया है) और हैप्रोक्सी का नवीनतम संस्करण डाउनलोड करें।

global 
    maxconn  4096 # Total Max Connections. This is dependent on ulimit 
    nbproc  2 

defaults 
    mode  http 

frontend all 0.0.0.0:80 
    timeout client 5000 
    default_backend www_backend 
    acl is_websocket hdr(Upgrade) -i WebSocket 
    acl is_websocket hdr_beg(Host) -i ws 

    use_backend socket_backend if is_websocket 

backend www_backend 
    balance roundrobin 
    option forwardfor # This sets X-Forwarded-For 
    timeout server 5000 
    timeout connect 4000 
    server server1 localhost:8081 weight 1 maxconn 1024 check 
    server server2 localhost:8082 weight 1 maxconn 1024 check 
    server server3 localhost:8083 weight 1 maxconn 1024 check 

backend socket_backend 
    balance roundrobin 
    option forwardfor # This sets X-Forwarded-For 
    timeout queue 5000 
    timeout server 5000 
    timeout connect 5000 
    server server1 localhost:8081 weight 1 maxconn 1024 check 
    server server2 localhost:8082 weight 1 maxconn 1024 check 
    server server3 localhost:8083 weight 1 maxconn 1024 check 
+0

हैप्रोक्सी का कौन सा संस्करण आप उपयोग कर रहे हैं? – Diego

+0

@Diego आप किसी भी संस्करण का उपयोग कर सकते हैं> 1.4 –

+0

क्या यह चिपचिपा सत्र प्रमाणीकरण के साथ अनुमति देता है? मैंने इस मुद्दे के लिए एक अलग प्रश्न जोड़ा है: http://stackoverflow.com/q/8149038/152541 – Diego

5

यह है कि आपके ग्राहक WebSockets संस्करण 76 उपयोग कर रहा है जो मामले आप कर सकते हैं 'में संभावना है "मोड http" का उपयोग नहीं करें क्योंकि वेबसाकेट हैंडशेक HTTP का उल्लंघन करता है। इस बारे में समिति में द्विपक्षीयता है कि वेबस्केट हैंडशेक HTTP के साथ संगत होना चाहिए या नहीं। वैसे भी, v76 हैंडशेक के साथ समस्या यह है कि कच्चे डेटा को हैंडशेक (चेकसम खंड) के साथ भेजा जाता है।

प्रासंगिक HAProxy चर्चा: http://www.mail-archive.com/[email protected]/msg03046.html

चर्चा ऐसा लगता है कि टीसीपी मोड के लिए डिफ़ॉल्ट और गैर WebSockets कनेक्शन के लिए वापस HTTP पर गिर के लिए एक रास्ता हो सकता है से।

+0

महान जानकारी है। ऐसा लगता है कि पोर्ट 80 से websockets होने की इच्छा है जिसे मैं यहां पूरा करने की कोशिश कर रहा हूं। टीसीपी परत 4 मोड में देखेंगे। – Ross

+0

@Ross, कृपया जो भी आप पाते हैं उसे वापस पोस्ट करें। या यदि आप किसी अन्य रिज़ॉल्यूशन पर नहीं आते हैं तो क्या आप इस उत्तर का चयन कर सकते हैं ताकि कोई भी अन्य समस्या की खोज कर सके और जानता है कि प्रश्नों की सूची स्कैन करते समय एक संकल्प है। – kanaka

+0

हाँ, करेंगे ... – Ross

-1

नोड-websockets-server के बजाय Socket.io का उपयोग करने का प्रयास करें, यह ब्राउज़र और सर्वर के बीच तत्काल संचार के कई अलग-अलग तरीकों से फ़ॉलबैक के साथ एक अमूर्त परत है।

यह है जबकि सच WebSockets HTTP 1.0 का उल्लंघन, वे, HTTP 1.1 का उल्लंघन नहीं करते ताकि आप उन्हें किसी सर्वर प्रॉक्सी HTTP करने में सक्षम 1.1

4

हम एक Netty कार्यान्वयन https://github.com/ibdknox/socket.io-netty का उपयोग कर और यहाँ कर रहे हैं HAProxy फ़ाइल है कि हम के लिए काम किया है:

यहाँ एक उदाहरण कॉन्फ़िग फ़ाइल है। एक्सएचआर-पोलिंग पर वापस आने के लिए यह चाल नहीं है, लेकिन वेबकैकेट्स का उपयोग एचएपीआरएक्सी को टीसीपी मोड में डाल रहा है। HAProxy config:

global 
    daemon 
    maxconn 32000 

defaults 
    mode http 
    timeout connect 5000ms 
    timeout client 50000ms 
    timeout server 50000ms 

listen http-in 
    bind *:80 
    server server1 1.1.1.1:8000 check 
    server server2 1.1.1.1:8000 check 

listen socketio-in 
    mode tcp 
    bind *:8080 
    balance source 
    timeout queue 5000 
    timeout server 86400000 
    timeout connect 86400000 
    server server1 1.1.1.1:8080 check 
    server server2 1.1.1.1:8080 check 

कहाँ 1.1.1.1 अपने आईपी

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