Web服务器
Web服务器会做些什么
(1) 建立连接——接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭。
(2) 接收请求——从网络中读取一条HTTP 请求报文。
(3) 处理请求——对请求报文进行解释,并采取行动。
(4) 访问资源——访问报文中指定的资源。
(5) 构建响应——创建带有正确首部的HTTP 响应报文。
(6) 发送响应——将响应回送给客户端。
(7) 记录事务处理过程——将与已完成事务有关的内容记录在一个日志文件中。
第一步——接受客户端连接
处理新连接
客户端请求一条到Web 服务器的TCP 连接时,Web 服务器会建立连接,判断连接的另一端是哪个客户端,从TCP 连接中将IP 地址解析出来。
客户端主机名识别
可以用“反向DNS”对大部分Web 服务器进行配置,以便将客户端IP 地址转换成客户端主机名
例5-2 配置Apache,为HTML 和CGI 资源查找主机名
HostnameLookups off <Files ~ "\.(html|htm|cgi)$"> HostnameLookups on </Files>
通过ident确定客户端用户
第二步——接收请求报文
解析请求报文时,Web 服务器会:
• 解析请求行,查找请求方法、指定的资源标识符(URI)以及版本号, 各项之间由一个空格分隔,并以一个回车换行(CRLF)序列作为行的结束
• 读取以 CRLF 结尾的报文首部;
• 检测到以 CRLF 结尾的、标识首部结束的空行(如果有的话);
• 如果有的话(长度由 Content-Length 首部指定),读取请求主体。
解析请求报文时,Web 服务器会不定期地从网络上接收输入数据。网络连接可能随时都会出现延迟。Web 服务器需要从网络中读取数据,将部分报文数据临时存储在内存中,直到收到足以进行解析的数据并理解其意义为止
报文的内部表示法
连接的输入/输出处理结构
高性能的Web 服务器能够同时支持数千条连接
因为请求可能会在任意时刻到达,所以Web 服务器会不停地观察有无新的Web 请求。不同的Web 服务器结构会以不同的方式为请求服务。
• 单线程 Web 服务器
单线程的Web 服务器一次只处理一个请求,直到其完成为止。一个事务处理结束之后,才去处理下一条连接。这种结构易于实现,但在处理过程中,所有其他连接都会被忽略。这样会造成严重的性能问题,只适用于低负荷的服务器,以及
type-o-serve 这样的诊断工具。
• 多进程及多线程 Web 服务器
多进程和多线程Web 服务器用多个进程,或更高效的线程同时对请求进行处理。5可以根据需要创建,或者预先创建一些线程/ 进程。6 有些服务器会为每条连接分配一个线程/ 进程,但当服务器同时要处理成百、上千,甚至数以万计的连接时,需要的进程或线程数量可能会消耗太多的内存或系统资源。因此,很多多线程Web 服务器都会对线程/ 进程的最大数量进行限制。
• 复用 I/O 的服务器
为了支持大量的连接,很多Web 服务器都采用了复用结构。在复用结构中,要同时监视所有连接上的活动。当连接的状态发生变化时(比如,有数据可用,或出现错误时),就对那条连接进行少量的处理;处理结束之后,将连接返回到开放连接列表中,等待下一次状态变化。只有在有事情可做时才会对连接进行处理;在空闲连接上等待的时候并不会绑定线程和进程。
• 复用的多线程 Web 服务器
有些系统会将多线程和复用功能结合在一起,以利用计算机平台上的多个CPU。多个线程(通常是一个物理处理器)中的每一个都在观察打开的连接(或打开的连接中的一个子集),并对每条连接执行少量的任务。
第三步——处理请求
一旦Web 服务器收到了请求,就可以根据方法、资源、首部和可选的主体部分来对请求进行处理了。
有些方法(比如POST)要求请求报文中必须带有实体主体部分的数据。其他一些方法(比如OPTIONS)允许有请求的主体部分,也允许没有。少数方法(比如GET)禁止在请求报文中包含实体的主体数据。
第四步——对资源的映射及访问
Web 服务器是资源服务器。它们负责发送预先创建好的内容,比如HTML 页面或JPEG 图片,以及运行在服务器上的资源生成程序所产生的动态内容。
1、docroot
Web 服务器支持各种不同类型的资源映射,但最简单的资源映射形式就是用请求URI 作为名字来访问Web 服务器文件系统中的文件。通常,Web 服务器的文件系统中会有一个特殊的文件夹专门用于存放Web 内容。这个文件夹被称为文档的根目录(document root,或docroot)。Web 服务器从请求报文中获取URI,并将其附加在文档根目录的后面。
有一条对/specials/saw-blade.gif 的请求到达。这个例子中Web 服务器的文档根目录为/usr/local/httpd/files。Web 服务器会返回文件/usr/local/httpd/files/specials/saw-blade.gif。
Apache Web 服务器虚拟主机的docroot 配置 <VirtualHost www.joes-hardware.com> ServerName www.joes-hardware.com DocumentRoot /docs/joe TransferLog /logs/joe.access_log ErrorLog /logs/joe.error_log </VirtualHost> <VirtualHost www.marys-antiques.com> ServerName www.marys-antiques.com DocumentRoot /docs/mary TransferLog /logs/mary.access_log ErrorLog /logs/mary.error_log </VirtualHost> ...
第五步——构建响应
响应实体
• 描述了响应主体 MIME 类型的 Content-Type 首部;
• 描述了响应主体长度的 Content-Length 首部;
• 实际报文的主体内容。
• MIME 类型(mime.types)
第六步——发送响应
第七步——记录日志