抛弃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的url截取模块url-extract的使用实例
Nov 18 NodeJs
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
Mar 18 NodeJs
nodejs下打包模块archiver详解
Dec 03 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
nodejs文件夹深层复制功能
Sep 03 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
学习jquery之一
2007/04/27 Javascript
javascript replace方法与正则表达式
2008/02/19 Javascript
JS中的substring和substr函数的区别说明
2013/05/07 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
原生js实现碰撞检测
2020/03/12 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
Python实现SMTP邮件发送
2020/06/16 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
美国最受欢迎的童装品牌之一:The Children’s Place
2016/07/23 全球购物
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
平民服装店创业计划书
2014/01/17 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
离婚案件答辩状
2015/05/22 职场文书
会议室管理制度范本
2015/08/06 职场文书
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android