一、Nginx介绍
Nginx是一个高性能的HTTP和反向代理服务器,在性能上,Nginx占用很少的系统资源,能支持更多的并发连接,达到更高的访问效率;在功能上,Nginx是优秀的代理服务器和负载均衡服务器;在安装配置上,Nginx安装简单、配置灵活。Nginx支持热部署,启动速度特别快,还可以在不间断服务的情况下对软件版本或配置进行升级,即使运行数月也无需重新启动。
二、为什么要用Nginx
当用户量变大的时候,单机压力变大,会造成Web服务器响应变慢,严重的会导致服务瘫痪,无法提供服务,单台Web服务并发量有限,而且有发生故障的情况,这时候我们就会将同一个系统部署到多台服务器实现高可用,那么请求可以分发到不同的服务器,从而提高性能,这里我们就可以用到Nginx了。下面我们讲一讲Nginx负载均衡策略以及策略的代码实现
三、Nginx负载均衡策略有哪几种?
1、轮循(默认策略 weight=1)
Nginx根据请求次数,将每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
upstream backserver {
server localhost:8080;
server localhost:8081;
}
server {
#需要监听的端口号
listen 8082;
server_name localhost;
location / {
# backserver是upstream服务组,可自己命名
proxy_pass http://backserver;
}
}
max_conns | 限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置 |
fail_timeout | 与max_fails结合使用(默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它) |
max_fails | 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 |
fail_time | 服务器被认为停机的时长,默认10s(被认为停机的服务器尝试间隔?) |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。所以这台机器压力会最轻。 |
down | 标记服务器永久停机(表示单前的server暂时不参与负载) |
resolve | 将server指令配置的域名,指定域名解析服务器。需要在http模块下配置resolver指令,指定域名解析服务 |
http {
resolver 10.0.0.1;
upstream u {
zone ...;
...
server example.com resolve;
}
}
表示example.com域名,由10.0.0.1服务器来负责解析。upstream模块server指令的其它参数和详细配置说明
注意:1.down标记的服务器会自动剔除;2.缺省就是轮询;3.此策略适合服务器配置无状态且短平块的服务使用
2、权重
通过配置权重,指定轮询几率,权重和访问比率成正比,用于应用服务器性能不均的情况。
upstream backserver {
server localhost:8080 weight=1 max_fails=3 fail_timeout=15;
server localhost:8081 weight=3;
server localhost:8080 down;
server localhost:8081 Backup;
}
注意:1.权重越高分配到的请求越多;2.此策略可以和least_conn策略、iphash策略结合使用;3.此策略比较适合服务器硬件配置差距较大的情况。
3、IP Hash
绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。
upstream backserver {
ip_hash;
server localhost:8080;
server localhost:8081;
}
注意:1.nginx1.3.1之前的版本不能在ip_hash中使用权重(weight);2..ip_hash不能与backup同时使用;3.此策略适合有状态服务的程序,比如session;4.当有服务器需要剔除,必须手动down掉。
4、least_conn
最少连接方式,把请求发给链接数最少的后端服务器。轮询是把请求平均分配给各个后端,使它们的负载大致相同。但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。
upstream模块配置模板如下:
upstream backserver {
least_conn;
server localhost:8080 weight=1;
server localhost:8081;
}
注意:此策略适合请求处理时间长短不一造成的服务器过载情况。7)
第三方负载策略
1> fair
根据服务器的响应时间来分配请求,响应时间短的优先分配,即负载压力小的优先会分配。
由于fair模块是第三方提供的,所以在编译nginx源码的时候,需要将fair添加到nginx模块中。
假设我的nginx是通过源码安装的,安装在/opt/nginx目录下,而且安装时没有添加fair模块
1> 下载fair模块源码
下载地址:https://github.com/xyang0917/nginx-upstream-fair
cd /opt
wget https://github.com/xyang0917/nginx-upstream-fair/archive/master.zip
unzip master.zip
解压后的目录名为:nginx-upstream-fair-master
2> 重新编译nginx,将fair模块添加到编译参数
我的nginx源码目录在/opt/nginx-1.10.0
cd /opt/nginx-nginx-1.10.0
./configure --prefix=/opt/nginx --add-module=/opt/nginx-upstream-fair-master
make
注意:不要执行make install,这样会覆盖之前nginx的配置
3> 将新编译的nginx可执行程序拷贝到/opt/nginx/sbin/目录下,覆盖之前安装的nginx
编译后的nginx执行程序,放在nginx源码的objs目录下
ps -aux | grep nginx
kill -9 nginx进程ID # 停止nginx服务
cp /opt/nginx-1.10.0/objs/nginx /opt/nginx/sbin/ # 覆盖旧的nginx
nginx # 启动服务
配置使用fair负载策略模块:
upstream tomcats {
fair;
server 192.168.0.100:8080;
server 192.168.0.101:8080;
server 192.168.0.102:8080;
}
由于采用fair负载策略,配置weigth参数改变负载权重将无效。