2012-05-03 20 views
9

के रूप में अपाचे के साथ सर्वर पर नोडजेस के साथ सॉकेट.ओओ का उपयोग करके मैं the guide के बाद ब्राउज़र और क्लाइंट के बीच मैसेजिंग को सुलझाने के लिए सॉकेट.आईओ के साथ नोड.जेएस का उपयोग करने का प्रयास कर रहा हूं।एक रिवर्स प्रॉक्सी

हालांकि, मुझे अपाचे के पीछे नोड रिवर्स-प्रॉक्सीड सेट करना पड़ा। तो, नोड के लिए example.com:8080 की बजाय, मैं example.com/nodejs/ का उपयोग कर रहा हूं।

ऐसा लगता है कि सॉकेट.आईओ स्वयं को समझने का कारण बनता है। यहाँ मेरी नोड एप्लिकेशन

var io = require('socket.io').listen(8080); 

// this has to be here, otherwise the client tries to 
// send events to example.com/socket.io instead of example.com/nodejs/socket.io 
io.set('resource', '/nodejs/socket.io'); 

io.sockets.on('connection', function (socket) { 

    socket.emit('bar', { one: '1'}); 

    socket.on('foo', function(data) 
    { 
    console.log(data); 
    }); 

}); 

है और यहाँ क्या मेरे मुवक्किल फ़ाइल लग रहा है

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>Socket.IO test</title> 

    <script src="http://example.com/nodejs/socket.io/socket.io.js"></script> 

    <script> 

    var socket = io.connect('http://example.com/nodejs/'); 

    console.log(socket); 

    socket.on('bar', function (data) 
    { 
    console.log(data); 
    socket.emit('foo', {bar:'baz'}); 
    }); 

    socket.emit('foo',{bar:'baz'}); 

    </script> 
</head> 
<body> 
    <p id="hello">Hello World</p> 
</body> 
</html> 

समस्या यहाँ की तरह http://example.com/nodejs/socket.io/socket.io.js लिए स्क्रिप्ट संदर्भ है। यह अपेक्षित जावास्क्रिप्ट सामग्री को वापस नहीं करता है - इसके बजाय यह "socket.io में आपका स्वागत है" जैसे कि मैंने http://example.com/nodejs/ मारा।

कोई विचार यह है कि मैं यह काम कैसे कर सकता हूं?

+0

मुझे पता है कि यह सवाल हाथ से संबंधित नहीं है (और अगर मुझे एक नया SO प्रश्न खोलना चाहिए तो कृपया मुझे कॉल करें), लेकिन मैं उत्सुक हूं कि आपका अपाचे httpd.conf क्या दिखता है। मेरे पास वास्तविक node.js सर्वर पर जाने के लिए प्रॉक्सी सेट अप है, हालांकि, मुझे websockets प्रॉक्सी काम नहीं मिल रहा है। क्या आप कृपया उदाहरण दे सकते हैं कि आप अपाचे के साथ यह कैसे कर रहे हैं? – pmalbu

+0

क्षमा करें, लेकिन मैं नहीं कर सकता। यह प्रोजेक्ट 2 साल पहले एक हैकथॉन में किया गया था और इसके लिए सेट किया गया सर्वर अब मौजूद नहीं है। –

उत्तर

7

यह एक बहु-आयामी समाधान किया जा रहा समाप्त हो गया।

पहले, चीजों के सर्वर अंत पर, मैं क्लाइंट-साइड पर फिर इस

var io = require('socket.io').listen(8080); 

var rootSockets = io.of('/nodejs').on('connection', function(socket) 
{ 
    // stuff 
}); 

var otherSockets = io.of('nodejs/other').on('connection', function(socket) 
{ 
    // stuff 
}); 

तरह अंतिमबिंदुओं स्थापित करने के लिए, ठीक से इस

var socket = io.connect(
    'http://example.com/nodejs/' 
    , {resource: 'nodejs/socket.io'} 
); 

// The usage of .of() is important 
socket.of('/nodejs').on('event', function(){}); 
socket.of('/nodejs/other').on('event', function(){}); 

की तरह दिखता है कनेक्ट करने के लिए किया था इसके बाद, यह सब काम किया। याद रखें, इस सर्वर पर अपाचे पोर्ट 8080 में आंतरिक रूप से proxying example.com/nodejs है।

+2

द्वारा प्रतिस्थापित किया गया सॉकेट.io का कौन सा संस्करण आपने उपयोग किया है? मैंने उल्लिखित समाधान की कोशिश की। लेकिन अगर वेब सॉकेट अनुरोध apache mod_proxy के माध्यम से रूट किया जाता है तो सभी http शीर्षलेख हटा दिए जाते हैं।तो, socket.io कनेक्शन को "websocket कनेक्शन अमान्य" के रूप में बंद कर देता है। –

4

मुझे नहीं लगता कि इसका आपके अपाचे प्रॉक्सी से कुछ लेना देना है, लेकिन कुछ 'quirks' socket.io कैसे एक उप-निर्देशिका पर अनुरोध संभालती है। मेरा जवाब यहां देखें। NGINX configuration to work with Socket.IO

मूल रूप से, आप के बजाय इस कनेक्ट कथन का उपयोग करने की आवश्यकता है:

var socket = io.connect('http://example.com', {resource:'nodejs/socket.io'});

+3

socket.io 1.0 '{resource: ... 'के रूप में' {path: ...' – ceremcem

0

यदि कोई दिलचस्पी है, तो केवल यह मेरे लिए काम करता है।

var myIoSocket = io.connect($location.protocol() + '://' + $location.host(), {path: '/socket.io'}); 

Node.js पक्ष पर कुछ भी बदलने की कोई जरूरत नहीं:

<IfModule mod_proxy.c> 
     <Proxy *> 
     Order allow,deny 
     allow from all 
     </Proxy> 
    </IfModule> 

    RewriteEngine on 

    RewriteCond %{QUERY_STRING} transport=polling 
    RewriteRule /(.*)$ http://localhost:3001/$1 [P] 

    ProxyRequests off 
    ProxyPass /socket.io/ ws://localhost:3001/socket.io/ 
    ProxyPassReverse /socket.io/ ws://localhost:3001/socket.io/ 

क्लाइंट साइड कनेक्शन अपने VirtualHost के अंदर अपने NodeJS बंदरगाह

अपाचे 2.2.14 के साथ पोर्ट 3000 बदलें।

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