2011-08-09 199 views
2

我有服務器與單個IP地址。我有3個nodejs服務。每項服務都有自己的域名。 F.E.nodejs基於域的路由

  • a.company.com,
  • b.company.com,
  • c.company.com

他們寫了不同的人,所以集成到單個應用程序的問題。 我的目標是根據GET/POST請求中提到的主機名,將不同的請求路由到這些不同的服務。 我知道我可以使用NGINX進行這種路由,但我確信它會放慢整個解決方案。我仍然計劃保持2K Req/s的速度。所以我更喜歡留在nodejs的異步世界中。

任何建議?

感謝

+1

爲什麼不把類似的東西在前面nginx的? – jcolebrand

+0

根據我的測試,在2次全程服務中減速。 –

+2

nginx使用異步io進行編程,並且當前是世界上最快的webserver。節點的創建者Ryan Dahl總是將nginx引用爲他在性能方面的目標。無論您將實施哪種反向代理解決方案(並且您將需要一個滿足您的情況的解決方案),由於反向代理,您將失去性能。 –

回答

3

如果你使用的連接,還有的connect.vhost中間件。回購本身有an example of using connect.vhost for subdomains。這個例子可以通過改變主機名來適應不同的域(例如,它可以是foo.combar.com,就像它在本文第一個鏈接中的示例一樣)。

如果你希望你的域名在不同的進程中,我推薦使用node-http-proxy。或者,您可以使用dnode在進程之間劃分一些工作,但仍然有一個進程處理所有的HTTP。將可能消耗大量內存或崩潰的東西移動到單獨的進程中是一個不錯的主意,因此它們不會導致整個服務器停機。

1

我正在使用nodejs TCP代理來執行此操作。所有解釋都在代碼中。

var net = require('net'); 

// your hosts 
var dns = { 
    'localhost' : 8000, 
    'b.host' : 3000, 
    'a.host' : 3001 
}; 

// Create TCP-server 
var server = net.createServer(function(soc){ // soc is socket generated by net.Server 

    // Incoming request processing 
    soc.on('data', function(data){ 


    // Create new socket 
    var client = net.Socket(); 

    // Get host from HTTP headers 
    var re = /[^\n]+(\r\n|\r|\n)host:\w*([^:]+)/i; 
    var host = data.toString('utf-8').match(re); 

    if (! dns[host]) 
    { 
     soc.end('HTTP/1.1 404 Host not found'); 
     return; 
    } 

    // Connect to Node.js application 
    client.connect(dns[host]); 

    // Pause soc for inner socket connection 
    soc.pause(); 

    client.on('connect', function() 
    { 
     // Write request to your node.js application 
     client.write(data.toString('utf-8')); 
    }); 

    client.on('data', function(cdata) 
    { 
     // Return socket to live 
     soc.resume(); 

     // Write client data to browser 
     soc.write(cdata.toString('utf-8')); 
     soc.pipe(soc); 
     soc.end(); 
    }); 

    client.on('end', function(){ 
     client.destroy(); 
    }); 
    }); 
} 
); 

server.on('error', function (err){ 
    // Error processing i just pass whole object 
    console.log(err); 
}); 

server.listen(8088); 
console.log('Server is listening %d\n', 8088);