Nginx考点

1、什么是Nginx

nginx是一款免费开源的高性能HTTP服务器及反向代理服务器,同时它还可以提供IMAP/POP3/SMTP服务等功能。

多进程异步非阻塞事件处理机制:运用了epoll模型


2、Nginx的一些特性(为什么要用nginx)

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

2)内存消耗小:开启10个nginx才占150M内存,Nginx采取了分阶段资源分配技术(nginx处理静态文件好,耗费内存少)

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

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

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

6)请求的处理机制:master/worker结构:一个master进程,生成一个或者多个worker进程


3、为什么Nginx性能这么高?

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


4、为什么不使用多线程?

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

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


5、Nginx是如何处理一个请求的呢?

    1)首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面先初始化好这个监控的socket,再进行listen

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

3)客户端向nginx发起连接,进行三次握手,与nginx建立好一个连接

4)此时,某一个子进程会accept成功,然后创建nginx对连接的封装

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

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


6、Nginx的模块

    核心模块:nginx服务器运行必不可少的模块,提供nginx最基本最核心的服务的模块。比如:进程管理、权限控制、日志等等;

    标准HTTP模块:支持nginx服务器的标准http功能的模块;

    可选HTTP模块:扩展标准的http功能,使其能够处理一些特殊的http请求的模块;

    邮件服务模块:用于支持nginx的邮件服务的模块;

    第三方模块:由第三方开发的可编译到nginx中的,能扩展nginx服务器应用的模块;


7、Nginx的web请求处理机制

nginx使用一个多进程模型来对外提供服务,nginx在启动后,会有一个master进程和多个worker进程。 

    master进程主要用来管理worker进程,包含以下两点:

    1、接收来自外界的信号,向各worker进程发送信号。

    2、监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

    基本的网络事件,都是放在worker进程中来处理了。worker进程之间是对等的,一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数,一般会设置与机器cpu核数一致。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接。

    PS:每个worker进程都采用异步非阻塞方式,可以处理多个客户端请求。


8、Nginx的惊群

惊群现象:多进程等待同一个socket事件,当这个事件发生时,这些进程被同时唤醒,就是惊群。可以想见,效率很低下,许多进程被内核重新调度唤醒,同时去响应这一个事件,当然只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠。

Nginx对惊群现象的处理:

    nginx提供了一个accept_mutex这个东西,这是一个加在accept上的一把共享锁。有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了。accept_mutex是一个可控选项,我们可以显示地关掉,默认是打开的。


9、Nginx的事件驱动模型

nginx事件驱动框架:所谓事件驱动架构,简单来说,就是由一些事件发生源来产生事件,由一个或多个事件收集器(epolld等)来收集、分发事件,然后许多事件处理器会注册自己感兴趣的事件,同时会“消费”这些事件。nginx不会使用进程或线程作为事件消费者,只能是某个模块,当前进程调用模块。

传统web服务器(如Apache),所谓事件局限在TCP连接建立、关闭上,其他读写都不在是事件驱动,这时会退化成按序执行每个操作的批处理模式,这样每个请求在连接建立后都将始终占用系统资源,直到连接关闭才会释放资源。大大浪费了内存、cpu等资源。并且把一个进程或线程作为事件消费者。

传统web服务器与Nginx间重要差别:

前者每个事件消费者独占一个进程资源,后者只是被事件分发者进程短期调用而已。


10、Nginx实现的功能

1)代理服务:

    正向代理:局域网外的站点提供服务,让局域网内的客户机接入外网以访问资源;总结就一句话:代理端代理的是客户端

    反向代理:局域网内的站点提供服务,让局域网外的客户机接入内网以访问资源;总结就一句话:代理端代理的是服务端

        相关指令:proxy_pass url;        #设置被代理服务器的地址

                proxy_pass_header field;    #设置nginx服务器在发送http响应时,发送一些头域信息;        

proxy_set_header field value;#更改nginx服务器接收到的客户端请求头信息,再将新的请求头发送给被代理服务器;

                proxy_connect_timeout time;    #设置nginx服务器与后端被代理服务器尝试建立连接的超时时间;

                proxy_read_timeout time;#设置nginx服务器向后端被代理服务器发出read请求后,等待响应的超时时间;

                proxy_send_timeout time;#设置nginx服务器向后端被代理服务器发出write请求后,等待响应的超时时间;

                proxy_ignore_client_abort on|off;#设置客户端终端请求后,nginx是否终端对被代理服务器的请求;(499报错)      

2)负载均衡:

负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中,主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力

    nginx服务器做反向代理服务还有一个重要用途是实现负载均衡,proxy_pass到一个分组,由upstream部分来实现后端负载均衡;

        (upstream支持的负载均衡算法:轮询、weight、ip_hash、第三方模块(fair、url_hash))

        (upstream 支持的状态参数:down、backup、max_fails、fail_timeout)

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

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

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

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

(3)、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。  

(4)、url_hash(第三方)

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

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

3)HTTP服务器:

    纯静态资源:

    动静分离:这是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件)

    这些不需要经过后台处理的文件称为静态文件,否则就是动态文件。要是所有的文件请求都打到后端的话,后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决。将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到nginx中,动态资源转发到后端应用中


11、Nginx调优案例