nodejs 实现反向代理

要说到反向代理,很多人第一时间想到的是nginx,没错,在这个领域做得最好的,我觉得应该算是nginx,为什么想用nodejs来实现?处于一种研究的心态和让反向代理更好的为自己服务,毕竟要修改nginx还需要c c++等这些方面的知识,而且我对nodejs更为熟悉一点(说白了就是不懂C++…..)。

说到反向代理,那首先要明白什么是反向代理,我们一般用代理就是我要访问一个网站,但是直接访问不了,然后通过代理服务器访问,然后代理服务器再将信息返回给我,代理的这个行为是发生在客户端。反向代理则刚好相反,代理服务接到了各种网络上的各种请求(比如我访问网址),然后根据请求查找到内部服务器,再将信息返回到请求的一方(我),代理的行为是发生在服务端。其实这两者发生的情景是不一样的,正向代理通常是我们要访问一个国外网站,但是直接访问不了,要经过代理服务器来实现,而反向代理通常是用来管理内部的多台服务器,实现负载均衡等。

那么用了方向代理就不得不说虚拟路径,大中型的网站中的静态资源是分离出来的,如果通过像apache/tomcat/iis等这些服务器来访问静态资源,那么效率会降低不少,最好的方法就是直接读取,所以用到了虚拟路径,虚拟路径的作用是你访问a.com/res/index.js的时候,直接指向服务器目录下的res/index.js,直接进行硬盘的IO读写,绕过了动态服务器的解析,那么实现反向代理就是从这个静态资源的分离开始,毕竟前端最关心的还是自己的静态资源领地。

那么经过上面的分析,我们可以通过nodejs中的http-proxy模块来实现,在使用这个之前要做的是对请求类型的一些判断,即请求Js/css/jpg等这些文件时,返回的response信息类型是什么,于是有了下面的代码(也是我自己写的一个content-type模块)content-type.js:

/*
	content type
	by subying [email protected]
	根据后缀 转换 content-type
*/

var getContentType = function(ext){
	var contentType = ‘‘;
	switch(ext){
		case ".html":
			contentType= "text/html";
			break;
		case ".js":
			contentType="text/javascript";
			break;
		case ".css":
			contentType="text/css";
			break;
		case ".gif":
			contentType="image/gif";
			break;
		case ".jpg":
			contentType="image/jpeg";
			break;
		case ".png":
			contentType="image/png";
			break;
		case ".ico":
			contentType="image/icon";
			break;
		default:
			contentType="application/octet-stream";
	}

	return contentType;
};

module.exports = getContentType;

有了这个还需要用到nodejs里面的一个模块:http-proxy,npm地址为 https://www.npmjs.org/package/http-proxy。那么前面有说过,将静态资源分离,就会用到虚拟目录,要怎么判断它是静态资源呢?这就是我为什么要用nodejs实现反向代理的原因了,因为我可以自己自由的定义,就是一个if的问题而已。本人习惯将静态资源放到了一个res的文件夹里,所以我只要判断请求里面存在’/res/’这个目录,我就知道是请求静态资源了。判断是请求静态资源后,再找到项目的物理路径比如’E:\teset\res’,再用fs模块读取出来,返回到客户端。那么其他的请求就通过本地的其他服务器来实现。本例中用到的代理方法是http-proxy的web方法,http-proxy更多的用法可以去查阅上面给出来的npm地址。

/*
	http-proxy
*/
var http = require(‘http‘)
    ,httpProxy = require(‘http-proxy‘)  //http-proxy
    ,proxy = httpProxy.createProxyServer({})
    ,fs = require(‘fs‘)
    ,path = require(‘path‘)
    ,getConType = require(‘./content-type‘)//自己定义  根据后缀转换Content-Type
;

