nginx

一  029-IO复用.avi

      C10k问题,涉及两段IO,网络IO和磁盘IO

      内核负责处理进行切换

     1. 单进程模型,阻塞

     2. 多进程模型,每个线程处理一个请求

         --  进程量大,进程切换次数过多

         --  每个进程的地址空间独立,很多空间是重复的数据,所以内存使用率会低

     3. 多线程模型,如果单核cpu,线程的优势发挥不出来

         --  线程依然切换,切换较之进程轻量级

         --  同一个进程的线程可以共享进程的诸多资源,比如打开的文件

         --  对内存的的需求略有下降

     4. 多线程N个请求

        一个线程响应多个请求(select 1024)

     5. 多路IO

     两段等待状态:(用户请求服务器网络的等待不算)

     --  用户进程向内核发起请求等待buffer准备好之前是一个等待状态

     --  内核接到请求后向IO设备发起请求,等待IO设备将数据读入buffer,内核处于等待状态

     异步是指上面两段分开执行

          

          对于进程而言需要等待数据输入buffer需要的时间和从Buffer复制进程需要的时间

          根据等待模式的不同可以分为五种模式

         (1)阻塞IO

         (2)非阻塞IO

         (3)IO复用(select and poll)

         (4)信号驱动的IO

         (5)异步IO

                  

           同步IO:请求进程阻塞,直到IO操作完成

           异步IO:不导致请求进程阻塞的

一  一些概念

     nginx是一个轻量级的web服务器,反向代理服务器

     nginx能代理两种协议是http和mail,但是Nginx设计就是为了反向代理而产生的

一  限流

     1.  nginx的限流配置

        (1)ngx_http_limit_req_module模块的limit_req_zone参数

                 该参数可以限制请求数,特别是 

                 语法: limit_req_zone $variable zone=name:size rate=rate;

                 示例:

                        limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;

                 limit_req_zone:是限流声明.

                 $binary_remote_addr:它是$remote_addr的二进制格式。表示根据客户端ip来限流比如上面的限流配置限制每

                                                       个客户端ip的请求频率为一秒一次,你如果耍流氓一秒两次,就会被限流会返回一个

                                                       http503错误给你。 

                 zone=perip:表示区域名称为perip,也有解释说表示用perip这个名称来标识这行限流配置,待会会通过perip这

                                      个名称来引用这行限流配置(也就是说限流配置是可以定义为多个的)

                 10m:表示存储客户端ip的空间为10MB, 1MB大概存储1万多ip,10MB大概10多万Ip。

                  配合博客:http://www.ttlsa.com/nginx/nginx-limiting-the-number-of-requests-ngx_http_limit_req_module-module/

                  一起看。

二 nginx的常见面试题

    1. nginx是如何处理http请求的

        nginx使用的是IO多路复用或答反应器模式

      (1)IO多路复用

                      IO复用模型中,进程可以让内核监控多个描述符的就绪状态,一般使用的接口函数为select或者poll,内核

               通过select查询到所监控的描述符中有就绪(就绪是下图中的数据准备完成)的,则把就绪的描述符返回给调用

               进程,进程再调用recvfrom实际读取数据,其内部过程大致如下图所示:

              

             由上图可以看出,在IO复用模型中,用户进程先调用select或者poll查看是否有数据就绪,如果有数据就绪再调用

             recvfrom去读取数据,系统在阶段1和阶段2都将会被阻塞,但是阻塞于不同的系统调用(阶段1阻塞于select或者

             poll,阶段2阻塞于recvfrom)。

      (2)反应器模式

                      反应器设计模式(Reactor pattern)是一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序

               的事件设计模式。

                     当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收所有的请求,然后派发

               这些请求至相关的工作线程进行处理。简单说,就是如何处理多个客户端的并发请求的解决模式

posted @ 2019-03-24 20:35  jialanshun  阅读(159)  评论(0编辑  收藏  举报