Nodejs實現一個http反向代理

使用Nodejs很容易實現一個反向代理。基本思路是使用node-static查看文件是否存在本地,存在則直接返回,若是不存在則將請求轉發到相應的後端服務器,dns模塊對本地hosts文件內配置的域名解析會出現問題,所以使用了硬編碼的hosts配置。須要npm安裝模塊:node-static、request。html

代碼以下:node

var nodeStatic = require('node-static').Server;
var request = require("request");
var dns = require("dns");
var fileServer = new nodeStatic("./");
var http = require("http");
var port = 8088;
var hosts = {
        'kind':'192.168.72.11',
        'free':'192.168.72.29',
        'cute':'192.168.72.34'
}

var resolv = function(hostname,callback){
        if(/^[\d\.]+$/.test(hostname))callback(hostname);
        else{
            if(hosts[hostname])callback(hosts[hostname]);
            else{
               dns.resolve4(hostname,function(err,addresses){
                        if(err){
                                console.error(err);
                                callback(null);
                        }else callback(addresses[0]);
                });
            }
        }
}

var httpServer = http.createServer(function(req, res) {
        req.addListener('end', function() {
        fileServer.serve(req, res, function(err, result) {
        if (err && (err.status === 404)) {
                var hoststr = req.headers.host.split(':');
                var hostname = hoststr[0];

                resolv(hostname,function(ip){
                if(!ip){
                        res.writeHeader(200,'text/html');
                        res.write(req.url);
                        res.end(' request failuer.');
                }else{
                        if(hoststr.length > 1)ip += (':'+hoststr[1])
                        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(port);

console.log('proxy listen in '+port);
相關文章
相關標籤/搜索