最近迁移网站服务,有些页面在旧的服务上,但是客户端还有一些请求打过来,客户端要改url的话又需要发版,所以最后选择了在新服务上做了代理,承接了原来页面的访问。今天就来聊一下nodejs与代理服务器有关的事。
正向代理和反向代理
代理分为两种,一种是正向代理,一种是反向代理。
正向代理是一个位于客户端和目标服务器之间的代理服务器,也就是代理用户访问目标站点的中介服务器,用来把客户端的请求代理到目标服务器,比如科学上网。
反向代理就好像是目标服务器,客户端并不知道这个请求具体会被转发到哪里,由反向代理自己判断,比如负载均衡。
用node实现一个代理服务器
核心思想都是使用stream和pipe。stream即流,可以理解为运载数据的流,HTTP request和process.stdout这些都是流的实例,分为可写流、可读流、可读可写流,使用stream可以实现数据的流式处理,pipe是stream的强大之处,跟unix中的|类似,可以将一个流的输出灌入另一个流的输入,很多强大的工具都使用stream pipe去实现流式处理,比如gulp、Browserify等等。
利用stream和pipe纯手写
极简版
1 | const express = require('express') |
复杂版
见github:https://github.com/leotian/proxy-test/blob/master/advanced-pipe.js
第三方包
node-http-proxy
较常用,middleware的实现有http-proxy-middleware,使用harmon可以进行内容修改
node-http-proxy:https://github.com/nodejitsu/node-http-proxy
http-proxy-middleware:https://github.com/chimurai/http-proxy-middleware
hoxy
自带cheerio,修改方便,代码拦截流程以及替换流程比较直接,拦截很方便,但是跟express不好结合