nodejs+cloudfoundry 实现代理服务器。
发布于 2年前 作者 luofei614 4287 次浏览

以前一直用的goagent翻墙,最近发现它越来越慢了, 所以自己用nodejs写了个代理,放在cloudfoundry上面, 比goagent快很多呀。 话不多说,直接贴代码:

放在cloudfoundry上面的代码:

var http=require('http');
var https=require('https');
var url=require('url');
//创建http服务器
http.createServer(function(req,res){
    //获得请求body
    var body='';
    req.on('data',function(chunk){
            body+=chunk;
    });
    req.on('end',function(){
            //代理请求
            if(!req.headers.fetchurl) return res.end('must have fetchUrl!');
            var request_url=req.headers.fetchurl;
            var option=url.parse(request_url);
            var httpObj='http:'==option.protocol?http:https;
            //发送header
            req.headers.host=option.host;
            option.path=option.path?option.path:option.pathname+(option.search?option.search:'');//cloudfrondry上 url.parse 后 没有path这个下标
            req.headers.path=option.path;
            delete req.headers.fetchurl;
            option.method=req.method;
            option.headers=req.headers;
            httpObj.request(option,function(result){
                //设置header
                for(var key in result.headers){
                    res.setHeader(key,result.headers[key]);
                }
                result.on('data',function(chunk){
                    res.write(chunk);
                });
                result.on('end',function(){
                    res.end();
                });
            }).on('error',function(error){
                res.end('remote http.request error'+error)}).end(body);

    });
}).listen(80);

怎么将nodejs代码上传的cloudfoundry, 可以用cloudfoundry提供的vmc命令行工具,详情大家见官方文档: http://cndocs.cloudfoundry.com/tools/vmc/installing-vmc.html

放在本地的代码(文件名暂且命名为local.js):

var http=require('http');
var url=require('url');
//创建http服务器
http.createServer(function(req,res){
    //获得请求body
    var start_time=new Date;
    var body='';
    req.on('data',function(chunk){
            body+=chunk;
    });
    req.on('end',function(){
            //代理请求
            var request_url='http://your_app_name.cloudfoundry.com';
            var option=url.parse(request_url);
            //发送header
            req.headers.host=option.host;
            req.headers.fetchurl=req.url;//设置fetchUrl
            delete req.headers['accept-encoding'];//不进行压缩,在cloudfoundry上面压缩时访问google会出问题
            option.method=req.method;
            option.headers=req.headers;
            http.request(option,function(result){
                //打出日志
                console.log('\033[90m'+req.url+'\t\033[33m'+result.statusCode+'\t\033[36m'+(new Date - start_time)+'ms \033[0m');
                //设置header
                for(var key in result.headers){
                    res.setHeader(key,result.headers[key]);
                }
                result.on('data',function(chunk){
                    res.write(chunk);
                });
                result.on('end',function(){
                    res.end();
                });
         }).on('error',function(error){
                res.end('remote http.request error'+error)}).end(body);

    });
}).listen(8787);

将local.js代码中的your_app_name.cloudfoundry.com 改为你真实的cloudfoundry应用的地址。

在本地运行 node local.js 这时候 本地监听了8787端口。

设置浏览器的代理服务器地址为 127.0.0.1:8787 。

火狐浏览器可以安装 autoproxy这个插件来设置代理。

chrome浏览器可以安装 switchproxy这个插件来设置代理。

注:还没实现对https网站的代理。 有兴趣的朋友 自己实现一下https,贴出你的代码和大家分享一下。

11 回复

#前几天刚玩过cloudfoundry,先顶再试

###有些网站怎么不行啊,我这没法上facebook,用的教育网ipv6

cloudfoundry没把http.request接口封掉吗?

facebook 的网址会跳转到 https://www.facebook.com/ , 它是https的, 我代码中 没有处理https的 那个比较麻烦 我打算以后有空再研究, 你也试一试 实现https

@snoopy 老吴,早就跟你提过cf和af,还有好多这样的云端服务器

@luofei614 代理的话建议你用个模块http-proxy,可以免去你很多麻烦~

@a272121742 嗯,af我看过,但是国内打开太慢,cf倒没去研究过。

同学那里看到一个 shadowsocks, 用了还不错 https://github.com/clowwindy 但是真的比不上自己写来得带劲

@snoopy 恩,刚学nodejs没多久,很多模块还不熟悉,我看看这个。

@snoopy af刚开始我体验的时候打开很快的,不过现在确实太慢了,感觉打开国外的都很慢的,包括我今天打开netbean,开cf也不快

回到顶部