時下不少場景,都是申請一個 VPS 主機來托管運行 Web 項目的颜说,小弟我也不例外迎吵,購買了一個小型的 Win 03 VPS
使用著。在使用的過程中桑逝,面臨一個問題,就是同一類型的服務端環(huán)境還好——但如果是一個 PHP俏让、一個 ASP楞遏、 一個 JSP
的三種類型的服務端項目并存著,該怎么分配唯一的 80 端口呢首昔?因為商業(yè) WWW 網(wǎng)站的話寡喝,往往只能占用 80
端口,——當然勒奇,如果只是做服務的話预鬓,如接口之類的,使用其他端口就不會與 80 端口沖突了赊颠。許多開發(fā)者都會面臨到 80
端口這個問題格二,并且實際情況會受到成本的限制劈彪。因為單獨為一個項目就買一個
VPS,也不太經(jīng)濟蟋定、不太合算粉臊,管理起來也不方便。于是驶兜,我們就應該好好考慮一下扼仲,怎么在提供一個 80
端口的情況下,分發(fā)到多種服務端那里去抄淑,讓不同的主機執(zhí)行各自的 Web 項目屠凶。
親,那這項需求我們說可以實現(xiàn)嗎肆资?是的矗愧,這并不是什么“神奇的技術”,也不是什么復雜的技術郑原。不知你是否有了解唉韭,網(wǎng)絡服務中的“反向代理(Reverse
Proxy)”,其中的一個功能就是可以完成端口的分發(fā)的犯犁。我們不妨以域名為路由分發(fā):凡是 AA.com 域名請求的属愤,分發(fā)到 PHP 82
端口執(zhí)行;凡是 BB.com 域名請求的酸役,分發(fā)到 ASP 83 端口執(zhí)行住诸;……
如此類推。當然這里的端口只說說明用而已涣澡,您可以任意配置贱呐,反正就是從 80
端口接收回來的請求,先作一次處理入桂,進而分發(fā)奄薇。反向代理,通俗地講抗愁,就是左手轉(zhuǎn)右手而已惕艳。
每當提起反向代理器,人們通常一想到的就是 Nginx驹愚,但是今天我們暫時忽略大名鼎鼎的
Nginx,采用同樣也是使用單線程劣纲、事件循環(huán)的服務端小弟——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 端口的服務器养泡,也就是常規(guī) Node 創(chuàng)建 HTTP 服務器的方法。
// 在每次請求中奈应,調(diào)用 proxy.web(req, res config) 方法進行請求分發(fā)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://phpstudy.net:81/foo/' });