DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> 關於JavaScript >> 拋棄Nginx使用nodejs做反向代理服務器
拋棄Nginx使用nodejs做反向代理服務器
編輯:關於JavaScript     

時下不少場景,都是申請一個 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://cnblogs.com:81/foo/' });

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved