Node——用http-proxy 作反向代理服務器

時下很多場景,都是申請一個 VPS 主機來託管運行 Web 項目的,小弟我也不例外——購買了一個小型的 CentOS VPS 使用着。在使用的過程當中,面臨一個問題,就是同一類型的服務端環境還好——但若是是一個 PHP、一個 ASP、 一個 JSP 的三種類型的服務端項目並存着,該怎麼分配惟一的 80 端口呢?由於商業 WWW 網站的話,每每只能佔用 80  端口,——固然,若是隻是作服務的話,如接口服務之類的,使用了其餘端口就不會與 80 端口衝突。所以,許多開發者都會面臨到 80 端口這個問題,而且實際狀況會受到成本的限制。若是爲一個項目就單獨買一個 VPS 的話,着實不太經濟、不太合算,管理起來也不方便。這樣的話,咱們就應該好好考慮一下,怎麼在提供一個 80 端口的狀況下,分發到多種服務端那裏去,最終讓不一樣的主機執行各自的 Web 項目。javascript

親,那麼這項需能夠實現的嗎?是的,這並非什麼「神奇的技術」,也不是什麼複雜的技術。不知你是否有了解,網絡服務中的「反向代理(Reverse Proxy)」,其中的一個功能就是能夠完成端口的分發的。咱們不妨以域名爲路由分發:凡是 AA.com 域名請求的,分發到 PHP 82 端口執行;凡是 BB.com 域名請求的,分發到 ASP 83 端口執行;…… 如此類推。固然這裏的端口只說說明用而已,您能夠任意配置,反正就是從 80 端口接收回來的請求,先做一次處理,進而分發。反向代理,通俗地講,就是左手轉右手而已。php

每當提起反向代理器,人們一般一想到的就是 Nginx,可是今天咱們暫時忽略大名鼎鼎的 Nginx,採用一樣也是使用單線程、事件循環的服務端小弟——Node 來達成。首先 Node 採用 JS 做服務端編程,而不是 Nginx 寫配置或 Lua,比較符合個人味口,其次本身對 Node 也比較熟悉,配置各方面什麼的更爲順手。html

完成該項功能的是 node-http-proxy 包。下載、安裝請鍵入:前端

npm install http-proxy  

  

安裝完畢後,新建一個 proxy.js 文件,輸入:java

 

var http = require('http'), httpProxy = require('http-proxy');

// 新建一個代理 Proxy Server 對象
var proxy = httpProxy.createProxyServer({});

// 捕獲異常
proxy.on('error', function (err, req, res) {
  res.writeHead(500, {
    'Content-Type': 'text/plain'
  });
  res.end('Something went wrong. And we are reporting a custom error message.');
});

// 另外新建一個 HTTP 80 端口的服務器,也就是常規 Node 建立 HTTP 服務器的方法。
// 在每次請求中,調用 proxy.web(req, res config) 方法進行請求分發
var server = require('http').createServer(function(req, res) {
  // 在這裏能夠自定義你的路由分發
  var host = req.headers.host, ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
  console.log("client ip:" + ip + ", host:" + host);
  
  switch(host){
    case 'aaaa.com':
    case 'bbs.aaaa.com':
        proxy.web(req, res, { target: 'http://xyd.bbbbb.com:82' });
    break;
    case 'vps.cccc.com':
        proxy.web(req, res, { target: 'http://xyd.bbbbb.com:8080' });
    break;
    case 'dddd.com':
    case 'www.dddd.com':
        proxy.web(req, res, { target: 'http://localhost:81' });
    break;
    case 'eeeeee.com.cn':
    case 'www.eeee.com.cn':
        proxy.web(req, res, { target: 'http://eeeee.com.cn:8082' });
    break;
    default:
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        res.end('Welcome to my server!');
  }
});

console.log("listening on port 80")
server.listen(80);

  

除此以外,還能夠利用 node-http-proxy 作負載均衡、Websocket (使用 proxy.ws() 語法)等相關的工做。node

若說使用代理服務器的代價,可能就是會比不用消耗多的資源,消耗多的 CPU 運算罷了。git

使用問題:不能指定文件夾 proxy.web(req, res, { target: 'http://housecn.com.cn:81/foo/' });github

能夠在一個主機上配置多個網站了:2015--5-28:web

switch(host){  
        case '5222222.com':  
        case 'www.5222222.com':
			if(req.url.indexOf('/grand') != -1){
				proxy.web(req, res, { target: 'http://127.0.0.1:8081' });  
			}else{
				res.writeHead(302, {
				//  'Location': 'http://new.5222222.com:8080/grand/'
				  'Location': 'http://5222222.com/grand/'
				
				});
				res.end();
			}
          break;
  ....
}

  

 

資源:npm

相關文章
相關標籤/搜索