首页 > 代码库 > httpd协议及其功能介绍

httpd协议及其功能介绍


一、http协议

1、http协议的版本:

   http/0.9: 诞生于1991,仅用于传输html文档,不能包含图片

   http/1.0: 引入了MIME,支持多媒体数据的处理,keep-alive(保持连接),有缓存功能

   http/1.1: 支持更多的请求方法,更精细的缓存控制,持久连接

   http/1.0和http/1.1之所以能够传输多媒体数据,是因为引入了MIME

   MIME: Multipurpose Internet Mail Extension

       MIME引入了base64的编码机制,能够实现将二进制数据编码成文本发送,并能够让接收方还原回原来的格式;

2、HTTP报文:

   HTTP事务:一次请求以及与其对应的响应

   HTTP资源请求的方法:GET、PUT、HEAD(只发报文首部响应就可以,你有没有告诉我一声)、POST、DELETE

   1)HTTP请求:request

       HTTP请求报文

       报文格式:

       <method> <request-URL> <version>起始行,请求行

       <headers>(名称+值)


       <entity-body>  实体 (两次回车加一个空白行到这里)

   2)HTTP响应:response

       HTTP响应报文

       报文格式:

       <version> <status> <reason-phrase> 起始行,响应行

       <headers>


       <entity-body>


       <method>: 请求方法, 希望服务器端执行的动作,如GET、HEAD、POST等

       <request-url>: 请求的资源,可以是相对路径,也是完整的URL

       <version>:协议版本,格式HTTP/<major>.<minor>,如http/1.0

       <headers>:HTTP首部

       <status>: 状态码

       <reason-phrase>:原因短语,数字状态码易读信息

       <entity-body>: 主体部分

       HTTP请求方法:

       GET:请求获取一个资源,需要服务器发送

       HEAD:跟GET相似,但其不需要服务发送资源而仅传回响应首部;

       POST:支持HTML表单提交,表单中有用户填入的数据,这些数据会发送到服务器端,由服务器存储至某位置(例如发送处理程序)

       PUT:与GET相反,向服务写入文档;例如发布系统

       DELETE:请求删除URL指向的资源

       OPTIONS:探测服务器端对某资源所支持的请求方法

       TRACE:跟踪请求要经过的防火墙、代理或网关等

       扩展方法:LOCK、MKCOL、COPY、MOVE

   3)HTTP协议:是一种stateless(无状态)协议

       一次HTTP事务结束后,连接即行断开,所以效率会低很多,因此为了提高效率,要为http提供加速方式

       (1)并行请求:多线程,但第一次是单线程的,只请求一个资源

       (2)持久连接(保持连接):三次握手连接后不断开,直到最后一个请求结束后,再一次一次性断开。

           但这样,持久连接也会有缺陷了,如果一个用户接进来以后,连接时间过长,这势必会造成资源被占用,所以也要有解决方法:

               ①:设定超时时长

               ②:限制最大资源请求

   4)HTTP状态码:

       1xx: 信息性状态码

       2xx:成功状态码

           200: OK

           201: Created,接受并保存

       3xx:重定向状态码

           301:Moved Permanently, 永久重定向。在响应报文中使用首部“Location: URL”指定资源现在所处的位置;

           302:Found,临时重定向,本资源有,但暂时不在本地。在响应报文中使用首部“Location: URL”指定临时资源位置;

           304:Not Modified,没修改这个资源,就可以使用缓存了。条件式请求中使用;

       4xx:客户端类的错误 ,例如服务器端资源不存在

           403:Forbidden,请求被服务器拒绝,原因可能是没有权限

           404:Not Found,服务器无法找到请求的URL

           405:Method Not Allowed,不允许使用此方法请求相应的URL

       5xx:服务器类的错误

           500:Internal Server Error,服务器内部错误;如服务器端脚本无权限执行

           502:Bad Gateway,代理服务器从上游收到了一条伪响应;

           503:Service Unavailable,服务器此时无法提供服务,但将来可能可用;

   5)HTTP首部:

   (1)通用首部:请求和响应都可以使用的;

           Connection:定义C/S之间关于请求/响应的有关选项

           对于http/1.0, Connection: keep-alive

           Via: 显示了报文经过的中间节点,意思就是找谁代理的

           Cache-Control:缓存控制、缓存指示,能不能缓存,能缓存多久,在http/1.1中比较长见

           Pragma

   (2)请求首部:

        Client-IP:

           下四层的请求都是由内核处理的(内核空间),上面的就是用户空间了

        Host: 请求的主机名和端口号,虚拟主机环境下用于不同的虚拟主机

        Referer:指明了请求当前资源的原始资源的URL

        User-Agent: 用户代理,使用什么工具发出的请求。爬虫也是一种用户代理

        ①、Accept首部:用户标明客户自己更倾向于支持的能力

           Accept: 指明服务器能发送的媒体类型(有主类型和子类型)

           Accept-Charset: 支持使用的字符集

           Accept-Encoding: 支持使用的编码方式

           Accept-Language: 支持使用语言

        ②、条件请求首部:

           Expect:

           If-Modified-Since: 是否在指定时间以来修改过此资源,如果改过,就发状态码,再发送资源

           If-None-Match

        跟安全相关的请求首部:

           Authorization: 客户端提交给服务端的认证数据,如帐号和密码

           Cookie: 客户端发送给服务器端身份标识。session是服务器端的,session是靠cookie去实现的

           Cookie2

   (3)响应首部:

        Age:

        Server: 向客户端标明服务器程序名称和版本

        ①、协商首部:

           Accept-Ranges: 对当前资源来讲,服务器所能够接受的范围类型

           Vary: 首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端。比如,比较繁忙的服务器会把资源经过压缩以后再发送给客户端,但客户端上有些低版本的浏览器不支持压缩格式,所以在服务器端会提供多种版本

       ②、跟安全相关的响应首部:

           Set-Cookie: 服务器端在某客户端第一次请求时发给令牌

           Set-Cookie2:

           WWW-Authentication: 质询,即要求客户提供帐号和密码

   (4)实体首部:用于指定实体属性

           Location: 资源的新位置

           Allow: 允许对此资源使用的请求方法

       ①、内容首部:

           Content-Encoding

             Content-Language

             Content-Length

             Content-Location

             Content-Range

             Content-Type

       ②、缓存首部:

            ETag: 实体标签

            Expires: 过期期限

            Last-Modified: 上一次的修改时间

