時下很多場景,都是申請一個 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