zoukankan      html  css  js  c++  java
  • 《HTTP权威指南》读书笔记第五章:web服务器

    ps:说起服务器来,刚开始的时候觉得这个东西很神奇,一直把它放在神坛的位置,那个时候也没有人给我好好讲讲这个东西。现在仔细回想起来,其实说白了web服务器也只不过是运行在操作系统之上的一个软件而已,并不算神奇,没有必要把它放在神坛,更没有必要XXXX。最近在看《HTTP权威指南》这本书,书中有讲到web服务器以及之前有一些涉及,算是对它有一个更进一步的认识,同时刚学完计算机网络课程来看这本书就相对轻松一些了。最好能够自己新手搭建一下是最好的。

    一、web服务器是什么

    web服务器逻辑实现了HTTP协议、管理着web资源,并负责提供web服务器的管理功能。web服务器逻辑和操作系统共同负责管理TCP连接。底层操作系统负责管理底层计算机系统的硬件细节,并提供了TCP/IP网络支持,负责装载web资源的文件系统以及控制当前计算机的进程管理功能。

    web服务器的形式:

    1、运行于计算机操作系统上的通用的软件web服务器。(如:apache,nginx等,市场份额可以参见:http://news.netcraft.com/

    2、web服务器设备。即预先打包好的软硬件解决方案。

    3、计算机芯片上实现嵌入式的web服务器。

    二、实际的web服务器做些什么

    1、建立链接

    接受一个客户端的连接,或者不希望与这个客户端建立连接,就将其关闭。

    世界上几乎所有的HTTP通信都是由TCP/IP承载,HTTP连接其实就是TCP连接及其使用规则。TCP为HTTP提供了一条可靠的比特传输管道。

    example:web浏览器通过TCP与WEB服务器进行交互的过程

    用浏览器打开http://www.baidu.com经历的过程

    (1)、浏览器解析出主机名www.baidu.com

    (2)、浏览器查询这个主机名的IP地址(DNS),可知百度主机的ip地址为:115.239.210.26

    (3)、浏览器获取端口号(通常默认为80,注:https的默认端口是:443)

    (4)、浏览器发起到115.239.210.26端口80的连接

    (5)、浏览器向服务器发送一条HTTP GET报文

    (6)、浏览器从服务器读取HTTP响应报文

    (7)、浏览器关闭连接(浏览器如何渲染请自行搜索)

    这个阶段服务器需要:处理新连接,将IP地址从TCP地址中解析出来。一旦新连接建立起来,服务器会将新连接添加到其现在web服务器连接列表中,做好监视连接上数据传输的准备。其中涉及客户端主机识别问题(可以通过反向dns参见:http://hi.baidu.com/77941/item/a034f850aed226948d12ed6a#713670-tsina-1-96822-128ff9f28d958dae738be418601ffbcd,通过ident确定客户端用户)。

    2、接收请求

    从网络中读取一条HTTP请求报文。

    连接上有数据到达时,web服务器会从网络连接中读取数据,并解析请求报文。

    解析报文时,服务器会:

    (1)、解析请求行,查找请求方法、指定的资源标识符以及版本号,各项之间由一个空格分隔开来,并以一个回车CRLF作为行的结束。

    (2)、读取以CRLF为结尾的报文首部

    (3)、检测以CRLF结尾的、标识首部结束的空行

    (4)、如果有请求主体,则读取请求主体

    解析报文会时,服务器会不定时的接收输入数据,直到足以解析的数据并理解其意义为止。

    对于链接的输入/输出处理结构的不同可以分为:

    单线程服务器,多进程多线程服务器,复用I/O服务器,复用的多线程服务器。

    3、处理请求

    对请求报文进行解释,并采取行动。

    4、访问资源

    访问指定的资源。WEB服务器就是资源服务器。在发送响应之前需要将请求报文中的URI映射为WEB服务器上适当的内容或者内容生成器。WEB服务器支持不同资源类型的映射,最简单的就是用请求URI作为名字来访问WEB服务器文件系统中的文件。

    在apache中,在http.conf文件中可以指定服务器文档根目录

    服务器在实现需要注意不能让客户访问除文档目录下的其它东西,如不允许url为http://www.baidu.com/../访问根目录的上一级目录

    虚拟托管与docroot:

    通常同一台WEB服务器上提供多个站点,每个站点都有自己的独有的文档根目录。虚拟托管WEB服务器会根据URI或者Host首部的IP地址或者主机名来识别要使用的正确文档根目录。

    对于apache来说需要为每个虚拟的web站点配置一个virtualhost块,而且每个虚拟服务器都要包含documentRoot。

    apache虚拟主机搭建:http://www.neoease.com/apache-virtual-host/

    (图片截取于:http://www.neoease.com/apache-virtual-host/

    服务器可以接收对目录的url的请求,其路径可以解析为一个目录,而不是文件。可以对服务器进行配置,使其在客户端请求目录url时采取不同的动作,比如返回一个错误、不返回目录而返回一个特殊的默认“索引文件”、扫描目录返回一个包含目录内容的html页面。

    大多数服务器会去查找一个名为Index.html或者Index.htm文件。

    在apache下可以通过DirecrotryIndex来配置:(让我突然想起来刚开始接触网站相关的东西时,搞不清楚是先访问index.html还是先访问index.php)

    如果没有提供默认的索引文件,而且没有禁止使用目录索引,则返回一个html文件,列出那个目录里的所有文件。

    apache下可以通过Options -Indexes来禁止。

    动态内容资源映射:

    大多数服务器都能够分辨出资源什么时候动态,动态内容生成程序位于何处,以及如何运行程序。

    比如,在搭建apache+php+mysql的开发环境时,需要在httpd.conf文件下进行指定:

    先载入phpXX.dll文件,即载入php模块:

    然后增加对.php .php3文件的支持:

    说到这里,想起来一开始的时候就以为php为apache必须的,所自带的。其实php并不是apache必须的,在apache处理.php文件时,就委托给php模块,php模块处理完之后把结果返回给apache,再由apache发回响应给请求的用户。

    5、构建响应

    创建带有正确首部的HTTP响应报文。

    一旦服务器识别出资源,就执行请求方法中的动作,并返回响应报文。

    响应实体通常包括:

    MIME类型的Content-type首部,描述响应主体长度的Content-Length首部,实际报文的主体内容。

    6、发送响应

    将响应发送回给客户端

    7、记录事务处理过程

    将与已完成事务有关的内容记录在一个日志文件中。

    最后,当事务结束时,web服务器会在日志文件中添加一个条目,来描述已经执行的事务。

    logs/access.log文件记录事务。

  • 相关阅读:
    算法_二叉查找树
    Java编程思想学习笔记_2(继承和多态)
    算法_符号表
    算法_优先队列
    算法_快速排序
    Java编程思想学习笔记_1(Java内存和垃圾回收)
    map 与 lambda 的用法
    优化版九九乘法表
    low版九九乘法表
    python3爬虫lxml模块的安装
  • 原文地址:https://www.cnblogs.com/zhouyongtao/p/2878418.html
Copyright © 2011-2022 走看看