nginx

  1. Nginx 是一个高性能的HTTP和反向代理服务器
  2. 其特点是占有内存少,并发能力强
  3. 什么是负载均衡:
  4. 将原先请求集中到单个服务器上的情况跟改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是负载均衡.

什么是动静分离:
为了加快网站的解析速度,将动态页面和静态页面由不同的服务器来解析.

1_nginx - 图1

nginx负载均衡常用策略
1. 轮询(默认).
    每个请求按请求时间,逐个分配到不同的后端服务器,如果服务器宕机,能自动剔除.
2. 权重.
    weight代表权重,默认为1,weight值和分配的请求数量成正比,权重越高,代表被分配的处理的请求数量越多。此策略一般用于服务器性能不一致时.    
3. ip绑定. 
    通过对客户端请求的IP进行hash计算,再通过计算出来的hash值选择具体的服务器,以后这个客户端的请求每次都访问的是同一个服务器,可以解决session共享的问题.

nginx从无到有的演进:

一,

    这样的情形存在单点故障问题,即,这个tomcat服务器挂掉了,那么整个项目也就跟着凉凉了;

1_nginx - 图2

二,

    为了避免单点故障问题,办法就是,搭建一个多台tomcat服务器,这样一台挂掉了,还可以有另外的一台tomcat服务器来顶上来接着干活。

1_nginx - 图3

三,

    为了提高系统的并发能力,搭建了一台nginx服务器,这样就又存在了单点故障问题了,这台nginx服务器挂掉了,那么整个系统还是随之也凉凉了。

1_nginx - 图4

四,nginx搭建集群,以实现高可用效果:
    为了实现nginx的高可用效果,办法就是搭建nginx集群;
    搭建两台nginx服务器,每台服务器都配备一个监视器keepalived,客户端请求的是一个监视器keepalived生成的虚拟IP,并不是真的nginx服务器的IP;
    这两台服务器一台为主服务器,一台为从服务器,主服务器负责处理请求,从服务器不干活,是一个备用机器,当主服务器挂掉之后,keepalived促使从服务器开始上位。
    等到运维人员将这台挂掉的nginx服务器重新启动之后,这台重新启动的nginx服务器成为从服务器,即备用机器。
    这样就通过搭建集群的方式保证了nginx的高可用效果。

1_nginx - 图5

nginx的架构—争抢机制
nginx的架构:—— 主从模式,争抢机制

    主节点只负责监听,监听是否有请求到达本nginx服务器;
    当有请求到达了本nginx服务器的主节点,会自动触发 争抢机制;
    闲着的子节点们(像狼一样)开始抢夺这个请求(即,猎物),
    哪个子节点抢到了请求,哪个子节点就去处理 这个请求;

    这样的争抢机制的好处是,大大减轻了主节点的压力,它只负责监听是否有请求到达;

    这种争抢机制的核心其实就是:多路复用IO模型。

1_nginx - 图6

nginx的 基于争抢机制的主从架构 的好处:
1. 大大减轻了主节点的压力;

2. 实现了7 * 24小时热加载; 

3. 每个子节点都是相互的独立的.有一个子节点宕机和重新启动,不会影响其他子节点.

什么是Nginx?

    Nginx(enginex)是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。

    Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。

    其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx1.0.4发布。

    Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

021.Nginx和apache的优缺点

n nginx相对于apache的优点:

Ø 轻量级,同样起web 服务,比apache 占用更少的内存及资源

Ø 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx

Ø 能保持低资源低消耗高性能

Ø 高度模块化的设计,编写模块相对简单

Ø 社区活跃,各种高性能模块出品迅速

n apache 相对于nginx 的优点:

Ø rewrite ,比nginx 的rewrite 强大

Ø 模块超多,基本想到的都可以找到

Ø 少bug ,nginx 的bug 相对较多

n Nginx 配置简洁, Apache 复杂

n 最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;

nginx是异步的,多个连接(万级别)可以对应一个进程

023.请解释Nginx服务器上的Master和Worker进程分别是什么?

Master进程:读取及评估配置和维持

Worker进程:处理请求

024.请解释Nginx如何处理HTTP请求。

Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。

025.Nginx反向代理为什么能够提升服务器性能?

对于后端是动态服务来说,比如Java和PHP。这类服务器(如JBoss和PHP-FPM)的IO处理能力往往不高。

Nginx有个好处是它会把Request在读取完整之前buffer住,这样交给后端的就是一个完整的HTTP请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。同样,Nginx也可以把

response给buffer住,同样也是减轻后端的压力。

026.Nginx多进程模型是如何实现高并发的?

进程数与并发数不存在很直接的关系。这取决取server采用的工作方式。如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。

Nginx的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。apache是如何利用的呢,简单来说:同样的4个进程,如果采用一个进程负责一个request的方式,那么,同时进来4个request之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第5个request进来了。就无法及时反应了,因为4个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个request,就新开个进程来处理。nginx不这样,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

由于webserver的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。webserver刚好属于网络io密集型应用,不算是计算密集型。异步,非阻塞,使用epoll,和大量细节处的优化。也正是nginx之所以然的技术基石。

027. nginx负载均衡的4 种方式分配

nginx的六种负载均衡方式:

轮询 默认方式
ip_hash 依据ip分配方式
weight 权重方式
least_conn 最少连接方式
fair(第三方) 响应时间方式
url_hash(第三方) 依据URL分配方式

nginx的upstream目前支持4种方式的分配

1)、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2)、weight 权重

  指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

2)、ip_hash

  每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

3)、fair(第三方)

  按后端服务器的响应时间来分配请求,响应时间短的优先分配。

4)、url_hash(第三方)

nginx内置策略包含加权轮询和ip hash

加权轮询算法分为先深搜索和先广搜索,那么nginx采用的是先深搜索算法,即将首先将请求都分给高权重的机器,直到该机器的权值降到了比其他机器低,才开始将请求分给下一个高权重的机器;

028. Nginx优秀模块 模块设计:

高度模块化设计,除了少量核心代码,其他一切接模块。

官方Nginx共有五大类型模块:核心模块、配置模块、事件模块、HTTP模块、mail模块。

要注意的是:nginx的模块是静态的,添加和删除模块都要对nginx进行重新编译,这一点与Apache的动态模块完全不同。

029. 如何解决惊群现象?

惊群是多个子进程在同一时刻监听同一个端口引起的;

Nginx解决方法:同一个时刻只能有唯一一个worker子进程监听web端口,此时新连接事件只能唤醒唯一正在监听端口的worker子进程。

采用锁,互斥量实现!!

030.为什么要用Nginx?

优点:

跨平台、配置简单

非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发

内存消耗小:开启10个nginx才占150M内存,Nginx采取了分阶段资源分配技术

nginx处理静态文件好,耗费内存少

内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。

节省宽带:支持GZIP压缩,可以添加浏览器本地缓存

稳定性高:宕机的概率非常小

master/worker结构:一个master进程,生成一个或者多个worker进程

接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力

一边接收web服务器的返回数据,一边发送给浏览器客户端

网络依赖性比较低,只要ping通就可以负载均衡

可以有多台nginx服务器

事件驱动:通信机制采用epoll模型

031.为什么Nginx性能这么高?

得益于它的事件处理机制:

异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

032.为什么不使用多线程?

Apache: 创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。

Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。

033.Nginx是如何处理一个请求的呢?

首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面

先初始化好这个监控的socket,再进行listen

然后再fork出多个子进程出来, 子进程会竞争accept新的连接。

此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后此时,某一个子进程会accept成功,然后创建nginx对连接的封装,即ngx_connection_t结构体

接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。

最后,nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了