Web 服务器

本章简单介绍了web服务器原理、实现以及实现处理http事务的一些细节!

Web服务器

  1. 标准计算机上安装的通用服务器,如apache
  2. 购买的服务器
  3. 嵌入式服务器

Web服务器应该做些什么

  1. 接受建立连接请求
  2. 接受请求
  3. 处理请求
  4. 访问报文中指定的资源
  5. 构建响应
  6. 发送响应
  7. 记录事务处理过程

第一步:接受客户端连接

  • 客户端收到一条连接之后,那么它将会把新连接添加到现存Web服务器连接列表中,用于监视当前连接上的数据传输情况。期间服务器还应该做到通过一定的设备机制阻止未认证或已知恶意黑名客户端的连接,相关设别技术有:客户端主机名设别、通过ident设别客户端用户等!

第二步:接收请求报文

  • 主要经过几个步骤来解析报文:
    • 解析请求行,得知方法、url、协议版本,以及crlf符
    • 解析得到以crlf结尾的首部
    • 得到以crlf结尾,标志首部结束的空行(如果有的话)
    • 解析得到主体,(如果有的话)
  • Web服务可能还会把请求报文用一种自己能快速处理的内部数据结构来存储请求报文!
  • 不同的服务器配置预示它能同时处理的事务情况:
    • 单线程Web服务器:只能处理一个请求,待当前请求处理完成之后才能处理下一个请求!优点:简单已于实现,适用于低负荷服务器。缺点:不能及时处理其他请求,容易引发延迟过长而导致性能问题。
    • 多线程及多进程Web服务器:能同时处理多个请求!优点:响应及时。缺点:构建复杂,容易快速引起内存消耗过大而死机!最好应该对能同时处理的连接数量进行限制!
    • 复用i/o的Web服务器:复用i/o
    • 复用i/o和多线程的Web服务器:2和3的结合

第三步:处理请求

这点留在本书其余章节大篇幅介绍!

第四步:对资源的映射及访问

  • 这里介绍了请求资源的一种路径映射关系,说白了就是找到客户端请求资源在服务器的上的目录路径!相关概念有:docroot(文档根目录)、不允许访问根目录的上一级目录。
  • 虚拟托管的docroot:在一个服务器上挂了几个Web站点,那么这样当请求的资源路径相同时,服务器应该从请求报文首部的host、uri字段找出真正的资源目录,这些目录都是可以配置的!
  • 注:这里对用户配置文件根目录和虚拟目录做一下示例说明,以apache为例:
      配置文件根目录
      在配置文件httpd.conf中添加一个DocumentRoot行就可以为Apache Web服务器设置文档的根目录了,如:
          DocumentRoot /user/local/httpd/files
      配置虚拟目录
      对大多数Web服务器来说,配置虚拟托管的文档根目录是很简单的。对常见的Apache Web服务器来说,需要为每个虚拟Web
      站点配置一个VirtualHosts块,而且每个虚拟服务器都要包含DocumentRoot,如:
      <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>
         ...
    

第五步:构建响应

  • 构建响应报文:1、正确设置响应主体的长度(content-length);2、设置报文的mime类型(content-type),主要通过与一直mime类型文件匹配得到当前的文件的mime类型,还可以通过文件扩展名,以及硬规定特定目录下的文件拥有某个mime类型;3、控制重定向!
  • 服务器端如何得出文件的MIME类型:
        Web服务器要负责确定响应主体的MIME类型。有很多配置服务器的方法可以将MIME类型与资源关联起来。
        1、MIME类型(mime.types)
           Web服务器可以用文件的扩展名来说明MIME类型。Web服务器会为每个资源扫描一个包含了所有扩展名的MIME类型的文件,以确定其MIME类型。这种基于扩展名的类型相关是最常见的!
        2、魔法分类(Magic typing)
           Apache Web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文
           件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名的时候。
        3、显示分类(Explicit typing)
           可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型
        4、类型协商
           有些Web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置Web服务器,使其可以通过与用户的协商来是决定使用哪种格式(及相关的MIME类型)“最好”。
    
重定向
  • 有时服务器需要返回重定向报文来构建响应,重定向响应由返回码3XX说明。Location响应首部包含了内容的新地址或优选地址的URL。重定向可用于下列情况。
    • 永久删除的资源,状态码为301
    • 临时删除的资源,状态码为303或307
    • URL增强,状态码为303或307
    • 负载均衡,主要是减少服务器的压力,让请求跑到一个负载不大的服务器上去,状态码为303或307
    • 服务器关联,去保存有用户本地信息的服务器上获取用户信息,状态码为303或307
    • 规范目录名称,客户端请求的URI是一个不带尾部斜线的目录名时,大多数Web服务器都会将客户端重定向到一个加了斜线的URI上,这样相对链接就可以正常工作了!

第六步:发送响应

第七步:记录事务日志

Web服务器日志文件中添加一个条目,以描述当前事务处理情况!

下一节:本章主要介绍了http代理方面的概念,包括代理的配置、分类、作用等!