抛弃Nginx使用nodejs做反向代理服务器


Posted in NodeJs onJuly 17, 2014

时下不少场景,都是申请一个 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://3water.com:81/foo/' });

NodeJs 相关文章推荐
nodejs的require模块(文件模块/核心模块)及路径介绍
Jan 14 NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 NodeJs
nodejs的10个性能优化技巧
Jul 15 #NodeJs
提高NodeJS中SSL服务的性能
Jul 15 #NodeJs
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
Jul 15 #NodeJs
nodejs 实现模拟form表单上传文件
Jul 14 #NodeJs
14款NodeJS Web框架推荐
Jul 11 #NodeJs
基于promise.js实现nodejs的promises库
Jul 06 #NodeJs
我的NodeJs学习小结(一)
Jul 06 #NodeJs
You might like
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
Javascript学习笔记二 之 变量
2010/12/15 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
中止javascript执行的方法
2014/02/14 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
2018/12/04 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Python如何telnet到网络设备
2021/02/18 Python
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
耐克中国官方商城:Nike中国
2018/10/18 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
党校自我鉴定范文
2013/10/02 职场文书
总经理秘书的岗位职责
2013/12/27 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
检讨书怎么写
2015/05/07 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书