httpd基本概念及IO类型

httpd早期叫做apache----a patcy server ,属于Apache软件基金会(ASF:Apache software foundation)的一个项目,后来apache更名为Httpd,因为这样更符合Http server的含义。 常见的http服务器程序有httpd(Apache)、Nginx、Lighttpd

一、httpd在服务器回应客户端时会回应相应的状态码,不同的状态码具有不同的含义

1xx:信息类

2xx:成功类

3xx:重定向类

4xx:客户端错误类

5xx:服务端错误类

二、httpd对web身份认证的支持很丰富,提供的控制也非常细致。

  • 基于ip认证
  • 基于用户认证----basic(基本认证)、digest(摘要认证)

三、httpd的特性------高度模块化 核心模块+功能模块、DSO dynamic share object 动态装卸载、多路处理模块机制MPM( Multipath processing Modules)

  • prefork:多进程模型,也是默认类型,采用预派生子进程方式,用单独的子进程来处理不同的请求,进程之间彼此独立。两级架构,主进程一个子进程若干个。
  • 几个常用选项(指令后面的#代表相应数量的数字):

    这些选项直接在主配置文件中修改(httpd-2.2,包含2.2之前),在httpd-2.4之后的版本中mpm的配置文件(/etc/httpd/conf.modules/00-mpm.conf)中编写即可

    ServerLimit # 服务器允许配置的进程数上限,在其它两种模型中因为是多级架构,所以和线程子进程的乘积等有关系

    StartServers #  httpd服务在启动时要启动的子进程数量

    MinspareServers # 在服务器启动StartsServer指定的子进程书量后每隔一秒创建一定数量的进程(是指数型的增加,第一次1个,第二次两个,第三次4个,一直增加到32个每秒后稳定增加),直到增加到MinSpareServer指定的数量

    MaxSpareServers # 这个值是设置系统最大空闲进程数量,每当大于这个数量的值时,系统会kill掉一部分子进程,但是当这个值设置的小于MinSpareServer的值时,系统会自动将该值设置为最小空闲进程数量加一

    MaxConnectionsPerchild # 这个值代表每个子进程最大能处理多少个连接之后将被系统kill掉(因为进程在使用过程当中可能有数据错误或无法以外的内存泄露等)如果设置为0则代表永不kill,这个值从httpd-2.4之后才开始叫这个名字

    MaxRequestWorkers #最大处理并发请求数量的限制2.4之后的版本才有的指令,意义等同于MaxClient

    MaxClient # MaxClients设定的是 Apache可以并发处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。ServerLimit指令无须重编译Apache就可以加大MaxClients。这个指令是httpd-2.2的

  • worker:多线程模型,为每个请求分配一个线程,三级架构,一个主进程,若干子进程,每个子进程管理若干个线程
  • event:事件驱动模型,每个进程处理多个请求有多个进程,主进程,生成多个子进程,每个子进程响应多个请求

I/0类型----同步和异步、阻塞和非阻塞;同步和异步,关注的是被调用者的消息通知机制,而阻塞与非阻塞关注的是调用者等待被调用者返回调用结果时的状态

  • 同步(synchronous):调用发出之后不会立即返回,一旦返回,就是最终结果
  • 异步(asyncronous):调用发出之后,被调用方立即返回,但不是最终结果;被调用方通过状态、通知机制等来通知调用者,或者通过回调函数来处理结果
  • 阻塞(block):调用结果返回之前,调用者会被挂起,调用者只有在得到返回结果之后才能继续
  • 非阻塞(nonblock):调用者结果返回之前,不会被挂起,即调用者不会阻塞调用者

I/O模型----阻塞IO模型、非阻塞I/O模型、I/O复用模型、事件驱动I/O模型、异步I/O模型

以read操作为例,大致分为2步:当发起请求进来后,第一步由内核向磁盘进行数据请求,并将数据复制到内核内存;第二步将内核内存数据复制到进程内存。

  1. 磁盘----->内核内存
  2. 内核内存----->进程内存
  • 阻塞IO模型

使用recv的默认参数一直等数据直到拷贝到用户空间,这段时间内进程始终阻塞。A同学用杯子装水,打开水龙头装满水然后离开。这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。

image

  • 非阻塞IO模型

改变flags,让recv不管有没有获取到数据都返回,如果没有数据那么一段时间后再调用recv看看,如此循环。B同学也用杯子装水,打开水龙头后发现没有水,它离开了,过一会他又拿着杯子来看看……在中间离开的这些时间里,B同学离开了装水现场(回到用户进程空间),可以做他自己的事情。这就是非阻塞IO模型。但是它只有是检查无数据的时候是非阻塞的,在数据到达的时候依然要等待复制数据到用户空间(等着水将水杯装满),因此它还是同步IO。

image

  • IO复用模型

这里在调用recv前先调用select或者poll,这2个系统调用都可以在内核准备好数据(网络数据到达内核)时告知用户进程,这个时候再调用recv一定是有数据的。因此这一过程中它是阻塞于select或poll,而没有阻塞于recv,有人将非阻塞IO定义成在读写操作时没有阻塞于系统调用的IO操作(不包括数据从内核复制到用户空间时的阻塞,因为这相对于网络IO来说确实很短暂),如果按这样理解,这种IO模型也能称之为非阻塞IO模型,但是按POSIX来看,它也是同步IO,那么也和楼上一样称之为同步非阻塞IO吧。

这种IO模型比较特别,分个段。因为它能同时监听多个文件描述符(fd)。这个时候C同学来装水,发现有一排水龙头,舍管阿姨告诉他这些水龙头都还没有水,等有水了告诉他。于是等啊等(select调用中),过了一会阿姨告诉他有水了,但不知道是哪个水龙头有水,自己看吧。于是C同学一个个打开,往杯子里装水(recv)。这里再顺便说说鼎鼎大名的epoll(高性能的代名词啊),epoll也属于IO复用模型,主要区别在于舍管阿姨会告诉C同学哪几个水龙头有水了,不需要一个个打开看(当然还有其它区别)。

image

  • 信号驱动IO模型

通过调用sigaction注册信号函数,等内核数据准备好的时候系统中断当前程序,执行信号函数(在这里面调用recv)。D同学让舍管阿姨等有水的时候通知他(注册信号函数),没多久D同学得知有水了,跑去装水。是不是很像异步IO?很遗憾,它还是同步IO(省不了装水的时间啊)。

image

  • 异步IO模型

调用aio_read,让内核等数据准备好,并且复制到用户进程空间后执行事先指定好的函数。E同学让舍管阿姨将杯子装满水后通知他。整个过程E同学都可以做别的事情(没有recv),这才是真正的异步IO。

image

参考源 :https://blog.csdn.net/qq_40741855/article/details/84831294

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章