负载均衡
负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 负载均衡名为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务
四层负载均衡(F5、LVS),工作在TCP协议下
七层负载均衡(Nginx、haproxy),工作在Http协议下
Nginx应用场景
反向代理
负载均衡
HTTP服务器,动静分离
核心组件
gx_nginx upstream负载均和模块,可以实现网站的负载均衡功能及节点的健康检查
ngx_http_proxy_moduleProxy模块,用于把请求后抛给服务器节点或upstream服务器池
工作原理
NGINX启动后,有一个主进程master process和一个或多个工作进程worker process,主进程的作用主要是读入
和检查NGINX的配置信息,以及维护工作进程;工作进程才是真正处理客户端请求的进程。具体要启动多少个工作进程,
可以在NGINX的配置文件nginx.conf中通过worker_processes指令指定。
NGINX控制命令
nginx -s [ stop | quit | reopen | reload ]
nginx -s stop: 强制停止NGINX,不管工作进程当前是否正在处理用户请求,都会立即退出。
nginx -s quit:“优雅地”退出NGINX,执行这个命令后,工作进程会将当前正在处理的请求处理完毕后,再退出。
nginx -s reload:重载配置信息。当NGINX的配置文件改变之后,同过执行这个命令,使更改的配置信息生效,而无
需重新启动nginx.
Nginx的配置文件 nginx.conf
worker_processes 1; 指定nginx进程数,一般设置和CPU核数一致
worker_connections 1024; 每个工作进程的连接数上限
http {}设定http服务器,利用它的反向代理功能提供负载均衡支持
include mime.types; 设定mime类型,类型由mime.type文件定义
sendfile on;指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用
keepalive_timeout 65; 连接超时时间,单位为秒
gzip on;开启gzip压缩,压缩html
upstream yan { 用于实现负载均衡
weigth参数表示权值,权值越高被分配到的几率越大
down 表示单前的server暂时不参与负载
backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
定义的语法规则:server 192.168.1.121 weight=1;
server { }配置代理服务器的地址,即Nginx安装的服务器地址、监听端口、默认地址
listen 80; 侦听80端口
server_name localhost;对于server_name,如果需要将多个域名的请求进行反向代理,可以配置多个server_name来满足要
location / {
root html; 默认主页目录在nginx安装目录的html子目录
index index.html index.htm;设置欢迎首页
proxy_pass http://yan; #跟载均衡服务器的upstream对应
}
}
upstream yan{
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:9080;
}
负载均衡策略
Nginx提供轮询round robin、IP 哈希client IP和加权轮询3种方式,默认情况下,Nginx采用的是轮询。
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.1.14;
server 192.168.1.15;
}
加权轮询
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.1.14 weight=1;
server 192.168.1.15 weight=2;
}
ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14;
server 192.168.0.15;
}
fair
fair策略是扩展策略,默认不被编译进nginx内核。其原理是根据后端服务器的响应时间判断负载情况,从中选出负载最轻的机器进行分流。这种策略具有很强的自适应性,但是实际的网络环境往往不是那么简单,因此要慎用
url_hash第三方
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下
重试策略
可以为每个backserver指定最大的重试次数,和重试时间间隔,所使用的关键字是max_fails和 fail_timeout。
upstream backserver {
server 192.168.1.14 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.15 weight=2 max_fails=2 fail_timeout=30s;
}
失败重试次数为3,且超时时间为30秒。
热机策略
upstream backserver {
server 192.168.1.14 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.15 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.1.16 backup;
}
当所有的非备机non-backup都宕机或繁忙busy时就会使用由backup标注的备机。必须要注意的是,backup不能和ip_hash关键字一起使用
动静分离
1、前端Nginx收到静态请求,直接从NFS中返回给客户端。
2、前端Nginx收到动态请求转交给通过FastCGI交给PHP服务器处理。
如果得到静态结果直接从NFS取出结果交给Nginx然后返回给客户端。
如果需要数据处理服务器连接数据库后将结果返回给Nginx
3.前端Nginx收到图片请求以.jpg、.png、.gif等请求交给后端Images服务器处理
location / {
proxy_pass http://yan
}
location ~* \.(jpg|gif|js|css)$ { location匹配将图片交给Image处理
proxy_pass http://10.10.0.23:80;# Image服务器要开启web服务,或者直接使用root d:/images;
}
location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为:首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。