2011-11-16 14 views
5

मेरे पास हैप्रोक्सी के तहत चल रहे प्रमाणीकरण के साथ socket.io के कई उदाहरण हैं और मुझे यह बल देने की आवश्यकता है कि प्रमाणीकरण अनुरोध और सॉकेट कनेक्शन एक ही उदाहरण पर जाएं। मैं पर कुछ संशोधनों के रूप में तो साथ this answer to a SO question आधारित HAProxy सेट कर लेते हैं:क्या मेरे पास प्रमाणीकरण के साथ हैप्रोक्सी और सॉकेट.ओ के साथ चिपचिपा सत्र हो सकते हैं?

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 86400000 
    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 url_param sessionId 
    option forwardfor # This sets X-Forwarded-For 
    timeout server 30000 
    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 url_param sessionId 
    option forwardfor # This sets X-Forwarded-For 
    timeout queue 5000 
    timeout server 86400000 
    timeout connect 86400000 
    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 

मैं url_param की कोशिश की है और शेष राशि के रूप में स्रोत (जहाँ sessionId एक क्वेरी स्ट्रिंग पैरामीटर दोनों प्रमाणीकरण कॉल और WebSocket संबंध में पारित कर दिया है) विकल्प लेकिन ऐसा लगता है जैसे हैप्रोक्सी केवल इन विकल्पों को HTTP कनेक्शन के लिए अनुमति देता है और इसलिए उन्हें वास्तविक वेबसाइकिल कनेक्शन के लिए अनदेखा करता है। नतीजा यह है कि कभी-कभी ऑथ अनुरोध और सॉकेट कनेक्शन अलग-अलग सर्वरों में समाप्त होता है, जो हमारे आवेदन के लिए अस्वीकार्य है।

क्या यह वांछित व्यवहार करने का कोई तरीका है?

+0

क्या तुमने कभी का सबसे अच्छा तरीका यह करने के लिए यह पता लगाने क्या है? मैं वही काम करना चाहता था। धन्यवाद। –

+0

मैं आईपी-हैश संतुलन का उपयोग कर समाप्त हुआ। एक ही आईपी से सभी अनुरोध एक ही सर्वर पर जाते हैं – Diego

+0

ओ ठीक है, लेकिन क्या इसका मतलब यह है कि सर्वर ए पर किसी उपयोगकर्ता से प्रसारित किया जा रहा वेबसाइकिल सर्वर बी पर किसी भी उपयोगकर्ता तक नहीं पहुंचता है? –

उत्तर

0

roundrobin का उपयोग कर websocket कनेक्शन संतुलन के लिए। चूंकि इसकी एक बिडरेक्शनल सॉकेट (टीसीपी से अधिक) चिपचिपापन डिफ़ॉल्ट रूप से बनाए रखा जाता है। source संतुलन एल्गोरिदम का उपयोग कर अन्य परिवहन के लिए सबसे अच्छी शर्त है। (आप कुकी आधारित दृढ़ता उपयोग कर सकते हैं लेकिन socket.io एक jsessionid या वापस प्रॉक्सी सर्वर के लिए की तरह नहीं भेजता है आप sockjs कोशिश कर सकते हैं यदि आप कुकी आधारित दृढ़ता चाहते हैं।।)

उदाहरण:

#do the same for other transports. [Note in 0.6.x resource was mounted at path: /socket.io/[transport] 
acl is_JSONPolling path_beg /socket.io/1/jsonp-polling 
use_backend non_websocket if is_JSONPolling 


backend non_websocket 
    balance source 
    #rest same as the one for websocket backend 
+0

समस्या यह है कि प्रमाणीकरण अनुरोध और वेब सर्वर कनेक्शन विभिन्न सर्वरों में समाप्त हो सकता है। क्या उन्हें हमेशा एक ही सर्वर पर जाने का कोई तरीका है? क्या आप जानते हैं कि कोई अन्य लोड बैलेंसर यह प्रदान करता है या नहीं? – Diego

+0

इससे कोई फ़र्क नहीं पड़ता कि कौन सा सर्वर हिट किया गया है बशर्ते आपका ऑथ स्टोर ऐप से अलग हो। उम्मीद है कि आप ऑथ सत्रों के लिए अपनी दुकान के रूप में स्मृति का उपयोग नहीं कर रहे हैं। ऑथ कुंजी स्टोर करने के लिए रेडिस जैसे कुछ का उपयोग करें। ऑथ को संभालने के लिए यहां मेरे उत्तर पर एक नज़र डालें: http://stackoverflow.com/questions/4753957/socket-io-authentication/4754806#4754806 –

2

टीसीपी कनेक्शन को संतुलित करने के लिए, आपको stick_match या stick on आदेशों का उपयोग करके चिपचिपापन तालिका के साथ कुछ सफलता हो सकती है और स्पष्ट रूप से टीसीपी मोड सेट कर सकते हैं।

# forward SMTP users to the same server they just used for POP in the 
# last 30 minutes 
backend pop 
    mode tcp 
    balance roundrobin 
    stick store-request src 
    stick-table type ip size 200k expire 30m 
    server s1 192.168.1.1:110 
    server s2 192.168.1.1:110 

backend smtp 
    mode tcp 
    balance roundrobin 
    stick match src table pop 
    server s1 192.168.1.1:25 
    server s2 192.168.1.1:25 

सभी दस्तावेज़ उपलब्ध here:

यहाँ एक उदाहरण है।

9

मैं इस तरह से कुकी आधारित संतुलन का उपयोग करें:

backend socketio 
    mode http 
    cookie SIO insert 
    server sock1 127.0.0.1:8001 cookie 001 
    server sock2 127.0.0.1:8002 cookie 002 
+0

कुकी विधि के लिए, कुकी टाइमआउट अवधि सेट करने का कोई तरीका है? – Alessandro

0

आप HTTP का उपयोग कर रहे हैं ताकि दृढ़ता के लिए एक कुकी सम्मिलित - कि निश्चित रूप से सबसे अच्छा मार्ग है। वह इसे पहले सर्वर पर चिपकेगा जब तक कि वह नीचे न जाए।

तुम भी कॉन्फ़िगर कर सकते हैं कि क्या यह यह redispatch चाहिए, अगर यह नीचे आदि

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

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