2.7 反向代理
反向代理(Reverse Proxy)是现今网络中一种非常重要的技术,它位于客户端和真正的服务器(即所谓的后端)之间,接受客户端的请求并转发给后端,然后把后端的处理结果返回给客户端。从客户端的角度来看,访问反向代理和真正的后端服务器两者没有任何区别。
反向代理的网络结构如图2-2所示:
图2-2 反向代理的网络结构
由于反向代理在客户端和服务器之间加入了中间层,可以执行复杂的逻辑,所以它有很多的用途,例如:
■ 负载均衡 :最常用的功能,均衡多个后端服务器的访问请求,实现服务集群化; ■ 安全防护 :使用WAF等工具防御网络入侵,保护后端服务器; ■ 内容缓存 :缓存上下行数据,减轻后端服务器的压力; ■ 数据加密 :加密验证外部通信过程,而内部服务器之间没有加密成本。
Nginx提供了优秀的反向代理功能,不仅支持HTTP反向代理,也支持TCP/UDP反向代理,非常适合用在网络的核心位置担当“中流砥柱”的重任。
2.7.1 上游集群
upstream块定义了在反向代理时需要访问的后端服务器集群和负载均衡策略(在Nginx里术语“upstream”代替了“backend”),可以在http{}或stream{}里配置。
upstream块的基本形式是:
upstream backend { #upstream需要有一个名字 least_conn; #负载均衡策略 server 127.0.0.1:80; #一台上游服务器 server ... weight=3; #可以指定多台上游服务器 server ... backup; #备份用的上游服务器 keepalive 32; #使用连接池,长连接复用 }
upstream块的配置比较简单,主要使用server指令列出上游的服务器域名或IP地址,还可以用weight/max_fails/down/backup等附加参数来进一步描述这些服务器的状态。least_conn指令确定了集群里服务器的负载均衡策略,类似的还有hash、ip_hash等。如果不给出明确的策略,Nginx就使用简单的加权轮询(round robin)。
2.7.2 代理转发
在使用upstream配置了上游集群后,我们需要在location(http)或server stream)里用“proxy_pass”等指令把客户端的请求转发到后端,由Nginx根据负载均衡算法选择一台恰当的服务器提供服务,例如:
location /passto { #一个转发的location proxy_set_header Host $host; #使用变量转发原始请求的host头部 proxy_pass http://backend; #转发到upstream块定义的服务器集群 }
Nginx代理转发相关的指令比较多,用来应对各种复杂的场景,proxy_pass只是其中最基本的一个(转发HTTP/HTTPS服务),其他的还有fastcgi_pass、memcached_pass等,篇幅所限这里就不详细解说了,读者可参考Nginx文档。