1 基于reverse proxy实现的反向代理例子





2 reverse proxy源码分析

主要结构体reverseproxy


主要方法


url 拼接方法

从上面的实例中我们已经知道基本步骤是实例化一个reverseproxy对象,再传入到http.ListenAndServe方法中


其中http.ListenAndServe 方法接收的是一个地址与handler,函数签名如下:


这里的handler 是一个接口,实现的方法是ServeHTTP



因此,我们可以肯定实例化的reverseproxy对象也实现了ServeHTTP方法

主要步骤有:

1、拷贝上游请求的Header到下游请求

2、修改请求(例如协议、参数、url等)

3、判断是否需要升级协议(Upgrade)

4、删除上游请求中的hop-by-hop Header,即不需要透传到下游的header

5、设置X-Forward-For Header,追加当前节点IP

6、使用连接池,向下游发起请求

7、处理协议升级(httpcode 101)

8、删除不需要返回给上游的逐跳Header

9、修改响应体内容(如有需要)

10、拷贝下游响应头部到上游响应请求

11、返回HTTP状态码

12、定时刷新内容到response




下面我们来分析下核心方法 serverHttp

3 修改返回内容实例

核心在于修改 reverseproxy 中的ModifyResponse 方法中的响应体内容和内容长度

测试结果

4 返回客户端真实IP

处于安全性的考虑,通常我们不会将真实服务器也就是realserver 直接对外部用户暴露,而是通过反向代理的方式对外暴露服务,如下图所示:



带来的问题是,在用户与真实服务器之间经过一台或多台反向代理服务器后,真实服务器究竟应该如何获取到用户的真实IP,换句话说,中间的反向代理服务器应如何将用户真实IP原封不动的透传到后端真实服务器。

通常我们会基于HTTP header实现,常用的有X-Real-IP 和 X-Forward-For 两个字段。

X-Real-IP : 通常在离用户最近的代理点上设置,用于记录用户的真实IP,往后的反向代理节点不需要设置,否则将覆盖为上一个反向代理的IP

X-Forward-For:记录每个经过的节点IP,以","分隔,例如请求链路是client -> proxy1 -> proxy2 -> webapp,那么得到的值为clientip,proxy1,proxy2