2013-02-25 100 views
6

पर प्रॉक्सी websockets मैंने पोर्ट 80 पर चल रहे node.js में http प्रॉक्सी लिखा है। मुझे 8080 पर पोर्ट 9 0 9 0 और अपाचे में मानक http यातायात को रीडायरेक्ट करना है। यह है मेरा प्रॉक्सी कोड:node.js: अन्य पोर्ट

httpProxy = require('http-proxy'); 

httpProxy.createServer(function (req, res, proxy) { 
    if (req.url.match(/socket.io/)) { 
     proxy.proxyRequest(req, res, { 
      host: 'localhost', 
      port: 9090 
     }); 
    } else { 
     proxy.proxyRequest(req, res, { 
      host: 'localhost', 
      port: 8080 
     }); 
    } 
}).listen(80); 

सब कुछ काम करता है, लेकिन io.socket xhr-polling पर वापस आ जाता है।

http://localhost/client.htm - falls back to xhr-polling 

file:///C:/.../client9090.htm - still uses websocket 

socket.io एप्लिकेशन पोर्ट 9090 पर चल रहा है, client.htm 80 को जोड़ता है और client9090.htm 9090.

यह एक नोड-http-प्रॉक्सी की तरह लग रहा करने के लिए सीधे जोड़ता है socket.io एप्लिकेशन बनाता है एक्सएचआर-मतदान मोड में काम करने के लिए। ग्राहक क्रोम v.25 है

socket.io एप्लिकेशन कोड

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

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

     socket.on('hi!', function (data) { 
      console.log(data); 
      socket.emit('news'); 
     }); 

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

client.htm कोड

<script src="http://localhost/socket.io/socket.io.js"></script> 
<script> 
    var chat = io.connect('http://localhost') 

    chat.on('connect', function() { 
     chat.emit('hi!'); 
    }); 

    chat.on('news', function() { 
     chat.emit('ahoj',{a:1,b:2}); 
    }); 
</script> 

client9090.htm एक ही है, लेकिन स्थानीय होस्ट स्थानीय होस्ट ने ले ली है: 9090

जैसा कि मैंने कहा था, हर कोई अच्छी तरह से काम करता है, केवल समस्या यह है कि नोड-http-प्रॉक्सी websockets से xhr-polling में वापस आती है। क्या कोई मदद कर सकता है?

httpProxy = require('http-proxy'); 

// added `var server =` here 
var server = httpProxy.createServer(function (req, res, proxy) { 
    if (req.url.match(/socket.io/)) { 
     proxy.proxyRequest(req, res, { 
      host: 'localhost', 
      port: 9090 
     }); 
    } else { 
     proxy.proxyRequest(req, res, { 
      host: 'localhost', 
      port: 8080 
     }); 
    } 
}).listen(80); 

// added upgrade listener section here: 
server.on('upgrade', function (req, socket, head) { 
    server.proxy.proxyWebSocketRequest(req, socket, head); 
}); 

हालांकि, उपयोग आप ऊपर वर्णित के लिए:

उत्तर

2
https://npmjs.org/package/http-proxy के अनुसार

, जब httpProxy.createServer() के लिए एक कॉलबैक जोड़ने, तो आप मैन्युअल रूप से प्रॉक्सी 'उन्नयन' घटनाओं, तो कुछ इस तरह करने के लिए है , आपको कॉलबैक फ़ंक्शन की भी आवश्यकता नहीं है - आप बस इस तरह कुछ आसानी से कर सकते हैं:

httpProxy = require('http-proxy'); 

var options = { 
    pathnameOnly: true, 
    router: { 
    '/wiki': '127.0.0.1:8001', 
    '/blog': '127.0.0.1:8002', 
    '/api': '127.0.0.1:8003' 
    } 
} 

var proxyServer = httpProxy.createServer(options); 
proxyServer.listen(80);