首頁 > web前端 > js教程 > 拋棄Nginx使用nodejs做反向代理伺服器_node.js

拋棄Nginx使用nodejs做反向代理伺服器_node.js

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-05-16 16:41:51
原創
1856 人瀏覽過

時下不少場景,都是申請一個 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 套件。下載、安裝請鍵入:

1

npm install http-proxy

登入後複製

安裝完畢後,新建一個 proxy.js 文件,輸入:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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://jb51.net:81/foo/' });

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
node.js是用來做什麼的
來自於 1970-01-01 08:00:00
0
0
0
新手學習vue和node.js的困惑
來自於 1970-01-01 08:00:00
0
0
0
javascript - node.js i/o優化
來自於 1970-01-01 08:00:00
0
0
0
關於node.js,各位來指點下,謝謝哈( ⊙ o ⊙ )
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板