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

时间:2022-08-28 09:14:56

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. 动态加载js文件

    由于最近在弄echarts,关于地图类的效果,但是全国地图整体的js文件太大了,加载很耗费资源,所以要根据不同省份加载不同地区的js地图, 于是就想的比较简单, var script = docume ...

  2. java.lang.ClassNotFoundException: net.sf.json.JSONArray,java.lang.NoClassDefFoundError: net/sf/json/JSONArray jetty跑项目遇到的问题

    2016-05-18 15:44:25 ERROR Dispatcher.error[user:|url:]:L38 - Dispatcher initialization failed Unable ...

  3. Failed to load or instantiate

    Failed to load or instantiate: add this code in your xml: xmlns:android="http://schemas.android ...

  4. PostgreSQL增删数据命令示例

    在PostgreSQL中如何用简单的几条SQL语句生成大量的测试数据呢? 此处,我简单的写一个例子,供参考(在Postgresql9.1下面做的): (1)生成一万条测试数据的表foo mydb=# ...

  5. shell ulimit -n

    通过ulimit -n命令可以查看linux系统里打开文件描述符的最大值,一般缺省值是1024,

  6. C#_判断2个对象的值是否相等

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. java简易编辑器

    package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swi ...

  8. 【SqlServer系列】表单查询

    1   概述 如下几个问题,如果你能解决,请继续往下看,若不能解决,请先复习SQL基础知识,再来阅读本篇文章.本篇文章深度中等左右. Q1:表StudentScores如下,用一条SQL语句查询出每门 ...

  9. js post 下载文件

    function DownLoadPost(url,data) { if (url && data) { var form = $('<form>{{ xsrf_form_ ...

  10. SAP订单状态最详细的解释

    order status description explanation CRTD 建立 生产订单创建时的状态,表明订单处于刚刚创建时点,不允许做后续发料,确认等操作. PREL 部分释放(部分下达) ...