抛弃Nginx使用nodejs做反向代理服务器
时下不少场景,都是申请一个VPS主机来托管运行Web项目的,小弟我也不例外,购买了一个小型的Win03VPS使用着。在使用的过程中,面临一个问题,就是同一类型的服务端环境还好——但如果是一个PHP、一个ASP、一个JSP的三种类型的服务端项目并存着,该怎么分配唯一的80端口呢?因为商业WWW网站的话,往往只能占用80 端口,——当然,如果只是做服务的话,如接口之类的,使用其他端口就不会与80端口冲突了。许多开发者都会面临到80端口这个问题,并且实际情况会受到成本的限制。因为单独为一个项目就买一个VPS,也不太经济、不太合算,管理起来也不方便。于是,我们就应该好好考虑一下,怎么在提供一个80端口的情况下,分发到多种服务端那里去,让不同的主机执行各自的Web项目。
亲,那这项需求我们说可以实现吗?是的,这并不是什么“神奇的技术”,也不是什么复杂的技术。不知你是否有了解,网络服务中的“反向代理(ReverseProxy)”,其中的一个功能就是可以完成端口的分发的。我们不妨以域名为路由分发:凡是AA.com域名请求的,分发到PHP82端口执行;凡是BB.com域名请求的,分发到ASP83端口执行;……如此类推。当然这里的端口只说说明用而已,您可以任意配置,反正就是从80端口接收回来的请求,先作一次处理,进而分发。反向代理,通俗地讲,就是左手转右手而已。
每当提起反向代理器,人们通常一想到的就是Nginx,但是今天我们暂时忽略大名鼎鼎的Nginx,采用同样也是使用单线程、事件循环的服务端小弟——Nodejs来达成。首先Node采用JS作服务端编程,而不是Nginx写配置或Lua,比较符合我的味口,其次自己对Node也比较熟悉,配置各方面什么的更为顺手。
完成该项功能的是node-http-proxy包。下载、安装请键入:
npminstallhttp-proxy
安装完毕后,新建一个proxy.js文件,输入:
varhttp=require('http'),httpProxy=require('http-proxy'); //新建一个代理ProxyServer对象 varproxy=httpProxy.createProxyServer({}); //捕获异常 proxy.on('error',function(err,req,res){ res.writeHead(500,{ 'Content-Type':'text/plain' }); res.end('Somethingwentwrong.Andwearereportingacustomerrormessage.'); }); //另外新建一个HTTP80端口的服务器,也就是常规Node创建HTTP服务器的方法。 //在每次请求中,调用proxy.web(req,resconfig)方法进行请求分发Createyourcustomserverandjustcall`proxy.web()`toproxy //awebrequesttothetargetpassedintheoptions //alsoyoucanuse`proxy.ws()`toproxyawebsocketsrequest // varserver=require('http').createServer(function(req,res){ //Youcandefinehereyourcustomlogictohandletherequest //andthenproxytherequest. varhost=req.url; host=url.parse(host);host=host.host; console.log("host:"+req.headers.host); console.log("clientip:"+(req.headers['x-forwarded-for']||req.connection.remoteAddress)); proxy.web(req,res,{target:'http://localhost:8080'}); }); console.log("listeningonport80") server.listen(80);
若说使用代理服务器的代价,可能就是会比不用消耗多的资源,消耗多的CPU运算罢了。
使用问题:不能指定文件夹proxy.web(req,res,{target:'http://jb51.net:81/foo/'});