時下不少場景,都是申請一個VPS 主機來託管運行Web 項目的,小弟我也不例外,購買了一個小型的Win 03 VPS 使用著。在使用的過程中,面臨一個問題,就是同一類型的服務端環境還好――但如果是一個PHP、一個ASP、 一個JSP 的三種類型的服務端項目並存著,該怎麼分配唯一的80 端口呢?因為商業WWW 網站的話,往往只能佔用80 端口,――當然,如果只是做服務的話,如接口之類的,使用其他端口就不會與80 端口衝突了。許多開發者都會面臨到80 端口這個問題,並且實際情況會受到成本的限制。因為單獨為一個項目就買一個VPS,也不太經濟、不太合算,管理起來也不方便。於是,我們就應該好好考慮一下,怎麼在提供一個80 端口的情況下,分發到多種服務端那裡去,讓不同的主機執行各自的Web 項目。
親,那這項需求我們說可以實現嗎?是的,這並不是什麼“神奇的技術”,也不是什麼複雜的技術。不知你是否有了解,網絡服務中的“反向代理(Reverse Proxy)”,其中的一個功能就是可以完成端口的分發的。我們不妨以域名為路由分發:凡是AA.com 域名請求的,分發到PHP 82 端口執行;凡是BB.com 域名請求的,分發到ASP 83 端口執行;…… 如此類推。當然這裡的端口只說說明用而已,您可以任意配置,反正就是從80 端口接收回來的請求,先作一次處理,進而分發。反向代理,通俗地講,就是左手轉右手而已。
每當提起反向代理器,人們通常一想到的就是Nginx,但是今天我們暫時忽略大名鼎鼎的Nginx,採用同樣也是使用單線程、事件循環的服務端小弟――Nodejs 來達成。首先Node 採用JS 作服務端編程,而不是Nginx 寫配置或Lua,比較符合我的味口,其次自己對Node 也比較熟悉,配置各方面什麼的更為順手。
完成該項功能的是node-http-proxy 包。下載、安裝請鍵入:
npm install http-proxy
安裝完畢後,新建一個proxy.js 文件,輸入:
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) 方法進行請求分發Create your custom server and just call `proxy.web()` to proxy// a web request to the target passed in the options// also you can use `proxy.ws()` to proxy a websockets request//var server = require('http').createServer(function(req, res) { // You can define here your custom logic to handle the request // and then proxy the request. var host = req.url; host = url.parse(host); host = host.host; console.log("host:" + req.headers.host); console.log("client ip:" + (req.headers['x-forwarded-for'] || req.connection.remoteAddress)); proxy.web(req, res, { target: 'http://localhost:8080' });});console.log("listening on port 80")server.listen(80);若說使用代理服務器的代價,可能就是會比不用消耗多的資源,消耗多的CPU 運算罷了。
使用問題:不能指定文件夾proxy.web(req, res, { target: 'http://VeVB.COm:81/foo/' });