Apache与Nginx对客户端请求的处理机制对比
Apache与Nginx对客户端请求的处理机制对比
模块
- 大致为四个模块,核心模块、HTTP模块、邮件模块,以及第三方模块
- 核心模块主要包含两类功能的支持,一类是主体功能,包括进程管理,权限管理,错误日志分析,配置解析。另一类是用于响应请求事件必须的功能,包括事件驱动机制,正则表达式。
APache对客户端请求的处理机制
web-server与client是一对多关系,apache完成并行处理的工作方式如下三种:
多进程方式
服务器收到一个请求,其主进程生成一个子进程来处理请求,处理完毕,进程结束。
为了应对大量请求,apache采用预派生进程的机制来对多进程进行改进。预进程机制就是在请求没到达之前就预先生成好,当请求来的时候主进程分配一个进程与客户端进行交互,交互完成之后,该进程也不结束,而被主进程管理起来等待下一个客户请求的到来。多线程方式
服务器主进程派生一个线程和客户端进行交互。服务器生成一个线程的开销远比进程的开销小,多个线程共享主进程管理的资源。
异步方式
发送方在发送一个请求之后,不等待接收方响应这个请求,就继续发送下一个请求,在异步机制中,所有来自发送方的请求形成一个队列,接收方处理完之后才通知发送方。
同步机制:发送方发送一个请求之后,等待接收方响应这个请求,再继续发送下一个请求。
Nginx对客户端请求的处理机制
Nginx服务器能同时处理大量的请求,结合了多进程机制和异步非阻塞机制。
Nginx服务器启动之后,可以产生一个主进程和多个work进程。Nginx服务器的所有进程用于接收客户端请求,类似与apache的多进程机制,预先派出工作进制,等待客户端请求。
每个work进程使用异步非阻塞方式,可以处理多个客户端的请求。当某个IO请求不能立即得到结果的时候就去处理其他的请求,而客户端在此期间也不需要等待,可以去处理其他的请求,当IO调用返回结果的时候就会通知此work进程,该进程得到通知,暂时挂起当前事务去响应客户端要求。
Nginx的事件驱动模型
IO调用结果如何把自己的状态告诉进程,两种方案
- work进程过一段时间就去检查一下IO的运行状态,完成则响应,未完成则继续工作。
- IO调用完之后主动通知work进程
select
、poll
、epoll
三种事件驱动模型属于上述的第二种方式
select
- 创建事件的描述符集合,对于一个事件,关注其上面的读事件、写事件和异常事件,创建三类事件的描述符集合,分别用来收集三种类型的描述符。
- 其次调用底层select()函数,等待事件发生,轮询所有时间描述符中的每一个描述符,检查是否有事件发生,有则处理,无则继续监听
poll
- poll和select方式相同,创建描述符的集合,等待事件发生,轮询描述符集合,检查有没有事件发生
- poll与select的区别在于:select需要为读事件、写事件、异常事件分别创建一个描述符集合,轮询三个集合,而poll库只需要创建一个集合,而每个描述符上面对应的结构分别设置为读事件或写事件或异常事件,轮询一个集合,同时检查这三个事件是否发生。
epoll
- select和poll都是创建一个待处理的事件列表,然后将列表发给内核,返回时,再去轮询这个列表,来判断是否有事件发生,效率低下。比较好的做法是把描述符列表的管理交给内核负责,一旦有某种事件发生,内核把发生事件的描述符通知给进程,避免轮询整个描述符列表。
- epoll就是上述做法。通过相关调用通知内核创建一个有N个描述符的列表,给这些描述符设置所关注的事件,并把它添加到内核的事件列表中去,在具体编码过程中也可以通过相关调用删除列表中的描述符。
完成设置之后,epoll就开始等待内核通知事件,某一事件发生以后,内核就将发生事件的描述符传给epoll,得知事件列表的epoll库,就可以开始进行事件处理了。
epoll的高效在于它支持一个进程打开大数目的事件描述符,上限是系统可以打开的文件的数目,同时,epoll库的IO效率不随描述符的增加而线性下降。
epoll有两种工作模式:
- 水平触发:内核通知进程来读取数据,进程没来读取数据,内核就一次一次通知进程
- 边缘触发:内核只通知一次让进程来读取数据,进程可以在超时时间内随时来读取数据
备注:这里只是简单的进行了比较和对三种驱动模型的简单介绍,后面会更新更详细的介绍,具体到函数调用
Apache与Nginx对客户端请求的处理机制对比的更多相关文章
- nginx截获客户端请求
使用nginx可以直接截获客户端请求,以下是最近收集的一些判断截获的信息的配置,为查看方便记录如下: 1.根据UA和cookie判断当前是移动端还是PC端访问: if ($http_host !~ & ...
- Nginx控制客户端请求的速率
使用ngx_http_limit_req_module模块的两个参数 ngx_http_limit_req_module模块用于限制每个IP访问每个定义key的请求速率 1.limit_req_zon ...
- 从Nginx的Web请求处理机制中剖析多进程、多线程、异步IO
Nginx服务器web请求处理机制 从设计架构来说,Nginx服务器是与众不同的.不同之处一方面体现在它的模块化设计,另一方面,也是最重要的一方面,体现在它对客户端请求的处理机制上. Web服务器和客 ...
- JAVA获取客户端请求的当前网络ip地址(附:Nginx反向代理后获取客户端请求的真实IP)
1. JAVA获取客户端请求的当前网络ip地址: /** * 获取客户端请求的当前网络ip * @param request * @return */ public static String get ...
- 控制nginx并发链接数量和客户端请求nginx的速率
一.控制nginx并发链接数 ngx_http_limit_conn_module这个模块用于限制每个定义的key值的链接数,特别是单IP的链接数. 不是所有的链接数都会被计数,一个符合计数要求的连接 ...
- Nginx优化防爬虫 限制http请求方法 CDN网页加速 架构优化 监牢模式 控制并发量以及客户端请求速率
Nginx防爬虫优化 Robots协议(也称为爬虫协议,机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可 ...
- 给nginx添加客户端的请求最大单文件限制
在nginx.conf中添加如下. client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲 ...
- 配置apache和nginx的tomcat负载均衡
概述 本篇文章主要介绍apache和nginx的相关配置,tomcat的相关安装配置我在前面有写过一篇,详细介绍通过两种配置方法配置nginx. tomcat配置参考:http://www.cnblo ...
- 关于配置并发访问的服务器apache、nginx
一. apache,nginx比较 关于Apache与Nginx的优势比较 (apache计算密集型 nginx io密集型 各有优势,不存在谁取代谁) 二.nginx 基于nginx ...
随机推荐
- 恢复 Windows 7 的“回到父目录”按钮
Windows 7 使用以来很多方面一直不习惯,特别是让我无比纠结的”回到父目录“ 按钮从资源管理器中消失了. 不能不说这是一个失败! 很多时候,Win 7 地址栏中自以为是的显示的很多层目录层次的面 ...
- FPGA与simulink联合实时环路系列——实验一 测试
实验一 测试 实验内容 在simulink创建测试模块,通过测试模块产生信号,再传送到FPGA,FPGA读出后再将信号无处理传送回simulink进行显示.由此来测试整个硬件在环的功能是否正常,并且熟 ...
- 【JavaScript】【CSS】前端规则摘抄
源:http://zhibimo.com
- webpack --- 详解
官网: http://webpack.github.io/docs/using-loaders.html 简书: http://www.jianshu.com/p/42e11515c10f
- jq实现点击某元素之外触发事件
<script type="text/javascript"> $(document).bind("click",function(e){ var ...
- Ubuntu16.04/LinuxMint18安装openjdk-7-jdk
LinuxMint18的安装源已经默认没有openjdk7了,所以要自己手动添加仓库,如下: sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-ge ...
- String()与 toString()
我们知道String()与 .toString()都是可以转换为字符串类型,但是String()与 .toString()的还是有区别的 1..toString()可以将所有的的数据都转换为字符串,但 ...
- Two-Pointer 之 Run Length Coding (RLC)
游程编码(Run Length Coding, RLC)是串处理中常见的预处理方法.其写法是典型的双指针(Two-Pointer).下面总结其写法1.输入为一串整数可以不把整数存在数组里
- GIT本地配置和PUSH
因为GIT使用的是LINUX命令,所以可以参考LINUX的相关命令 一.在本地配置好GIT仓库: 1.首先进入当前工程的目录:cd [filepath] (记住这里的目录应该用/,因为LINUX是这样 ...
- linux集群时钟问题
一.ntpd与ntpdate的区别: 摘自:ntpd与ntpdate的区别 - 百事乐 - 博客园 http://www.cnblogs.com/liuyou/archive/2012/07/29/ ...