拋棄Nginx使用nodejs做反向代理服務(wù)器
時(shí)下不少場(chǎng)景,都是申請(qǐng)一個(gè) VPS 主機(jī)來托管運(yùn)行 Web 項(xiàng)目的,小弟我也不例外,購(gòu)買了一個(gè)小型的 Win 03 VPS 使用著。在使用的過程中,面臨一個(gè)問題,就是同一類型的服務(wù)端環(huán)境還好——但如果是一個(gè) PHP、一個(gè) ASP、 一個(gè) JSP 的三種類型的服務(wù)端項(xiàng)目并存著,該怎么分配唯一的 80 端口呢?因?yàn)樯虡I(yè) WWW 網(wǎng)站的話,往往只能占用 80 端口,——當(dāng)然,如果只是做服務(wù)的話,如接口之類的,使用其他端口就不會(huì)與 80 端口沖突了。許多開發(fā)者都會(huì)面臨到 80 端口這個(gè)問題,并且實(shí)際情況會(huì)受到成本的限制。因?yàn)閱为?dú)為一個(gè)項(xiàng)目就買一個(gè) VPS,也不太經(jīng)濟(jì)、不太合算,管理起來也不方便。于是,我們就應(yīng)該好好考慮一下,怎么在提供一個(gè) 80 端口的情況下,分發(fā)到多種服務(wù)端那里去,讓不同的主機(jī)執(zhí)行各自的 Web 項(xiàng)目。
親,那這項(xiàng)需求我們說可以實(shí)現(xiàn)嗎?是的,這并不是什么“神奇的技術(shù)”,也不是什么復(fù)雜的技術(shù)。不知你是否有了解,網(wǎng)絡(luò)服務(wù)中的“反向代理(Reverse Proxy)”,其中的一個(gè)功能就是可以完成端口的分發(fā)的。我們不妨以域名為路由分發(fā):凡是 AA.com 域名請(qǐng)求的,分發(fā)到 PHP 82 端口執(zhí)行;凡是 BB.com 域名請(qǐng)求的,分發(fā)到 ASP 83 端口執(zhí)行;…… 如此類推。當(dāng)然這里的端口只說說明用而已,您可以任意配置,反正就是從 80 端口接收回來的請(qǐng)求,先作一次處理,進(jìn)而分發(fā)。反向代理,通俗地講,就是左手轉(zhuǎn)右手而已。
每當(dāng)提起反向代理器,人們通常一想到的就是 Nginx,但是今天我們暫時(shí)忽略大名鼎鼎的 Nginx,采用同樣也是使用單線程、事件循環(huán)的服務(wù)端小弟——Nodejs 來達(dá)成。首先 Node 采用 JS 作服務(wù)端編程,而不是 Nginx 寫配置或 Lua,比較符合我的味口,其次自己對(duì) Node 也比較熟悉,配置各方面什么的更為順手。
完成該項(xiàng)功能的是 node-http-proxy 包。下載、安裝請(qǐng)鍵入:
npm install http-proxy
安裝完畢后,新建一個(gè) proxy.js 文件,輸入:
var http = require('http'), httpProxy = require('http-proxy'); // 新建一個(gè)代理 Proxy Server 對(duì)象 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.'); }); // 另外新建一個(gè) HTTP 80 端口的服務(wù)器,也就是常規(guī) Node 創(chuàng)建 HTTP 服務(wù)器的方法。 // 在每次請(qǐng)求中,調(diào)用 proxy.web(req, res config) 方法進(jìn)行請(qǐng)求分發(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);
若說使用代理服務(wù)器的代價(jià),可能就是會(huì)比不用消耗多的資源,消耗多的 CPU 運(yùn)算罷了。
使用問題:不能指定文件夾 proxy.web(req, res, { target: 'http://jb51.net:81/foo/' });
- Nginx服務(wù)器的反向代理proxy_pass配置方法講解
- Nginx作為反向代理時(shí)傳遞客戶端IP的設(shè)置方法
- nginx 作為反向代理實(shí)現(xiàn)負(fù)載均衡的例子
- Nginx服務(wù)器作反向代理實(shí)現(xiàn)內(nèi)部局域網(wǎng)的url轉(zhuǎn)發(fā)配置
- Nginx反向代理websocket配置實(shí)例
- Nginx實(shí)現(xiàn)靜態(tài)資源的反向代理實(shí)例
- Nginx實(shí)戰(zhàn)之反向代理WebSocket的配置實(shí)例
- nginx https反向代理tomcat的2種實(shí)現(xiàn)方法
- Linux部署Nginx實(shí)現(xiàn)反向代理的方法步驟
相關(guān)文章
node實(shí)現(xiàn)爬蟲的幾種簡(jiǎn)易方式
這篇文章主要給大家介紹了關(guān)于node實(shí)現(xiàn)爬蟲的幾種簡(jiǎn)易方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用node具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08websocket+node.js實(shí)現(xiàn)實(shí)時(shí)聊天系統(tǒng)問題咨詢
最近新學(xué)習(xí)websocket,做了一個(gè)實(shí)時(shí)聊天。用Node.js搭建的服務(wù):serevr.js. 兩個(gè)相互通信頁面:client.html 和server.html 但是就是有很多問題,下面通過本文給大家分享下2017-05-05nodejs中操作mysql數(shù)據(jù)庫(kù)示例
這篇文章主要介紹了nodejs中操作mysql數(shù)據(jù)庫(kù)示例,本文演示了如何在NodeJS中創(chuàng)建創(chuàng)建mysql連接、mysql數(shù)據(jù)庫(kù)、插入數(shù)據(jù)、查詢數(shù)據(jù)等功能,需要的朋友可以參考下2014-12-12Node.js連接MongoDB數(shù)據(jù)庫(kù)產(chǎn)生的問題
Node.js是使用JavaScript 編寫的可以運(yùn)行在服務(wù)端的JS語言。node.js和mongodb碰撞會(huì)產(chǎn)生一系列問題,下面通過本文給大家分享Node.js連接MongoDB數(shù)據(jù)庫(kù),需要的的朋友參考下2017-02-02node.js根據(jù)不同請(qǐng)求路徑返回不同數(shù)據(jù)詳解流程
本篇文章介紹了我在開發(fā)過程中發(fā)現(xiàn)的一個(gè)小問題,就是node.js如何能夠根據(jù)不同的請(qǐng)求路徑來返回得到不同數(shù)據(jù),通讀本篇對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-10-10