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