二、httpd功能特性介绍

   httpd俗称apache,是目前市场份额最高的网络服务,它是高度模块化的,它的模块不但可以在编译时选择,而且在选择完成以后,这个模块到底启不启用也可以定义。

   core + modules

   DSO模块: Dynamic Shared Object

   MPM: Multipath Processing Module,多道处理模块,非一个模块,而是对一种特性的称谓

       prefork:

           一个进程一个请求,预先forck好多个,prefork是基于事件分离器来工作的,而select的文件数最大不能超过1024个,也就是说prefork最多能处理1024个进程

       worker:

           一个进程多个线程,一个线程一个请求

       event:

           一个线程响应多个请求。event是基于事件驱动(event-driven)的,主要目的在于实现单线程响应多个请求;

   1)监听套接字

       Listen [IP:]port

       此指令可以出现多次, 用于指定监听多个不同的套接字:

       Listen 80

       Listen 172.16.251.93:8080

   2)配置使用keep alive

       KeepAlive {On|Off}

       KeepAliveTimeout 2

       MaxKeepAliveRequests 50

   3)MPM

       <IfModule prefork.c>

           StartServers: 默认启动的工作进程数;

           MinSpareServers: 最少空闲进程数;

           MaxSpareServers: 最大空闲进程数;

           ServerLimit: 最大活动进程数;

           MaxClients: 并发请求的最大数;

           MaxRequestsPerChild: 每个子进程在生命周期内所能够服务的最多请求个数;

       </IfModule>

       <IfModule worker.c>

           StartServers:启动的子进程的个数

           MaxClients: 并发请求的最大数;

           MinSpareThreads:最小空闲线程数;

           MaxSpareThreads:最大空闲线程数;

           ThreadsPerChild:每个子进程可生成的线程数;

           MaxRequestsPerChild:每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定;

       </IfModule>

   4)DSO模块加载方式

       LoadModule module_name /path/to/module

       如果使用相对路径,则对于ServerRoot所定义的位置而言;例如:

       LoadModule php5_module /usr/lib64/httpd/modules/php5.so

       让服务重载配置文件方能生效;

       httpd -M: 列出已经装载的所有DSO及非DSO模块

       httpd -l: 列出支持使用的非DSO模块

   5)配置站点根目录

      DocumentRoot /path/to/somewhere

   6)配置页面访问属性

       <Direcotry "/path/to/somewhere">

           Options:

               Indexes: 缺少指定的默认页面时,允许将目录中的所有文件以列表形式返回给用户;危险;

               FollowSymLinks: 允许跟随符号链接所指向的原始文件;

               None: 所有都启用;

               All: 所有都启用;

               ExecCGI: 允许使用mod_cgi模块执行CGI脚本;

               Includes: 允许使用mod_include模块实现服务器端包含(SSI);

               MultiViews:允许使用mod_negotiation实现内容协商;

               SymLinksIfOwnerMatch:在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件;

       <Directory>

   7)基于主机的访问控制

       <Direcotry "/path/to/somewhere">

           Options

           AllowOverride None

           Order Deny,Allow

           Allow

           Deny

       <Directory>

   二者都匹配或二者都无匹配项时,则以后者为准;否则,则以匹配到的为准;

       Allow from

           Deny from

           IP, Network Address

           172.16

           172.16.0.0

           172.16.0.0/16

           172.16.0.0/255.255.0.0

   8)配置日志功能

       /var/log/httpd/

       access.log: 访问日志,其需要记录的内容需要自定义

       error.log: 错误日志

       

       访问日志:

           CustomLog "/path/to/access_log_file" Format_Name

           LogFormat Format_String  Format_Name

               %h: 客户端地址

               %l: 远程登录名,通常为-

               %u: 认证时的远程用户名,没有认证时为-

               %t: 收到请求时的时间;

               %r: 请求报文的起始行;

               %>s: 响应状态码;

               %b: 响应报文的长度,单位为字节

               %{Header_Name}i: 记录指定请求报文首部的内容(value);

               详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

       错误日志:

           ErrorLog

   9)路径别名

       Alias /alias/ "/path/to/somewhere"

       意味着访问http://Server_IP/alias/时,其页面文件来自于/path/to/somewhere这个位置;

   10)设定默认字符集

       AddDefaultCharset

   11)基于用户的访问控制

       虚拟用户:

           文件:/etc/httpd/conf/.htpasswd

           SQL数据库:

           dbm:

           ldap

       认证类型(auth):

           basic: 基本认证,帐号和密码明文发送;

           digest:摘要认证,hash编程之后发送;

       认证提供者(authentication provider):帐号和密码的存放位置

           authn

       授权机制(authorization):根据什么进行授权

       (1) 编辑配置文件,为需要认证的目录配置认证机制

           <Directory "/www/htdocs/fin">

               Options None

               AllowOverride AuthConfig

               AuthType Basic

               AuthName "Private Area"

               #AuthBasicProvider file

               AuthUserFile /etc/httpd/conf/.htpasswd

               Require valid-user

           </Directory>

       (2) 使用htpasswd命令生成认证库

           htpasswd

           -c: 创建文件,创建第一个用户时使用

           -m: 密码基于MD5编码存储

       (3) 如果要基于组进行认证

           <Directory "/www/htdocs/fin">

               Options None

               AllowOverride AuthConfig

               AuthType Basic

               AuthName "Private Area"

               #AuthBasicProvider file

               AuthUserFile /etc/httpd/conf/.htpasswd

               AuthGroupFile /etc/httpd/conf/.htgroup

               Require group GroupName

           </Directory>

       组文件:

           组名: 用户1 用户2 用户3

   12)虚拟主机

       一个物理服务器提供多个站点; 使用虚拟主机得先取消中心主机

       Web: Socket(IP, port)

       基于不同的IP实现不同的虚拟主机

           变化IP

       基于不同的port实现不同的虚拟主机

           变化port

       基于不同的FQDN实现不同的虚拟主机

           变化ServerName的值

       

       NameVirtualHost *:80


       <virtualhost IP:port>

           ServerName

           DocumentRoot ""

           <Directory "">

               Options

           </Directory>

           ServerAlias

           ServerAdmin

       </virtualhost>

   

   虚拟主机的单独配置:

       用户认证

       访问日志

       错误日志

       别名

       脚本别名

   13)服务器status页面

       内生的status信息,且此信息可以通过web预以显示

       配置文件系统路径访问属性

           <Directory [~] "">

           </Directory>

           

           <File [~] "">

           </File>

       配置URL访问属性

           <Location  [~] "">

           </Location>

           

           <LocationMatch "">

           </LocationMatch>

       如果某要配置其属性的URL能映射到某具体文件系统路径,建议使用<Directory>;

       处理器:是当文件被调用时,Apache内部表示形式;一般每种文件类型都有其隐式处理器;

       显式的定义使用的处理器 SetHandler

       <Location /URL>

           SetHandler server-status

       </Location>

       定义访问控制机制

           基于IP控制

           基于用户控制

       

       示例:

       <Location /server-status>

           SetHandler server-status

           AuthType Basic

           AuthName "Server Status"

           AuthUserFile "/etc/httpd/conf/.htpasswd"

           Require valid-user

           Order deny,allow

           Allow from all

       </Location>