用nodejs搭建一个本地反向代理环境。
发布在nodejs 边角料2014年3月27日view:19949
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

调试线上代码的时候,我们经常遇到的一个问题就是 本地一套环境,线上一套环境,本地没有的文件用线上的这种需求。我简单来说下使用nodejs如何做到。

先说下不用nodejs我们怎么做,工具比如fiddler,代理服务器比如nproxy之类都可以完成。但是很麻烦啊,要配置规则还要安装工具,改代理端口之类的,好麻烦,或者用apache或者nginx编写复杂的rewrite规则,apache下还要写抓反向代理的脚本等等。。好麻烦。

所以今天分享一下我在项目中是如何解决的。

首先,你本地需要有一个server。

我选择node-static这个包,很快速的就完成了一个本地server的配置,看代码或者官方文档吧。

var nodeStatic = require('node-static').Server;
var request = require("request");
var dns = require("dns");
var fileServer = new nodeStatic("./");
var http = require("http");

var httpServer = http.createServer(function(req, res) {
      req.addListener('end', function() {
        fileServer.serve(req, res, function(err, result) {
            if (err && (err.status === 404)) {
            //本地没有文件访问线上,透明server
            dns.resolve4(req.headers.host,function(err,addresses){
                if(err){
                    res.writeHeader(200,'text/html');   
                    res.write(req.url);
                    res.end(err);
                 }else{
                    var ip = addresses[0];
                    var p = 'http://'+ip+req.url;
                    req.headers['Host'] = req.headers.host;
                    request({
                        method:req.method,
                        url:p,
                        headers:req.headers
                    }).pipe(res);
                  } 
            });
            }
        });
    }).resume();
});

httpServer.listen(1314);

简单解释一下上面的代码吧,是从我一个项目里摘出来的。

首先node-static和http建立了一个本地的http server,然后在当文件本地不存在时,使用dns模块和request模块,来进行反向代理线上资源。

dns模块可以根据host查找到线上地址的ip,然后使用request直接访问ip,伪造headers,来请求真实资源,资源拿到之后pipe到res中返回即可。

其实nginx和apache也是这么干的~拿nodejs做起来就是这么简单。

评论
发表评论
2年前
赞了此文章!
3年前
赞了此文章!
3年前
赞了此文章!
3年前

使用了,赞~

3年前

@thankwsx 感觉没什么不足的。应用场景有很多。举2个栗子。 一,就是正文所说的调试时,本地server中的资源不存在时,可反向代理线上真实资源,方便无缝调试。 二,当这段代码放在真实环境的服务器中时,可做简单修改,实现负载均衡。

实质问题就是解决了ip与domain一一对应的问题。通过一个domain可自由分配不同ip资源给客户端,指定ip也好,或者由dns解析出的ip也好。一个意思。

3年前

应用场景? 有什么不足?

WRITTEN BY
PUBLISHED IN
nodejs 边角料

分享和记录一下,个人在学习nodejs中遇到的一些有意思的事。

我的收藏