Nginx作为一个强大的Web服务器软件,具备高性能、高并发性和低内存占用的特色。此外,其也可以提供强大的反向代理功能。俄罗斯大约有超过20%的虚拟主机采用Nginx做为反向代理服务器,在国内也有腾讯、新浪、网易等多家网站在使用Nginx做为反向代理服务器。据Netcraft统计,世界上最繁忙的网站中有11.48%使用Nginx做为其服务器或者代理服务器。基于反向代理的功能,Nginx做为负载均衡主要有如下几点理由:php
上图为来自官方的一张整体架构图。html
nginx在启动后,会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。工做进程以非特权用户运行。前端
master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常状况下),会自动从新启动新的worker进程。nginx
worker进程则是处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。git
开发模型:epoll和kqueue。github
支持的事件机制:kqueue、epoll、rt signals、/dev/poll 、event ports、select以及poll。算法
支持的kqueue特性包括EV_CLEAR、EV_DISABLE、NOTE_LOWAT、EV_EOF,可用数据的数量,错误代码.编程
支持sendfile、sendfile64和sendfilev;文件AIO;DIRECTIO;支持Accept-filters和TCP_DEFER_ACCEP.后端
Nginx的高并发,官方测试支持5万并发链接。实际生产环境能到2-3万并发链接数。10000个非活跃的HTTP keep-alive 链接仅占用约2.5MB内存。三万并发链接下,10个Nginx进程,消耗内存150M。淘宝tengine团队说测试结果是“24G内存机器上,处理并发请求可达200万”。缓存
Nginx工做在网络的7层,能够针对http应用自己来作分流策略。支持七层HTTP、HTTPS协议的负载均衡。对四层协议的支持须要第三方插件-yaoweibin的ngx_tcp_proxy_module实现了tcp upstream。
此外,nginx自己也逐渐在完善对其余协议的支持:
目前,nginx最新稳定版为1.10.2,主线开发版本已经到了1.11.5。Tengine最新版本则继承到了nginx的1.6.2版本。
nginx的负载均衡策略能够划分为两大类:内置策略和扩展策略。内置策略包含加权轮询和ip hash,在默认状况下这两种策略会编译进nginx内核,只需在nginx配置中指明参数便可。扩展策略有不少,如fair、通用hash、consistent hash等,默认不编译进nginx内核。
加权轮询(weighted round robin)
轮询的原理很简单,首先咱们介绍一下轮询的基本流程。以下是处理一次请求的流程图:
图中有两点须要注意,第一,若是能够把加权轮询算法分为先深搜索和先广搜索,那么nginx采用的是先深搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其余机器低,才开始将请求分给下一个高权重的机器;第二,当全部后端机器都down掉时,nginx会当即将全部机器的标志位清成初始状态,以免形成全部的机器都处在timeout的状态,从而致使整个前端被夯住。
ip hash
ip hash是nginx内置的另外一个负载均衡的策略,流程和轮询很相似,只是其中的算法和具体的策略有些变化,以下图所示:
ip hash算法的核心实现以下:
for(i = 0;i < 3;i++){
hash = (hash * 113 + iphp->addr[i]) % 6271;
}
p = hash % iphp->rrp.peers->number; 复制代码
从代码中能够看出,hash值既与ip有关又与后端机器的数量有关。通过测试,上述算法能够连续产生1045个互异的value,这是该算法的硬限制。对此nginx使用了保护机制,当通过20次hash仍然找不到可用的机器时,算法退化成轮询。所以,从本质上说,ip hash算法是一种变相的轮询算法,若是两个ip的初始hash值刚好相同,那么来自这两个ip的请求将永远落在同一台服务器上,这为均衡性埋下了很深的隐患。
fair
fair策略是扩展策略,默认不被编译进nginx内核。其原理是根据后端服务器的响应时间判断负载状况,从中选出负载最轻的机器进行分流。这种策略具备很强的自适应性,可是实际的网络环境每每不是那么简单,所以要慎用。
通用hash、一致性hash
这两种也是扩展策略,在具体的实现上有些差异,通用hash比较简单,能够以nginx内置的变量为key进行hash,一致性hash采用了nginx内置的一致性hash环,能够支持memcache。
session_sticky
此种策略就是一次会话内的请求都会落到同一个结点上。在作分布式架构时可使用,可是当一个结点挂掉时,会话信息同时也会丢失,若是使用session同步方案同步session信息到全部结点的话代价又会很高,慎重使用此方案。nginx默认不支持此种策略,tengine提供了支持: tengine.taobao.org/document_cn….
HTTP
upstream upstream_test{
server 192.168.0.1:8080;
server 192.168.0.2:8080;
#ip_hash;
keepalive 30;
## tengine config
#check interval=300 rise=10 fall=10 timeout=100 type=http port=80;
#check_http_send "GET / HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xx http_3xx;
## tengine config
#session_sticky cookie=cookieTest mode=insert;
}
location / {
proxy_pass http://upstream_test;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}复制代码
对于nginx更为具体的配置可参考:github.com/superhj1987…
TCP - ngx_tcp_proxy_module
tcp {
upstream cluster {
#simple round-robin
server 192.168.0.1:8080;
server 192.168.0.2:8080;
check interval=3000 rise=2 fall=5 timeout=1000;
#check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello;
#check interval=3000 rise=2 fall=5 timeout=1000 type=http;
#check_http_send "GET / HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xx http_3xx;
}
server {
listen 8888;
proxy_pass cluster;
}
}复制代码
内置了对后端服务器的健康检查功能。若是Nginx proxy后端的某台服务器宕机了,会把返回错误的请求从新提交到另外一个节点,不会影响前端访问。它没有独立的健康检查模块,而是使用业务请求做为健康检查,这省去了独立健康检查线程,这是好处。坏处是,当业务复杂时,可能出现误判,例如后端响应超时,这多是后端宕机,也多是某个业务请求自身出现问题,跟后端无关。
Nginx属于典型的微内核设计,其内核很是简洁和优雅,同时具备很是高的可扩展性。以下图所示:
Nginx是纯C语言的实现,其可扩展性在于其模块化的设计。目前,Nginx已经有不少的第三方模块,大大扩展了自身的功能。nginx_lua_module能够将Lua语言嵌入到Nginx配置中,从而利用Lua极大加强了Nginx自己的编程能力,甚至能够不用配合其它脚本语言(如PHP或Python等),只靠Nginx自己就能够实现复杂业务的处理。
nginx的配置架构以下图所示:
Nginx支持热部署,几乎能够作到7*24不间断运行,即便运行数个月也不须要从新启动。可以在不间断服务的状况下,对软件版本进行进行升级。Nginx的配置文件很是简单,风格跟程序同样通俗易懂,可以支持perl语法。使用nginx –s reload能够在运行时加载配置文件,便于运行时扩容/减容。从新加载配置时,master进程发送命令给当前正在运行的worker进程worker进程接到命令后会在处理完当前任务后退出。同时,master进程会启动新的worker进程来接管工做。
Tengine是淘宝基于nginx开源代码二次开发一款服务器软件,在继承了nginx的特性之外,提供了一些nginx商业版才有的功能。基本上同步于nginx的更新,目前最新的版本已经继承了nginx 1.6.2稳定版。
tengine的特性包括但不限于:
负载均衡方面,Tengine主要有如下几个特色,基本上弥补了nginx在负载均衡方面的欠缺: