OpenResty完全开发指南:构建百万级别并发的Web应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.7 反向代理

反向代理(Reverse Proxy)是现今网络中一种非常重要的技术,它位于客户端和真正的服务器(即所谓的后端)之间,接受客户端的请求并转发给后端,然后把后端的处理结果返回给客户端。从客户端的角度来看,访问反向代理和真正的后端服务器两者没有任何区别。

反向代理的网络结构如图2-2所示:

图2-2 反向代理的网络结构

由于反向代理在客户端和服务器之间加入了中间层,可以执行复杂的逻辑,所以它有很多的用途,例如:

    ■   负载均衡    :最常用的功能,均衡多个后端服务器的访问请求,实现服务集群化;
    ■   安全防护    :使用WAF等工具防御网络入侵,保护后端服务器;
    ■   内容缓存    :缓存上下行数据,减轻后端服务器的压力;
    ■   数据加密    :加密验证外部通信过程,而内部服务器之间没有加密成本。

Nginx提供了优秀的反向代理功能,不仅支持HTTP反向代理,也支持TCP/UDP反向代理,非常适合用在网络的核心位置担当“中流砥柱”的重任。著名的LVS(Linux Virtual Server)也是一种反向代理,但与Nginx不同的是它集成在Linux内核里,工作在网络四层以下,而且只能用于负载均衡。

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文档。