Nginx的负载均衡以及动静分离
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,其两个主要的功能就是静态解析和反向代理。静态解析的意思是Nginx可以解析静态资源,如css/js/img…等等,但是Nginx无法解析动态资源。关于反向代理,这个名词初听感觉很奇怪,其实反向代理是相对正向代理而言的。举个例子(来源于其他博客):小王(客户端
)创业缺钱,想找马云(服务端
)借钱,但是马云不认识他所以不会借钱给小王,但是小王的大学老师(正向代理
)是马云的同学,于是小王找大学老师帮忙,大学老师找马云借钱,然后再把借到的钱给小王。在这个过程中,小王知道马云,但是马云不知道小王。所以马云(服务端
)是被暴露的,而小王(客户端
)是被隐藏的,这种不知道客户端
是谁,但知道服务端
是谁的就是正向代理
。反之,如果不知道服务端
是谁,但知道客户端
是谁的,就是反向代理。Nginx通过管理多个一样的服务端,客户端访问的时候依据负载均衡算法给客户端分配一个不确定的服务端,这样来实现反向代理
负载均衡
nginx内置的主要有四种负载均衡算法
- 轮询算法
upstream web1{
#下面三个服务端,假设第一次访问分配给客户端的是7777,
#那么第二次分配的就是8888 ,第三次分配的就是9999,
#第四次分配的又是7777了。这种算法主要是通过取模运算
#来实现的。
server 192.168.2.111:7777;
server 192.168.2.111:8888;
server 192.168.2.111:9999;
}
location /index {
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web1;
}
- 加权轮询
upstream web1{
#在轮询的基础上,给每个服务端分配一定的权重
# 每个服务的权重 = 本服务的权重 / 总权重
# 7777的权重 = 1 / (1 + 1 + 2) = 25%
# 8888的权重 = 1 / (1 + 1 + 2) = 25%
# 9999的权重 = 2 / (1 + 1 + 2) = 50%
#权重值默不写的话,默认为1
upstream web1{
server 192.168.2.111:7777 weight=1;
server 192.168.2.111:8888 weight=1;
server 192.168.2.111:9999 weight=2;
}
location /index {
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web1;
}
- ip_hash
upstream web1{
#nginx依旧是随机给客户端分配一个服务端,但是一旦二者建立连接
#那么客户端后续的访问都会访问此服务端,也就是依据客户端的ip
#对某个服务端进行绑定。这这做法可以保证session的一致性,但是
#会缺乏分流的效果。
upstream web1{
ip_hash;
server 192.168.2.111:7777;
server 192.168.2.111:8888;
server 192.168.2.111:9999;
}
location /index {
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web1;
}
4.least_conn(最小连接数)
upstream web1{
#nginx在接收到客户端的请求时候,会查询目前连接数最小的服务端
#然后让连接数最小的服务端来响应此请求。
#简单理解就是连接数越多的服务端越繁忙,越少的越闲,把请求分配
#给空闲的服务端,最大化的利用所有服务端。
upstream web1{
least_conn;
server 192.168.2.111:7777;
server 192.168.2.111:8888;
server 192.168.2.111:9999;
}
location /index {
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web1;
}
动静分离
Nginx能解析静态资源,但是无法解析动态资源。而我们的服务器tomcat既能解析静态资源,又能解析静态资源。但是如果动态和静态的资源都让tomcat来解析,会给tomcat造成很大的负担,于是我们就让Nginx来帮忙解析静态资源,tomcat只解析动态资源,合理分配任务,让系统更加稳定高效的运作。这就是动静分离
。