使用NodeJs实现代理服务器

最近迁移网站服务,有些页面在旧的服务上,但是客户端还有一些请求打过来,客户端要改url的话又需要发版,所以最后选择了在新服务上做了代理,承接了原来页面的访问。今天就来聊一下nodejs与代理服务器有关的事。

30894AB2-3E4E-4260-8C12-9F7845C922B4

正向代理和反向代理

代理分为两种,一种是正向代理,一种是反向代理。

  • 正向代理是一个位于客户端和目标服务器之间的代理服务器,也就是代理用户访问目标站点的中介服务器,用来把客户端的请求代理到目标服务器,比如科学上网。

  • 反向代理就好像是目标服务器,客户端并不知道这个请求具体会被转发到哪里,由反向代理自己判断,比如负载均衡。

用node实现一个代理服务器

核心思想都是使用stream和pipe。stream即流,可以理解为运载数据的流,HTTP request和process.stdout这些都是流的实例,分为可写流、可读流、可读可写流,使用stream可以实现数据的流式处理,pipe是stream的强大之处,跟unix中的|类似,可以将一个流的输出灌入另一个流的输入,很多强大的工具都使用stream pipe去实现流式处理,比如gulp、Browserify等等。

利用stream和pipe纯手写

极简版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const express = require('express')
const request = require('request')

const app = express()
app.use('/favicon.ico', function (req, res) {
res.sendfile('./assets/bbb')
})

app.use('/', function (req, res) {
console.log(req.url)
const url = `http://www.baidu.com/s?wd=${req.url.split('=')[1]}`
req.pipe(request(url)).pipe(res)
})

app.listen(process.env.PORT || 4000)

复杂版

见github:https://github.com/leotian/proxy-test/blob/master/advanced-pipe.js

第三方包

node-http-proxy

较常用,middleware的实现有http-proxy-middleware,使用harmon可以进行内容修改

hoxy

自带cheerio,修改方便,代码拦截流程以及替换流程比较直接,拦截很方便,但是跟express不好结合

参考链接

反向代理为何叫反向代理?

图解正向代理、反向代理、透明代理

如何编写一个 HTTP 反向代理服务器

基于node的stream pipe实现反向代理