最近参与了一个基于node开发的负载平衡转发框架,用到了http-proxy进行转发,但是需要统计转发到对应服务器的请求响应状态,通过查询资料发现如下:
const httpProxy = require('http-proxy');
http.createServer(function (req, res) {
httpProxy.web(req, res, {target: uri}, function (e) {
console.log(e);
});
}).listen(PORT);
httpProxy.createProxyServer({
changeOrigin: true,
ignorePath: true
});
httpProxy.on('proxyRes', function(proxyRes, req, res) {
let host = proxyRes.req.getHeader('host');
let path = proxyRes.req.path;
})
http-proxy可以监听proxyRes事件,当转发的请求返回响应时,会触发该事件。(当客户端发起请求时,http-proxy转发到对应的目标服务器上,目标服务器返回请求内容时,触发proxyRes事件,回调执行结束后,再返回res给客户端)
proxyRes.req.getHeader() 可以获取对应的header头信息,为了能够得到转发服务器地址,
创建代理服务器时,需要配置changeOrigin为true,该选项用于更改目标地址头信息。比如: 客户端请求地址为 test.iqiyi.com,转发的目标服务器地址为 target.iqiyi.com,当changeOrigin设置为true时,host得到的是target.iqiyi.com;当设置为false时,host的值为test.iqiyi.com
除了proxyRes事件外,http-proxy还支持proxyReq事件,用于转发请求前,执行相关回调逻辑。代码如下:
proxy.on('proxyReq', function(proxyReq, req, res) {
console.log("url:" + proxyReq.path);
});
ignorePath用于转发请求时,是否将原请求地址中的path附加到转发地址后面。
比如: 客户端请求地址为:http://test.iqiyi.com/test,转发请求地址为:http://target.iqiyi.com/lib/mac/dianshiju/
- 当ignorePath为true时,代理服务器转发时不会添加path,直接请求http://target.iqiyi.com/lib/mac/dianshiju/
- 当ignorePath为false时,代理服务器转发请求时,会附加上原地址的path,去请求http://target.iqiyi.com/lib/mac/dianshiju/test
使用http-proxy创建代理服务器时,一般都会设置 ignorePath为true,便于转发请求处理。