mark一篇文章--用nodejs搭建一个本地反向代理环境

调试线上代码的时候,我们经常遇到的一个问题就是 本地一套环境,线上一套环境,本地没有的文件用线上的这种需求。我简单来说下使用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做起来就是这么简单。

posted @ 2015-03-24 14:29  低调的大白兔  阅读(1898)  评论(0编辑  收藏  举报