用 nodejs 做反向代理服务器

11 篇文章 0 订阅
 

用 nodejs 做反向代理服务器

标签: nodejs
  12829人阅读  评论(4)  收藏  举报
  分类:
 

时下不少场景,都是申请一个 VPS 主机来托管运行 Web 项目的,小弟我也不例外——购买了一个小型的 CentOS 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,采用同样也是使用单线程、事件循环的服务端小弟——Node 来达成。首先 Node 采用 JS 作服务端编程,而不是 Nginx 写配置或 Lua,比较符合我的味口,其次自己对 Node 也比较熟悉,配置各方面什么的更为顺手。

完成该项功能的是 node-http-proxy 包。下载、安装请键入:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. npm install http-proxy  
安装完毕后,新建一个 proxy.js 文件,输入:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var http = require('http'), httpProxy = require('http-proxy');  
  2.   
  3. // 新建一个代理 Proxy Server 对象  
  4. var proxy = httpProxy.createProxyServer({});  
  5.   
  6. // 捕获异常  
  7. proxy.on('error'function (err, req, res) {  
  8.   res.writeHead(500, {  
  9.     'Content-Type''text/plain'  
  10.   });  
  11.   res.end('Something went wrong. And we are reporting a custom error message.');  
  12. });  
  13.   
  14. // 另外新建一个 HTTP 80 端口的服务器,也就是常规 Node 创建 HTTP 服务器的方法。  
  15. // 在每次请求中,调用 proxy.web(req, res config) 方法进行请求分发  
  16. var server = require('http').createServer(function(req, res) {  
  17.   // 在这里可以自定义你的路由分发  
  18.   var host = req.headers.host, ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;  
  19.   console.log("client ip:" + ip + ", host:" + host);  
  20.     
  21.   switch(host){  
  22.     case 'aaaa.com':  
  23.     case 'bbs.aaaa.com':  
  24.         proxy.web(req, res, { target: 'http://xyd.bbbbb.com:82' });  
  25.     break;  
  26.     case 'vps.cccc.com':  
  27.         proxy.web(req, res, { target: 'http://xyd.bbbbb.com:8080' });  
  28.     break;  
  29.     case 'dddd.com':  
  30.     case 'www.dddd.com':  
  31.         proxy.web(req, res, { target: 'http://localhost:81' });  
  32.     break;  
  33.     case 'eeeeee.com.cn':  
  34.     case 'www.eeee.com.cn':  
  35.         proxy.web(req, res, { target: 'http://eeeee.com.cn:8082' });  
  36.     break;  
  37.     default:  
  38.         res.writeHead(200, {  
  39.             'Content-Type''text/plain'  
  40.         });  
  41.         res.end('Welcome to my server!');  
  42.   }  
  43. });  
  44.   
  45. console.log("listening on port 80")  
  46. server.listen(80);  

除此之外,还可以利用 node-http-proxy 做负载均衡、Websocket (使用 proxy.ws() 语法)等相关的工作。

若说使用代理服务器的代价,可能就是会比不用消耗多的资源,消耗多的 CPU 运算罢了。

使用问题:不能指定文件夹 proxy.web(req, res, { target: 'http://housecn.com.cn:81/foo/' });

可以在一个主机上配置多个网站了:2015--5-28:

[javascript]  view plain  copy
  1. switch(host){    
  2.         case '5222222.com':    
  3.         case 'www.5222222.com':  
  4.             if(req.url.indexOf('/grand') != -1){  
  5.                 proxy.web(req, res, { target: 'http://127.0.0.1:8081' });    
  6.             }else{  
  7.                 res.writeHead(302, {  
  8.                 //  'Location': 'http://new.5222222.com:8080/grand/'  
  9.                   'Location''http://5222222.com/grand/'  
  10.                   
  11.                 });  
  12.                 res.end();  
  13.             }  
  14.           break;  
  15.   ....  
  16. }  

资源:

2
0
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
同一ip(都是80端口)可以绑定无数个域名 配置简单 里面包含一个配置文档:配置文档.doc 看一遍 大部分人都会设置了。 内容如下: NGNIX配置文档 1.解压文件到相应文件夹下(我解压到D:/下) (这里是图片) 目录结构如上 2.在D:\nginx\目录下用记事本新建一个文本文档改名为 proxy.conf。 proxy.conf里面的内容格式如下: server { listen 80; server_name www.*****.com; location / { proxy_pass http://192.168.45.1:8045; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } (完整拷贝上面的内容server_name www.*****.com; 这里面的域名即是来访域名 proxy_pass http://192.168.45.1:8045; 这里面的域名(http://192.168.45.1:8045)即是内部跳转的地址,将该内容拷贝多份实现不同来访域名的跳转) 如下: 3.找到D:\nginx\conf下nginx.conf文件用记事本打开 在文段末尾大括号前加上 include proxy.conf;(就是加载刚刚新建的那个文件(注意路径)) 4.进入cmd 进入D盘: d: 进到nginx文件夹下:cd nginx 启动nginx.exe:start nginx Cmd窗口会闪一下 进程里面会多了个 浏览器里面输入:http://127.0.0.1 将出现: Nginx的欢迎界面。 注: nginx -s stop // 停止nginx nginx -s reload // 重新加载配置文件 nginx -s quit // 退出nginx nginx-1.3.9.zip(这个版本) (1分钟搞定只是夸张说法啦,给你增加信心的啦,真正的操作起来,因人而异,没搞定的耐心再试试,自己xp系统亲测成功,不喜欢的无拍砖哦,实在搞不定的加我qq852208555 一起研究下 谢谢!)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值