购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.4 Nginx代理&负载均衡

Nginx处理HTTP请求的流程如图4-4所示。

图4-4 Nginx处理HTTP请求流程图

注意

通常一个连接建立好后,会读取一行数据,并分析出请求行中包含的method、uri、http_version等信息。然后再一行一行处理请求头,并根据请求method与请求头的信息来决定是否有请求体以及请求体的长度,然后再去读取请求体。得到请求后,处理该请求并输出相应的数据,再生成响应行、响应头以及响应体。在将响应发送给客户端之后,一个完整的请求就处理完了。

负载均衡的作用如下:

1)转发功能:按照一定的算法(默认为轮询),将客户端请求转发到不同应用服务器上,以减轻单个服务器压力,提高系统并发量。

2)故障移除:通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器宕掉,自动将请求发送到其他应用服务器。

3)恢复添加:如检测到发生故障的应用服务器,则自动将恢复工作添加到处理用户请求队伍中。

4.4.1 正向代理

正向代理通常简称为代理,是指在用户无法正常访问外部资源时,通过代理的方式,让用户绕过防火墙,从而连接到目标网络或者服务。例如,用户不能访问zachary.sh.cn,但能访问代理服务器AS,而代理服务器AS能访问zachary.sh.cn,故可以先连接代理服务器AS,通过AS获取zachary.sh.cn的内容。正向代理服务器是一个位于客户端和原始服务器之间的服务器。为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

正向代理访问zachary.sh.cn的过程,如图4-5所示。其中,目标服务器无法正常访问到zachary.sh.cn服务器,目标服务器和zachary.sh.cn服务器之间有防火墙,但目标服务器可访问代理服务器AS,由于AS和zachary.sh.cn服务器相通,所以可通过AS获取内容返回目标服务器。

4.4.2 反向代理

反向代理是指用代理服务器来接收Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端的过程。此时,代理服务器对外就表现为一个服务器。例如,客户端访问http://zachary.sh.cn/demo,但是zachary.sh.cn上不存在demo页面,于是zachary.sh.cn反向代理到其他服务器读取到demo页面,然后将其作为自己的内容返回给用户,用户此时并不知道内容不是zachary.sh.cn的。

图4-5 Nginx正向代理流程图

反向代理服务器对于客户端而言是原始服务器,客户端向反向代理的命名空间中的内容发送普通请求,由反向代理服务器判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。

反向代理访问zachary.sh.cn的过程,如图4-6所示。

图4-6 Nginx反向代理流程图

如图4-6所示,zachary.sh.cn服务器上没有demo相关页面,于是zachary.sh.cn服务器反向代理到Static服务器上并返回页面相关信息。工作流程如下:

1)用户通过域名发出访问Web服务器的请求,该域名被DNS服务器解析为反向代理服务器的IP地址;

2)反向代理服务器接受用户的请求;

3)反向代理服务器在本地缓存中查找请求的内容,找到后直接把内容发送给用户;

4)如果本地缓存里没有用户所请求的信息内容,反向代理服务器会代替用户向源服务器请求同样的信息内容,并把信息内容发给用户。如果信息内容是在本地缓存中,则还会把它保存到缓存中。

代理服务器只用于代理内部网络对Internet外部网络的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的HTTP请求发送到代理服务器中。不支持外部网络对内部网络的连接请求,因为内部网络对外部网络是不可见的。一个代理服务器若能够代理外部网络上的主机访问内部网络时,这种代理服务的方式就称为反向代理服务。此时代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或者CGI程序都保存在内部的Web服务器上。因此对反向代理服务器的攻击并不会使得网页信息遭到破坏,这样就提高了Web服务器的安全性。

4.4.3 动静分离

在介绍动静分离之前,需先了解动态和静态。所谓动态,指的是需更新编译处理的资源,如JSP/PHP。相对由服务端编程语言实现的页面,这种页面需要在服务端动态处理。所谓静态,指的是不需要更新编译的资源,如CSS/JSS/HTML等。

Nginx实现动静分离:在利用反向代理的过程中,Nginx会判断是否是静态的资源,如果是,则直接从Nginx发布的路径去读取,而不需要从后端服务器获取。

动静分离优势:充分利用服务器资源,减少不必要的请求,减少后端服务器的压力,快速提高页面加载速度。

Nginx实现动静分离的方法如代清单码4-6所示。