var server = http.createServer(function(req, res) {
	var _url = req.url //获取请求的url
		,_file
		,_localPath
		,_localFile
		,_ext
		,_stream
	;
	if(_url.indexOf(‘/res/‘)>-1){
		_file = _url.replace(/\?.*/ig,‘‘);
		_ext = path.extname(_file); // 文件扩展

		//判断是否为js文件
		if(_ext === ‘.js‘){
			_file = _file.replace(‘res/js/‘,‘res/src_js/‘);
		}

		//转换成本地路径
		_localPath = ‘E:/web/angularjs/‘;
		_localFile = _localPath+_file;

		//判断文件是否存在
		if(fs.existsSync(_localFile)){//如果文件存在
			res.writeHead(200, {"Content-Type": getConType(_ext) });

			_stream = fs.createReadStream(_localFile, {flags : "r", encoding : null});//只读模式 读取文件内容
			_stream.on(‘error‘,function(){//如果读取错误 返回404
				res.writeHead(404, {"Content-Type": "text/html"});
				res.end("<h1>404 Read Error</h1>");
			});

			_stream.pipe(res);//连接文件流和http返回流的管道,用于返回实际Web内容

			_stream.on(‘end‘,function(){
				_stream = null;
			})

		}else{//返回404错误
			res.writeHead(404, {"Content-Type": "text/html"});
			res.end("<h1>404 Not Found</h1>");
		}

	}else{
		proxy.web(req, res, { target: ‘http://127.0.0.1:81‘ });
	}

});

console.log("listening on port 80")
server.listen(80);

总结来说,实现反向代理的静态资源分离,首先是判断request来判断是否请求静态文件,如果是请求静态文件,就找到项目下的具体文件,直接用fs读取,如果不是请求静态文件那么就用proxy.web来请求内部的服务器(我的是127.0.0.1:81)来实现。希望给学习nodejs实现反向代理的朋友一些帮助,高手莫笑,
,正式的项目中还是用nginx比较好!

时间: 2024-10-14 12:45:45

nodejs 实现反向代理的相关文章

IIS 下 部署nodejs 使用反向代理

目标服务器:targetServer 配置反向代理的服务器:reveseProxServer iis应该是iis7及以上版本,才可以. 1.确定最终访问的网址:比如www.baidu.com  .www.jb51.net等等. 当然你也可以自己在targetServer部署自己的程序,在此为了示范,我在targetServer上部署了2个,用的8088端口,程序分别是: http://targetServer:8088/Auditsys/Default.htm http://targetServ

使用Nodejs进行反向代理

在实际工程开发中,会有前后端分离的需求. 为了平滑的完成前端请求到后端各个独立服务,需要一个中间件实现请求转发的功能,利用Nginx可以实现,在这里,使用nodejs实现一个反向代理服务器. 实际前端项目背景是node+express做前端路由,提供页面的基础渲染和请求转发. 后端使用java springboot开发多个微服务(这里没有使用spring cloud Eureka 做服务管理与API协调),每个服务的IP一致,端口不一致. 实验环境:nodejs+express端口是3001,启

关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10)

反向代理也是一种可以帮助实现网站静态化的重要技术,今天我就来讲讲反向代理这个主题.那么首先我们要了解下什么是反向代理.和反向代理相对应的是正向代理,正向代理也就是我们常说的代理服务,正向代理是非常常见的,例如在某些公司里我们想使用互联网,那么我们就得在浏览器里设置一个代理服务器,通过代理服务器我们才能正常使用互联网,而这个代理服务器就是一个正向代理服务器.正向代理更加让人熟悉的使用场景估计还是在FQ技术里的使用,我们使用一个放置在国外的代理服务器来访问那些在国内无法正常访问的网站,这其实也是在使

【转】关于大型网站技术演进的思考(十八)--网站静态化处理—反向代理(10)

反向代理也是一种可以帮助实现网站静态化的重要技术,今天我就来讲讲反向代理这个主题.那么首先我们要了解下什么是反向代理.和反向代理相对应的是正向代理,正向代理也就是我们常说的代理服务,正向代理是非常常见的,例如在某些公司里我们想使用互联网,那么我们就得在浏览器里设置一个代理服务器,通过代理服务器我们才能正常使用互联网,而这个代理服务器就是一个正向代理服务器.正向代理更加让人熟悉的使用场景估计还是在FQ技术里的使用,我们使用一个放置在国外的代理服务器来访问那些在国内无法正常访问的网站,这其实也是在使

Nodejs绑定域名与反向代理

所有的Demo都不是完整的程序,所有未上线的程序都仅仅是个Demo; Nodejs作为Web开发的后起之秀,在现在的国内环境下,虽比不上PHP的火热,没有.net那么广大的群众基础,盖不过Java的高大上,但Nodejs基于谷歌V8引擎的极速,异步IO与事件模型,无疑将是Web开发的重大革新:我是一个小前端,自从知道Nodejs,就觊觎其好久,翘首以盼终于在业余用Express4.x断断续续做了一个个人博客: 为了让我的博客不只是一个躺在本地的Demo,我买了个服务器,搭建好环境,选好日子,准备

腾讯云(ubuntu)下安装 nodejs + 实现 Nginx 反向代理

本文将介绍如何给腾讯云上的 Ubuntu Server 12.04 LTS 64位主机安装 node 及 nginx,并简单配置反向代理. 笔者在整个安装过程中遇到不少麻烦(不赘述),如果你希望少踩坑,可以按本文的步骤进行安装部署. 一. 新版 nodejs 安装 这里强烈推荐使用 nvm (Node版本管理器),其它方式的安装或多或少都有些问题. 具体步骤如下: 1. 通过 git 指令下载nvm 执行指令如下,我们把nvm下载到 /root/git/ 中去(记得要先安装 git): [[em

【转】NodeJS on Nginx: 使用nginx反向代理处理静态页面

最近OurJS后台已经从纯node.js迁移到了Nginx+NodeJS上来了,感觉性能提升了不少,特与大家分享. Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日.其将源代码以类BSD许可证的形式发布,因它的稳定性.丰富的功能集.示例配置文件和低系统

nginx做nodejs(express等通用)反向代理

首先配置环境nginx+nodejs...(没有请看我的其他文章,此处不重复) cd 到nginx的site-available目录 ubuntu的在 cd /etc/nginx/site-available/ 创建一个server文件 sudo touch testServer 然后可以copy下面的代码进去了(勤劳的coder可以手写一遍的哦) http{ keepalive 65; #超时 gzip on; #是否开启压缩模块 gzip_comp_level 6; #压缩比例 1-9 gz

【NodeJs】Linux安装NodeJs并配合Nginx实现反向代理

Linux安装NodeJs并配合Nginx实现反向代理 NodeJs 是什么 Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V8引 擎执行Javascript的速度非常快,性能非常好. Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好. 本地安装(OS X) 版本选择 V4.4.4,长期支持版本,成熟可靠 V6.2.0 稳定版本,最新特性 这里我还是倾向于使用最新的版本~ 下载安装包