反向代理服务器实现原理
本篇文章接上篇 网站支持 HTTP 2.0,那篇文章中提到我对网站进行了升级,以支持 HTTP/2.0。我在博客程序前部署了 nginx 反向代理,通过 nginx 实现 TLS 加密、数据压缩、websocket 转发及 HTTP 2.0 通信。
Internet 上代理这个概念非常流行,随处可见。如同字面意思,代理服务器即指代表真实机器的中间服务器,可以隐藏真实机器的地址和身份,代理服务器作为代表与目标机器建立连接,在真实机器与目标机器之间转发数据。
反向代理是相对正向代理而言的。想要搞清楚反向代理,就必须先了解正向代理。正向代理位于客户端机器前面,比如常见的 HTTP Proxy 或者 Socks Proxy 等。通过在浏览器中设置代理服务器的 IP 地址、端口号、用户名密码等信息,即可通过代理服务器上网。
反向代理位于服务器前面,可以起到隐藏和保护后台 Web 服务器的作用,浏览器等客户端程序不能够直接连接 Web 服务器,无法得知代理服务器后的网络拓扑结构。
常见开源软件
常见的反向代理软件有 Nginx、Apache、Caddy、HAProxy、Squid 等
主要作用
- 对客户端隐藏服务器(集群)的IP地址
- 安全:作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等
- 为后端服务器(集群)统一提供加密和SSL加速(如SSL终端代理)
- 负载均衡,若服务器集群中有负荷较高者,反向代理通过URL重写,根据连线请求从负荷较低者获取与所需相同的资源或备援
- 对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务
- 对一些内容进行压缩,以节约带宽或为网络带宽不佳的网络提供服务 减速上传
- 提供HTTP访问认证
基于反向代理服务器的重要性,我想通过动手实现一个具备基本功能的反向代理服务器 hawkey,来深入了解下其中的原理。在你通过浏览器看本文时,浏览器发出的到 huoyijie.cn 的所有请求都是经过 hawkey 反向代理转发到博客程序的。后文中,我会陆续介绍 hawkey 的主要代码实现。