Apache与Nginx对客户端请求的处理机制对比

模块

  1. 大致为四个模块,核心模块、HTTP模块、邮件模块,以及第三方模块
  2. 核心模块主要包含两类功能的支持,一类是主体功能,包括进程管理,权限管理,错误日志分析,配置解析。另一类是用于响应请求事件必须的功能,包括事件驱动机制,正则表达式。

APache对客户端请求的处理机制

web-server与client是一对多关系,apache完成并行处理的工作方式如下三种:

  1. 多进程方式

    服务器收到一个请求,其主进程生成一个子进程来处理请求,处理完毕,进程结束。
    为了应对大量请求,apache采用预派生进程的机制来对多进程进行改进。预进程机制就是在请求没到达之前就预先生成好,当请求来的时候主进程分配一个进程与客户端进行交互,交互完成之后,该进程也不结束,而被主进程管理起来等待下一个客户请求的到来。

  2. 多线程方式

    服务器主进程派生一个线程和客户端进行交互。服务器生成一个线程的开销远比进程的开销小,多个线程共享主进程管理的资源。

  3. 异步方式

    发送方在发送一个请求之后,不等待接收方响应这个请求,就继续发送下一个请求,在异步机制中,所有来自发送方的请求形成一个队列,接收方处理完之后才通知发送方。

    同步机制:发送方发送一个请求之后,等待接收方响应这个请求,再继续发送下一个请求。

Nginx对客户端请求的处理机制

Nginx服务器能同时处理大量的请求,结合了多进程机制和异步非阻塞机制。

Nginx服务器启动之后,可以产生一个主进程和多个work进程。Nginx服务器的所有进程用于接收客户端请求,类似与apache的多进程机制,预先派出工作进制,等待客户端请求。

每个work进程使用异步非阻塞方式,可以处理多个客户端的请求。当某个IO请求不能立即得到结果的时候就去处理其他的请求,而客户端在此期间也不需要等待,可以去处理其他的请求,当IO调用返回结果的时候就会通知此work进程,该进程得到通知,暂时挂起当前事务去响应客户端要求。

Nginx的事件驱动模型

IO调用结果如何把自己的状态告诉进程,两种方案

  • work进程过一段时间就去检查一下IO的运行状态,完成则响应,未完成则继续工作。
  • IO调用完之后主动通知work进程

selectpollepoll三种事件驱动模型属于上述的第二种方式

  1. select

    • 创建事件的描述符集合,对于一个事件,关注其上面的读事件、写事件和异常事件,创建三类事件的描述符集合,分别用来收集三种类型的描述符。
    • 其次调用底层select()函数,等待事件发生,轮询所有时间描述符中的每一个描述符,检查是否有事件发生,有则处理,无则继续监听
  2. poll

    • poll和select方式相同,创建描述符的集合,等待事件发生,轮询描述符集合,检查有没有事件发生
    • poll与select的区别在于:select需要为读事件、写事件、异常事件分别创建一个描述符集合,轮询三个集合,而poll库只需要创建一个集合,而每个描述符上面对应的结构分别设置为读事件或写事件或异常事件,轮询一个集合,同时检查这三个事件是否发生。
  3. epoll

    • select和poll都是创建一个待处理的事件列表,然后将列表发给内核,返回时,再去轮询这个列表,来判断是否有事件发生,效率低下。比较好的做法是把描述符列表的管理交给内核负责,一旦有某种事件发生,内核把发生事件的描述符通知给进程,避免轮询整个描述符列表。
    • epoll就是上述做法。通过相关调用通知内核创建一个有N个描述符的列表,给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去,在具体编码过程中也可以通过相关调用删除列表中的描述符。
    • 完成设置之后,epoll就开始等待内核通知事件,某一事件发生以后,内核就将发生事件的描述符传给epoll,得知事件列表的epoll库,就可以开始进行事件处理了。

    • epoll的高效在于它支持一个进程打开大数目的事件描述符,上限是系统可以打开的文件的数目,同时,epoll库的IO效率不随描述符的增加而线性下降。

    epoll有两种工作模式:
    - 水平触发:内核通知进程来读取数据,进程没来读取数据,内核就一次一次通知进程
    - 边缘触发:内核只通知一次让进程来读取数据,进程可以在超时时间内随时来读取数据

备注:这里只是简单的进行了比较和对三种驱动模型的简单介绍,后面会更新更详细的介绍,具体到函数调用

