zoukankan      html  css  js  c++  java
  • Nginx源码结构及如何处理请求

    一、源码结构
     
    1:下载安装包后,解压,可以看到目录结构,其中src目录下放的是源码
     
     
     
    2:src源码目录下,可以看到这几个目录
     
     
    mail:mail目录中存放了实现Nginx服务器邮件服务的源码,主要实现对邮件服务依赖的数据结构的定义和初始化,对SMTP协议、POP3协议和IMAP协议的实现,以及对SSL的支持。
    misc:包含两个文件,一个是测试程序中引用的头文件是否与C++兼容,一个是支持Google PerfTools的使用
    os:os目录只有一个unix目录,里面是针对类Unix的源码
    core:core目录的源码定义了Nginx服务器赖以允许的最基础的数据结构,实现了对他们的基本操作,也实现了用户各模块公共调用的基本功能。
    event:event里的源码实现了Nginx服务器的事件驱动模型,实现了Nginx服务器的消息机制
    http:http目录里的源码为nginx服务器提供Web服务器提供了主要的支持
     
    二、Nginx服务器的Web请求处理机制(暂且这么理解,总感觉真正的不是这样的)
     
    1:同步与异步机制:描述通信模式的概念
     
    同步机制:指的是发送方发送请求后,需要等到接收方发回的响应后,才接着发下一个请求。
     
     
     
    异步机制:发送方发出一个请求后,不等待接收方响应这个请求,就可以继续发送下一个请求
     
     
     
     
    2:阻塞与非阻塞:描述进程处理调用的方式
     
    阻塞:调用结果返回之前,当前进程一直被挂起,一直等到调用结果返回之后,才进入就绪状态,获取CPU后继续执行
     

     
    非阻塞:调用结果没有返回之前,当前线程不会被挂起,而是立即返回执行下一个调用
     
     
     
    Nginx服务器如何处理请求:
     
    Nginx服务器的一个显著优势是能够同时处理大量并发请求,它结合多进程机制和异步非阻塞机制对外提供服务
    Nginx服务启动后,可以产生一个主进程(master process)和多个工作进程(workerprocess),Nginx所有的工作进程都用于接收和处理客户端的请求
     
    每个工作进程都使用了异步非阻塞方式,可以处理多个客户端请求,当某个进程接收到客户端的请求后,调用IO进行处理,如果不能立即得到结果,就去处理其他的请求;而客户端在此期间也无需等待,可以去处理其他的事情;当IO调用返回结果时,就会通知此工作进程;该进程得到通知,暂时挂起当前处理的事物,去响应客户端的请求。
     
    select、epoll、poll、kqueue等这样的系统调用就是用来支持解决在IO调用在完成后能主动通知工作进程,这些系统调用也常被称为时间驱动模型,他们提供了一种机制,让进程可以同时处理多个并发请求,不用关心IO调用的具体状态。IO调用完全由事件驱动模型来管理,事件准备好后就通知工作进程事件已经就绪。
     
     
     
    select库:
     
    1)创建所关注事件的描述符集合。对于一个描述符,可以关注读(read)事件、写(write)事件、以及异常(Exception)事件。所以创建三类事件的描述符集合,分别用来收集读事件、写事件、异常事件的描述符。
     
    2)调用底层提供的select()函数等待事件发生
     
    3)然后轮询所有事件描述符集合中的每一个事件描述符,检查是否有相应的事件发生,如果有就进行处理
     
    poll库:
     
    与select库的工作方式一样,先创建一个关注事件的描述符集合,再去等待事件发生,然后轮询描述符集合,检查有没有事件发生,如果有就进行处理
     
    区别:select需要为读事件、写事件、异常事件分别穿件一个描述符集合,在最后轮询的时候需要分别轮询这三个集合。而poll只需要创建一个集合,在每个描述符对应的结构上分别设置读事件、写事件、或异常事件、最后轮询的时候,可以同时检查这三种事件是否发生。
     
     
     
    epoll库:
     
    把描述符列表的管理交由内核负责,一旦有某种事件发生,内核把发生事件的描述符列表通知给进程,这样就避免了轮询整个描述符列表。
     
     
     
     
    注:学习《nginx高性能Web服务器详解》的时候总结
  • 相关阅读:
    Xcode7 真机调试步骤以及遇到的问题解决办法
    AndroidStudio .gitinore编写
    Android Studio Jar、so、library项目依赖
    Android studio导入eclipse项目混淆打包出错
    spring中ref属性与<ref/>标签
    NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.servlet.view.InternalResourceViewResolver' available
    Maven学习笔记
    Tomcat日志与Log4j日志
    Git笔记
    Tomcat学习
  • 原文地址:https://www.cnblogs.com/lemon-le/p/7823276.html
Copyright © 2011-2022 走看看