前端进阶(十二)Nginx反向代理和负载均衡

Nginx

主页地址:http://nginx.net 

Nginx入门指南:http://wiki.jikexueyuan.com/project/nginx/overwise.html

“Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡。”

Nginx总体架构图

nginx在启动后,会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。工作进程以非特权用户运行。

master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

worker进程则是处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。

开发模型:epoll和kqueue。

支持的事件机制: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源代码以类 BSD 许可证的形式发布。Nginx 因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是 Apache2.2+mod_proxy_balancer 的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到 Apache 的近 2/3。对 proxy 和 rewrite 模块的支持很彻底,还支持 mod_fcgi、ssl、vhosts ,适合用来做 mongrel clusters 的前端 HTTP 响应。

Nginx 做为 HTTP 服务器,有以下几项基本特性:

  • 高并发连接: 官方称单节点支持5万并发连接数,实际生产环境能够承受2-3万并发。
  • 内存消耗少: 在3万并发连接下,开启10个nginx进程仅消耗150M内存 (15M*10=150M)
  • 配置简单
  • 成本低廉: 开源免费
  • 支持rewrite重写规则: 能够根据域名、url的不同,将http请求分发到后端不同的应用服务器节点上
  • 内置健康检查功能: 如果后端的某台应用节点挂了,请求不会再转发给这个节点,不影响线上功能
  • 节省带宽: 支持gzip压缩
  • 反向代理: 支持分布式部署环境,消除单点故障,支持7 * 24小时不停机发布

Nginx专为性能优化而开发,它支持内核Poll模型,最高能支持50000并发,能经受高负载的考验。

Nginx是基于事件驱动的,不会出现阻塞现象。

Nginx具有很高的稳定性,其他服务器遇到访问峰值,会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。但是Nginx采用分阶段资源分配技术,使得他的CPU占用率非常低。

Nginx支持热部署,即使使用数月也不需要重启,还能在不间断服务的情况下,对软件版本升级。

Nginx 采用 master-slave 模型,能够充分利用 SMP 的优势,且能够减少工作进程在磁盘 I/O 的阻塞延迟。当采用 select()/poll() 调用时,还可以限制每个进程的连接数。

Nginx 代码质量非常高,代码很规范,手法成熟,模块扩展也很容易。特别值得一提的是强大的 Upstream 与 Filter 链。Upstream 为诸如 reverse proxy,与其他服务器通信模块的编写奠定了很好的基础。而 Filter 链最酷的部分就是各个 filter 不必等待前一个 filter 执行完毕。它可以把前一个 filter 的输出做为当前 filter 的输入,这有点像 Unix 的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在模块接收完后端服务器的整个请求之前把压缩流转向客户端。

反向代理

为什么要反向代理?

使用反向代理最主要的两个原因:

1)安全及权限。可以看出,使用反向代理后,用户端将无法直接通过请求访问真正的内容服务器,而必须首先通过Nginx。可以通过在Nginx层上将危险或者没有权限的请求内容过滤掉,从而保证了服务器的安全。

2)负载均衡。例如一个网站的内容被部署在若干台服务器上,可以把这些机子看成一个集群,那么Nginx可以将接收到的客户端请求“均匀地”分配到这个集群中所有的服务器上(内部模块提供了多种负载均衡算法),从而实现服务器压力的负载均衡。此外,nginx还带有健康检查功能(服务器心跳检查),会定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态,一旦发现某台服务器异常,那么在以后代理进来的客户端请求都不会被发送到该服务器上(直到后面的健康检查发现该服务器恢复正常),从而保证客户端访问的稳定性。

我们先看正向代理,平时我们用的软件即为正向代理,将我们的请求代理到一个可以访问墙外网址的代理服务器上,这个代理服务器请求墙外网站并将结果转发给客户。

nginx-proxy

下图为反向代理示意图。

nginx-proxy-reverse

客户发送的请求,想访问服务器上内容,先把请求发送到一个代理服务器proxy,这个代理服务器讲吧请求代理到和自己属于同一个LAN下的内部服务器上,而用户真正想获得的内容就储存在这些内部服务器上。

正向和反向代理的区别在于:反向代理的proxy服务器代理的并不是客户,而是服务器,即向外部客户端提供了一个统一的代理入口,客户端的请求,都先经过这个proxy服务器,至于在内网真正访问哪台服务器,由这个proxy控制。这里代理的对象是服务器,这就是反向的含义。

Nginx就是来充当这个proxy的作用。 概括说:就是代理服务器和真正server服务器可以直接互相访问,属于一个LAN(服务器内网);代理对用户是透明的,即无感知。不论加不加这个反向代理,用户都是通过相同的请求进行的,且不需要任何额外的操作;代理服务器通过代理内部服务器接受域外客户端的请求,并将请求发送到对应的内部服务器上。

负载均衡

为什么要负载均衡?

使用负载均衡有什么好处呢?首先优化资源利用率,最大化吞吐量,减少延迟,再者系统的伸缩性和可靠性也得到了相应的保障。

Nginx会给你分配服务器压力小的访问。

Nginx 中提供了 4 种均衡策略,我们可以根据具体的业务场景选择合适的均衡策略。下面分别介绍这 4 中均衡策略:

1、基于轮询的均衡策略:

Nginx默认的均衡算法,即对进到nginx的request按照遍历的方式进行分发,如果request 1 分发到 Server A,那么request 2将被分发到 Server B,......以此循环类推。此策略不能防止某台Server出现负载过高的情况。因为如果有些请求执行时间过长,而系统的并发量却非常大,那么就可能导致某台Server出现request堆积,负载过高。

2、基于最少连接数的均衡策略:

最少连接,也就是说nginx会判断后端集群服务器中哪个Server当前的 Active Connection 数是最少的,那么对于每个新进来的request,nginx将该request分发给对应的Server。该策略还是比较人性化的,可以按照机器的实际情况进行刚需分配。

3、基于ip-hash的均衡策略:

每个请求的客户端都有相应的ip地址,该均衡策略中,nginx将会根据相应的hash函数,对每个请求的ip作为关键字,得到的hash值将会决定将请求分发给相应Server进行处理。此策略可确保来自同一客户端的请求始终定向到同一服务器,但此服务器不可用时除外。

4、基于加权轮询的均衡策略:

加权轮询,很显然这个策略跟我们开题引入的场景是一样的,nginx会给Server配置相应的权重,权重越大,接收的request数将会越多。这种策略适合Server机器处理能力有区别的情况。

你可能感兴趣的:(web,Nginx)