Proxy
Service Proxy
有两种类型的网络代理:
- 反向代理(Reverse Proxy): 可理解成服务端代理,是服务端配置的一个中间代理服务器,负责将客户端的请求转发给后端服务器。
- 常被用于流量负载均衡(Load Balancer)、API网关、实现缓存/https/安全等功能。
- 正向代理(Forward Proxy)/转发代理: 可理解成客户端代理,是客户端配置的一个中间代理服务器,负责将客户端的请求转发给后端服务器。
- 常被用于突破某些服务端的访问限制,或者在网络上隐藏自己的真实身份(Tor 洋葱代理)。
- 也可用于添加某些访问限制:比如学校/企业可以通过前向代理禁止用户访问 一些娱乐网站。
下面介绍几种当下比较流行的代理软件:
全能选手,既可用做代理,又可用做 Web 服务器:
- Nginx: 使用最广泛,最年长,性能也几乎是最高的,但是配置稍显复杂,学习起来有些门槛。
- Caddy: 新兴的 Web Server & Network-Proxy。配置比 Nginx 简单,支持自动配置 SSL 证书,默认启用 HTTP2/HTTPS。
- 是 go 语言写的,性能相比 Nginx 要弱一些,同时内存消耗比 Nginx 大很多。
专用代理软件:
- Traefik: 一个纯粹的代理软件,支持自动配置 SSL 证书,配置很简单,功能相当丰富,还有好看的 Web UI。
- Traefik 相对的,性能也要比 Nginx 差。
- Envoy: Istio 钦定代理,在服务网格中专门负责流量转发
- Linkerd: 用 rust 写的轻量高效的代理,值得一看。
- OpenResty: 基于 Nginx+Lua Web 平台,很多网关/代理的底层都是它。
- APISIX: 基于 Openresty 开发的 API 网关,国产项目。
- 其核心贡献者同时也是 Openresty 社区的核心贡献者,相当活跃,性能也很高,值得考虑。
- Kong: 和 APISIX 一样都是基于 Openresty,虽然 Stars 很多,但是 APISIX 有后发优势,性能比 Kong 要好很多。
- APISIX: 基于 Openresty 开发的 API 网关,国产项目。
- HAProxy: 一个 C 专用负载均衡器,单纯做负载均衡,它的性能比 Nginx 还要好些。
- 但是纯四层负载均衡 LVS 性能比它更高,另外它的代码结构也不如 nginx,导致二次开发难度大,社区也就小很多。
- 所以不推荐使用。
高性能的 4 层代理,只关注第四层,因此能获得更高的性能:
- ipvs: 有二十多年历史的 4 层负载均衡技术,linux 内核模块。
在四层负载均衡方面,也有一些将 ipvs/eBPF 及其他技术结合起来的尝试,比如:
- 性能提升40%: 腾讯 TKE 用 ipvs+eBPF 绕过 conntrack 优化 K8s Service
- 网易数帆基于 DPDK 的高性能四层负载均衡实践
- katran: Facebook 开源的,基于 eBPF 的新一代 4 层负载均衡。一个 C++ 库和BPF程序,用于构建高性能第 4 层负载平衡转发平面。Katran 利用XDP infrastructure 内核为快速数据包处理提供内核设施。
如果你需要插件热加载(hot-plugin)那目前基本上就只有 openresty(lua) 系与 envoy(wasm) 可选,其他项目加个插件还得重新编译整个代理。
LVS Nginx Haproxy 对比
- LVS 特点是:
首先它是基于 4 层的网络协议的,抗负载能力强,对于服务器的硬件要求除了网卡外,其他没有太多要求; 配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,大大减少了人为出错的几率; 应用范围比较广,不仅仅对 web 服务做负载均衡,还可以对其他应用( mysql )做负载均衡; LVS 架构中存在一个虚拟 IP 的概念,需要向 IDC 多申请一个 IP 来做虚拟 IP。
- Nginx 负载均衡器的特点是:
工作在网络的 7 层之上,可以针对 http 应用做一些分流的策略,比如针对域名、目录结构; Nginx 安装和配置比较简单,测试起来比较方便; 也可以承担高的负载压力且稳定,一般能支撑超过上万次的并发; Nginx 可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持 url 来检测; Nginx 对请求的异步处理可以帮助节点服务器减轻负载; Nginx 能支持 http 和 Email,这样就在适用范围上面小很多; 默认有三种调度算法: 轮询、weight 以及 ip_hash (可以解决会话保持的问题),还可以支持第三方的 fair 和 url_hash 等调度算法;
- HAProxy 的特点是:
HAProxy 是工作在网络 7 层之上; 支持 Session 的保持,Cookie 的引导等; 支持 url 检测后端的服务器出问题的检测会有很好的帮助; 支持的负载均衡算法:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权 URL 哈希和加权参数哈希(Weighted Parameter Hash); 单纯从效率上来讲 HAProxy 更会比 Nginx 有更出色的负载均衡速度; HAProxy 可以对 Mysql 进行负载均衡,对后端的 DB 节点进行检测和负载均衡。