HTTP协议介绍


一.http协议

  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 请求

    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)持久连接:三次为首连接后不断,知道最后一个请求结束后,再一次一次断开,

          持久连接也会有缺陷,如果一个用户接进来以后,连接时间过长,这势必

      会造成资源被占用:

            1:设定超时时长

            2.限制最大资源请求

       HTTP状态码:

         1**:信息状态码

         2**:成功状态码

            200: OK

            201: Created

         3**:重定向状态码

            301:Moved Permanently,在响应报文中试用首部"Location:URL"指向资源所处的位置

            302:Found,在响应报文中试用首部"Location: URL"指定临时资源位置;

            304:Not Modified,条件式请求中试用;

         4**:客户端类的错误

         2**:成功状态码

            200: OK

            201: Created

            201: Created

         3**:重定向状态码

            301:Moved Permanently,在响应报文中试用首部"Location:URL"指向资源所处的位置

            302:Found,在响应报文中试用首部"Location: URL"指定临时资源位置;

            304:Not Modified,条件式请求中试用;

         4**:客户端类的错误

            403:Forbidden,请求被服务器拒绝

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

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

         5**:服务器类的错误

      500:Internet Server Error,服务器内部错误;

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

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

       5)HTTP首部:请求和响应

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

             对于http/1.0,Connection:keep-alive

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

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

           较常见

             Pragma

       (2)请求首部:

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

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

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

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

        1.Accept首部:用户标明客户更倾向于支持的能力

           ACCEPT:指明服务器端能发送的媒体类型

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

           Accept-Language:支持使用语言

        2.条件请求首部:

           Expect:

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

        再发送资源

           If-None-Match

          跟安全相关的请求首部

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

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

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

         1.协商首部:

  2)HTTP响应:response       <request-url>: 请求的资源,可以是相对路径,也是完整的URL

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

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

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

      5xx:服务器类的错误

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

          Pragma

  (2)请求首部:

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

          Cookie2

  (3)响应首部:

       ①、协商首部:

            Content-Location


  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>




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