代码清单4-6 Nginx实现动静分离
location / {
    root   /root;               #定义服务器的默认网站根目录位置
    index index.html index.htm; #定义首页索引文件的名称
}
# 定义错误提示页面
error_page   500 502 503 504 /50x.html;
    location = /50x.html {
    root   /root;
}
#静态文件,Nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    root /zachary/shop;
    #过期5天
    expires 5d;
}

当浏览器请求获取静态资源时,若浏览器请求的响应状态码为304,其表示从缓存中获取静态资源,而Nginx可以对静态资源进行缓存,则当下次浏览器再请求静态资源时,如资源未变更,后续请求会从浏览器缓存中读取加载。

注意

浏览器获取静态资源不请求后端服务器,从而达到动静分离的效果。

4.4.4 负载均衡策略

upstream机制提供了负载均衡的功能,可以将请求负载分担到集群服务器的某个服务器上面。它的工作流程如下:

1)分析客户端请求报文,构建发往上游服务器的请求报文;

2)调用ngx_http_upstream_init开始与上游服务器建立TCP连接;

3)发送在第一步中组建的请求报文;

4)接收来自上游服务器的响应头并进行解析,之后往下游转发;

5)接收来自上游服务器的相应体,并进行转发。

注意

upstream机制允许开发人员自己设定相应的处理方式,来达到自己的目的。

upstream支持6种负载分配方式,前三种为Nginx原生支持的分配方式,后三种为第三方支持的分配方式。

1. Nginx轮询

轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器宕掉后,则能自动将其剔除,剩下的继续轮询。Niginx轮询实现如代码清单4-7所示。

代码清单4-7 Nginx轮询
 upstream zachary.sh.cn {
    server 192.168.1.10:8081;
    server 192.168.1.11:8081;
}

Nginx轮询代理示意如图4-7所示。

图4-7 Nginx/upstream轮询代理图

2. Nginx权重

权重是轮询的加强版,即在轮询的基础上还可以指定轮询比率,weight和访问概率成正比,主要应用于应用服务器性能不均的情况。Nginx权重实现如代码清单4-8所示,这里192.168.1.11的访问比例是192.168.1.10的两倍。

代码清单4-8 Nginx权重
upstream zachary.sh.cn {
    server 192.168.1.10:8081 weight=1;
    server 192.168.1.11:8081 weight=2;
}

Nginx权重代理示意如图4-8所示。

图4-8 Nginx/upstream权重代理图

3. Nginx ip_hash

ip_hash即每个请求会按照访问IP的hash值分配,这样同一客户端连续的Web请求都会被分发到同一服务器进行处理,可以解决session的问题。如果服务器宕掉,则能自动将其剔除,如代码清单4-9所示。

代码清单4-9 Nginx ip_hash
upstream zachary.sh.cn {
    ip_hash
    server 192.168.1.10:8081;
    server 192.168.1.11:8081;
}

Nginx ip_hash的代理示意如图4-9所示。

图4-9 Nginx/upstream ip_hash代理图

4. Nginx fair

fair即按后端服务器的响应时间来分配请求,响应时间短的优先分配,如代码清单4-10所示。

代码清单4-10 Nginx fair
upstream zachary.sh.cn {
    server 192.168.1.10:8081;
    server 192.168.1.11:8081;
    fair;
}

Nginx fair的代理示意如图4-10所示。

图4-10 Nginx/upstream fair代理图

5. Nginx url_hash

url_hash与ip_hash类似,但是其按照访问URL的hash结果来分配请求,使得每个URL定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景中,如代码清单4-11所示。

代码清单4-11 Nginx url_hash
upstream zachary.sh.cn {
    server 192.168.1.10:8081;
    server 192.168.1.11:8081;
    hash $request_uri;
    hash_method crc32;
}

6. Nginx least_conn

least_conn把请求转发给连接数较少的后端服务器,如代码清单4-12所示。

代码清单4-12 Nginx least_conn
upstream zachary.sh.cn {
    least_conn;    #把请求转发给连接数较少的后端服务器
    server 192.168.1.10:8081;
    server 192.168.1.11:8081;
}

Nginx least_conn的代理示意如图4-11所示。

图4-11 Nginx/upstream ip_hash代理图 js8QlRARF4AL9JiRauT3b6iLsq4ikOdv4/cKt7VyvVH/sTwn97JnfJjic+uv7jxq

点击中间区域
呼出菜单
上一章
目录
下一章
×