Apache与Nginx对客户端请求的处理机制对比的更多相关文章

  1. nginx截获客户端请求

    使用nginx可以直接截获客户端请求,以下是最近收集的一些判断截获的信息的配置,为查看方便记录如下: 1.根据UA和cookie判断当前是移动端还是PC端访问: if ($http_host !~ & ...

  2. Nginx控制客户端请求的速率

    使用ngx_http_limit_req_module模块的两个参数 ngx_http_limit_req_module模块用于限制每个IP访问每个定义key的请求速率 1.limit_req_zon ...

  3. 从Nginx的Web请求处理机制中剖析多进程、多线程、异步IO

    Nginx服务器web请求处理机制 从设计架构来说,Nginx服务器是与众不同的.不同之处一方面体现在它的模块化设计,另一方面,也是最重要的一方面,体现在它对客户端请求的处理机制上. Web服务器和客 ...

  4. JAVA获取客户端请求的当前网络ip地址(附:Nginx反向代理后获取客户端请求的真实IP)

    1. JAVA获取客户端请求的当前网络ip地址: /** * 获取客户端请求的当前网络ip * @param request * @return */ public static String get ...

  5. 控制nginx并发链接数量和客户端请求nginx的速率

    一.控制nginx并发链接数 ngx_http_limit_conn_module这个模块用于限制每个定义的key值的链接数,特别是单IP的链接数. 不是所有的链接数都会被计数,一个符合计数要求的连接 ...

  6. Nginx优化防爬虫 限制http请求方法 CDN网页加速 架构优化 监牢模式 控制并发量以及客户端请求速率

    Nginx防爬虫优化 Robots协议(也称为爬虫协议,机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可 ...

  7. 给nginx添加客户端的请求最大单文件限制

    在nginx.conf中添加如下. client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲 ...

  8. 配置apache和nginx的tomcat负载均衡

    概述 本篇文章主要介绍apache和nginx的相关配置,tomcat的相关安装配置我在前面有写过一篇,详细介绍通过两种配置方法配置nginx. tomcat配置参考:http://www.cnblo ...

  9. 关于配置并发访问的服务器apache、nginx

    一. apache,nginx比较     关于Apache与Nginx的优势比较  (apache计算密集型   nginx io密集型  各有优势,不存在谁取代谁) 二.nginx 基于nginx ...

随机推荐

  1. Android BLE 蓝牙编程(三)

    上节我们已经可以连接上蓝牙设备了. 本节我们就要获取手环的电池电量和计步啦. 在介绍这个之前我们需要先了解下什么是 服务 什么是 UUID 我们记得上节中我们item监听事件的回调的返回值是Bluet ...

  2. Spring IOC容器创建对象的方式

    一.无参构造函数创建                                                                            我们用Spring创建Stu ...

  3. cosbench 异常 FreeMarker template error: The following has evaluated to null or missing

    问题现象: 使用Cosbench 0.4.2.c4 版本测试Ceph RGW read test失败,遇到异常如下: FreeMarker template error: The following ...

  4. 【转】Java面试题全集2.2(上)

    146.什么是IoC和DI?DI是如何实现的? 答:IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠 ...

  5. 微信JSSDK javascript 开发 代码片段,仅供参考

    最全面最专业的微信公众平台开发教程:http://www.cnblogs.com/txw1958/p/weixin-js-sdk-demo.html 比较完整的分享教程:http://www.cnbl ...

  6. SpringBoot源码解析:tomcat启动分析

    >> spring与tomcat的启动分析:war包形式 tomcat:xml加载规范 1.contex-param: 初始化参数 2.listener-class: contextloa ...

  7. android 手机去哪儿7.2版本客户端 账号存储信息分析

    1.data/data/com.qunar sharepref 文件夹下的Qunarperferences.xml文件中 username,phone等均为加密处理过字段   2.jdgui下查找关键 ...

  8. JSF primefaces session view expired 会话失效后页面跳转

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  9. 【CityHunter】基于LBS的AR体感游戏设计理念

    本人目前还不是游戏行业的圈内人士,并不懂得,游戏行业的生态圈,也不懂得,所谓的什么“中国市场环境”.所以不敢发表关于这方面的见解,不过我在这里想要插一句话,就是我认为啊,行业内,人与人之间还是有分层次 ...

  10. ps你最容易忽略的知识

    了解更多ps知识 1. 快速打开文件­ 双击Photoshop的背景空白处(默认为灰色显示区域)即可打开选择文件的浏览窗口.­ 2. 随意更换画布颜色­ 选择油漆桶工具并按住Shift点击画布边缘,即 ...