在服务器端使用反向代理是很常见的事情,这篇文章来教大家如何使用npm包http-proxy来实现反向代理。
首先说下本篇文章使用反向代理要解决的问题,比如你有一个web服务,和一个后端服务,这两个服务部署在同一台服务器上。但服务器只有一个80端口允许外网访问,这时就没办法让两个服务都能实现外网访问。所以我们需要在80端口上另起一个服务,根据规则来分发前端页面内容的请求和后端接口的请求,实现反向代理。
具体的代码如下:
var http = require('http');
var httpProxy = require('http-proxy');
// 新建一个代理 Proxy Server 对象
var proxy = httpProxy.createProxyServer({});
// 捕获异常
proxy.on('error', function (err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.');
});
// 在每次请求中,调用 proxy.web(req, res config) 方法进行请求分发
var server = require('http').createServer(function(req, res) {
// 在这里可以自定义你的路由分发
var host = req.headers.host
switch(host){
case 'www.alleria.cn':
proxy.web(req, res, { target: 'http://localhost:3000' });
break;
case 'server.alleria.cn':
proxy.web(req, res, { target: 'http://localhost:9527' });
break;
default:
next();
}
});
server.listen(80);
console.log("listening on port 80");
当访问www.alleria.cn的时候,请求就被转发到了3000端口上,请求server.alleria.cn时就被转发到了9527这个端口上,80端口只做请求的分发工作,这样就实现了流量的分发工作。
用node做服务器的话,推荐大家用pm2来做管理,这样可以把一台服务器上的所有服务都监控起来,利于开发调试,提高系统稳定性。
我的新博客上线了,还在建设中,欢迎大家来交流,吴楠的博客