Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2+mod_proxy_balancer的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到Apache的近2/3。对proxy和rewrite模块的支持很彻底,还支持mod_fcgi、ssl、vhosts ,适合用来做mongrel clusters的前端HTTP响应,官网号称Nginx能抗5万并发!!!。
nginx和Apache一样使用模块化设计,nginx模块包括内置模块和第三方模块,其中内置模块中包含主模块和事件模块。
nginx应用场合
- 静态服务器。(图片,视频服务)另一个lighttpd。并发几万,html,js,css,flv,jpg,gif等。
- 动态服务,nginx——fastcgi 的方式运行PHP,jsp。(PHP并发在500-1500,MySQL 并发在300-1500)。
- 反向代理,负载均衡。日pv2000W以下,都可以直接用nginx做代理。
- 缓存服务。
Nginx原理
Nginx内部工作组件,在Linux下使用的是epoll的I/O多路复用模型,原理类似Tomcat一组件专门接收请求一组组件处理网络事件。Master接收请求,Worker使用的是reactor模型进行网络事件处理,类似余NIO的多路复用器,Nginx也基于网络事件驱动的,Worker进程使用非阻塞的方式处理多个连接,减少了上下文切换的次数
高度的模块化设计:1、 Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程
2、通过异步非阻塞的方式来处理请求
3、每个worker的线程可以把一个cpu的性能发挥到极致
4、所以worker数和cpu数相等是最为适宜的

多机的负债均衡,反向代理
反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息,而反向代理是实现的负载均衡的手段
多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时,请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色,它会按照一定的规则把请求打到不同的服务器中

负债均衡算法
weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。
权重轮询(最常用):基于weight轮询,在这weight轮询种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的
ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
url_hash(第三方):按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包
-
权重轮询:最常用的算法,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
image.png
-
轮询:默认,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
image.png
-
ip hash:不用单点登录了,用ip hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,不再需要单点登录了。
image.png

单机配置

Nginx的高可用:LVS+Nginx+keepalived
LVS
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。
keepalived
keepalive是通过VRRP(虚拟路由冗余协议)实现高可用。
VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。
简单来说Keepalived的作用就是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
KeepAlive会给多台机子对外提供同一个虚拟ip叫做vip,master会进行处理服务,如果master挂掉了,则backup会成为maste继续提供服务。

keepalived的配置,每台虚拟机服务器都搭建启动一个keepalived,state 是MASTER的服务器的Nginx将成为MASTER,state 是BACKUP的服务器的Nginx将成为BACKUP
#全局配置
global_defs {
notification_email { #指定keepalived在发生切换时需要发送email到哪个人的账号,一行一个
XXX@XXX.com
XXX@XXX.com
}
notification_email_from XXX@XXX.com #指定发邮件的人
#smtp_server XXX.smtp.com #指定smtp服务器地址(邮件服务器)
#smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #运行keepalived机器的一个标识
}
vrrp_instance VI_1 {
state MASTER #标示状态为MASTER 备份机为BACKUP
interface eth1 #设置实例绑定的网卡,这个网卡可以通过ifconfig查看
virtual_router_id 51 #同一实例下virtual_router_id必须相同
priority 100 #MASTER权重要高于BACKUP 比如BACKUP为99
advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置nginx认证
auth_type PASS #主从服务器验证方式
auth_pass 8888
}
virtual_ipaddress { #设置vip
192.168.200.150 #可以多个虚拟IP,换行即可
192.168.200.151
}
}
Nginx优化
worker数量及最大连接数设置:
可以通过配置增加Worker数,然后配置每个Work要均匀落到每个CUP上处理,worker数量最好为CUP的核数,例如我机器是8核心,配置了8个Worker,然后配置最大文件打开数和最大连接数


I/O模型优化:


sendfile零拷贝:
在http模块配置:

超时时间:



压缩优化:





缓存优化:
缓存的作用:



网友评论