抛弃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的timers模块
Dec 22 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
nodejs个人博客开发第二步 入口文件
Apr 12 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 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
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
Ext 今日学习总结
2010/09/19 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
js选项卡的实现方法
2015/02/09 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
详解如何在angular2中获取节点
2017/11/23 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
10 种最常见的 Javascript 错误(频率最高)
2018/02/08 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
python 中的list和array的不同之处及转换问题
2018/03/13 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
将python文件打包成EXE应用程序的方法
2019/05/22 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
HearthSong官网:儿童户外玩具、儿童益智玩具
2017/10/16 全球购物
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
解除合同协议书
2014/04/17 职场文书
区级文明单位申报材料
2014/05/15 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
买房协议书范本
2014/10/23 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
督导岗位职责
2015/02/04 职场文书
李白故里导游词
2015/02/12 职场文书
英语读书笔记
2015/07/02 职场文书
办公用品管理制度
2015/08/04 职场文书
python Polars库的使用简介
2021/04/21 Python
Python一行代码实现自动发邮件功能
2021/05/30 Python
Python Matplotlib绘制条形图的全过程
2021/10/24 Python