内容:

1、http协议概述

2、http协议特点

3、http的工作模式(过程)

4、http请求报文、响应报文格式、常见状态码解析

5、web资源概述(静态资源、动态资源)

1、http协议概述

        

http协议工作在TCP/IP模型的应用层,其定义web服务间通信的约定通信方式,HTTP基于tcp传送数据,默认是80端口(服务器端)

    几个名词:

        httphyper texttransfer protocol,超文本传输协议,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。目前我们使用的是HTTP/1.1 版本。

        超文本:超文本文件是与其它数据有关联(links)的数据。包含与其他文档链接的文档;选择链接时自动显示第二个文档。超文本文件的一个简单例子是大百科全书。假设你正在读“树”这个条目,在文章的最末有一个参考这样写到,“相关信息参见‘植物’”。这最末一行就是一个关联,从“树”到“植物”这个条目。

        当然这只是一个简单例子,全球网是基于一个远远复杂得多的超文本文件。特别的是,在文件的任何地方都可能有关联,不仅是在末尾。举一个想象的例子。假设你正在用全球网阅读树的超文本文件,每次提到一种新的树就有一个关联,每个关联都以某种方式标识起来以显得突出。例如,有关联的字可能被加亮或者加了下划线,或者标注了一个数字。如果跟着关联走,你将转到那种类型的树的条目去。在主条目里还有其它题目的关联,如“雨林”或“木”。这些关联又引出完整的条目。你或许还能找到与技术术语的关联,如“落叶科”和“针叶树”。如果沿着这些关联就会找到其定义。在全球网的语言里,一个超文本文件的文件就是由一些数据组成,而这些数据又可能与其它文件相关联。

        htmlhyper text marklanguage,超文本标记语


          URL
uniform resourcelocation,统一资源定位符,主要用于描述服务器某特定资源的位置,现在几乎和URI相同

        URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。

        URL的一般语法格式为:

      例如:http://www.sina.com.cn/index.html

scheme://<user>[:password:]@<host>[:<port>]/path;params?query#frag

  SCHEME:指明协议的

   如果是默认的公认端口,可以省略,比如80,如果改变了端口,需要指明

params:参数;name=value&name=value 

      query(查询)

        可选,用于给动态网页(如使用CGIISAPIPHP/JSP/ASP/ASPNET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

   fragment(信息片断)

        字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。

2http协议特点

        (1)c/s架构模式,也就是客户端/服务器端模式,一个服务器可以为许多客户服务

        (2)简单快速:客户向服务器请求服务时,只需要传送请求方法和路径,请求方法常用的只有GETHEADPOST等几种(后面有说明),由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快

        (3)灵活:HTTP允许传输任意类型的数据对象,传输的类型由Context'-Type加以标记

        (4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

解决办法:引入keep-alive机制

    (5)无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,服务器不会记录任何,也就是说服务端不能判断是否是来源同一个用户

解决的方法:引入cookie(作用与客户端)session(作用于服务器端),具体工作过程说明这里不详细阐述,有兴趣的可以查阅相关资料。

           6)安全可靠


3、http的工作模式(过程)

        http工作模式很简单,客户端请求,服务端响应反馈,其实就是一个请求<---->响应的过程  

      (1)建立连接,服务器接受请求或拒绝,接受的话,进行下一步

        (2)客户端发送请求

        (3)服务端处理请求

        (4)从存储中获取相关的请求资源

        (5)构建响应

        (6)发送响应到客户端

        (7)记录相关日志

 

4、http请求报文、响应报文格式、常见状态码解析

请求报文一般的格式如下(每个值之间都是空格进行隔开)

            请求首行:<method><URL><version>

            请求头:Name : Value

            Name:Value

            ...

               请求实体:

    响应报文格式:

         响应首行:<Vertion> <status><reason>

        响应头:Name : Value

        Name:Value

        ...

        响应实体

 

    (1)method方法:

        GET:从服务器获取资源

        HEAD:只从服务器获取响应报文的头部

        POST:向服务器端提交服务器需要处理的数据

        PUT:客户端想服务器上传数据,该数据直接存储在服务器上,而不需要进行处理,这就是与POST的区别

        DELETE:删除服务器指定路径的文档

    

 

 
   (2)
常见错误代码

        服务器返回状态码

            1xx:表明服务端接收了客户端请求,客户端继续发送请求;

            2xx:客户端发送的请求被服务端成功接收并成功进行了处理;

            3xx:服务端给客户端返回用于重定向的信息;

            4xx:客户端的请求有非法内容;

            5xx:服务端未能正常处理客户端的请求而出现意外错误。

    举例:

        200  ; 服务端成功接收并处理了客户端的请求;对应的reasonOK

        301  ; 客户端所请求的URL已经移走,而且是永久移动,需要客户端重定向到其它的URL;对应的reasonMoved Permanently

        302  ; 301相似,客户端所请求的URL已经移走,但是是临时的,对应的reasonFound

        304  ; 客户端发起了条件式请求,客户端缓存的URL是否发生了修改,请求的URL未发生变化;对应的reasonNot Modified

        401  ; 客户端登录认证失败;对应reasonUnauthorized

        403  ; 客户端请求被服务端所禁止(用户没有权限访问相关资源)对应的reasonForbbiden

        404  ; 客户端所请求的URL在服务端不存在;对应的reasonNot Found

        500  ; 服务端在处理客户端请求时出现异常;对应的reasonInternel server error

        502  ; 此为中间代理返回给客户端的出错信息,表明服务端返回给代理时出错;对应的reasonBad Gateway

     

3)首部的分类:

    通用首部

    请求首部

    响应首部

    实体首部

    扩展首部



 

5、web资源

       web资源:所谓web资源即放在Internet网上供外界访问的文件或程序,又根据它们呈现的效果及原理不同,将它们划分为静态资源和动态资源。

        静态资源:静态资源是浏览器能够直接打开的,一个js文件,在打开方式中选择IE浏览器打开,浏览器可以直接打开没有出现问题,那么就说明它是一个静态资源。html文件、css文件、js文件等它们都是静态资源。

        动态资源:一些资源浏览器不能够直接打开,但是经过翻译之后浏览器能够打开的资源称之动态资源。比如说jsp文件、servletphpASP等这些都是动态资源。这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。 

 

6、httpd的三种MPM介绍


 # perfork MPM 

Apache 2.X  支持插入式并行处理模块,称为多路处理模块MPM)。在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到apache的速度和可伸缩性。 

  Prefork MPM : 这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。

工作的过程:      

   httpd服务器会根据<IfModulempm_prefork_module>指令定义的参数维护进程池中的进程。

  当用户向httpd服务器发起连接请求的时候,httpd的主进程就会从进程池中派一个子进程来负责响应用户的请求,

   如果该服务器的并发请求量为100的话,一下子就使用完,进程池中空闲进程数(我们定义了进程池中最小空闲进程数为5),90个用户的连接请求只好等待。这时主进程fork()出子进程,然后才能响应处于等待90个用户的连接请求。

   虽然是一个进程负责响应一个用户的请求,当该进程完成了用户的请求之后,会话领导进程并不会马上kill掉该进程。而是使用了重用的机制。意思是在进程的生命周期内它响应完负责的用户请求后,还可以响应后续的用户请求。这是为了减少消耗在创建进程上面的时间。

   实现快速地响应用户请求的一种机制


  这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。

 

 Prefork 是UNIX平台上默认的MPM,它所采用的预派生子进程方式也是apache 1.3中采用的模式。prefork 本身并没有使用到线程,2.0 版本使用它是为了与1.3版保持兼容性;另一方面,perfork用单独的子进程来处理不同的请示,之程之间是彼此独立的,这也使其成为最稳定的MPM之一 。


<IfModulempm_prefork_module>StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0</IfModule>


# StartServers:  数量的服务器进程开始

# MinSpareServers:  最小数量的服务器进程,保存备用

# MaxSpareServers:  最大数量的服务器进程,保存备用

# MaxRequestWorkers:  最大数量的服务器进程

# MaxConnectionsPerChild:  最大连接数的一个服务器进程服务

  prefork 控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两 个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止。这种模式 可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个 值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比MinSpareServers小,Apache会自动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。  

  MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自 动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:

1、可防止意外的内存泄 漏。2、在服务器负载下降的时侯会自动减少子进程数。

因此,可根据服务器的负载来调整这个值。

  MaxRequestWorkers指令集同时将服务请求的数量上的限制。任何连接尝试在MaxRequestWorkerslimit将通常被排队,最多若干基于上ListenBacklog指令。 

在apache2.3.13以前的版本MaxRequestWorkers被称为MaxClients 。

(MaxClients是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以 处理的请求就越多,但Apache默认的限制不能大于256。)

      如果调大了并发用户数(服务器的性能条件下),虽然一次性可以处理的用户请求数增加了,但是在服务器上进程的切换的次数也增加了。因为进程的切换是浪费CPU时间周期的。所以,我们要为服务器定做一个黄金比例。既能处理更多的用户并发请求,浪费在进程间切换的时间又很合理



# worker MPM 

  Worker MPM : 此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性

      一个线程服务一个用户的连接请求。线程比进程更轻量级,创建和消耗的速度比进程的创建和消耗要快得多。线程之间还可以共享资源,如:打开的文件描述符等。这样如果:两个客户端请求的是同一个文件,就不需要从磁盘上加载两次了,速度要比基于进程的响应速度快。但线程的管理要比进程复杂得多。线程之间很多资源是共享的,所以它没有prefork模型,一个进程服务一个服务请求那么安全稳定。况且,linux不是真线程的操作系统,worker 与 prefork 这两种模型,在linux上的表现几乎都一样。通常使用prefork模型。windows 是真线程的操作系统,它对线程的支持就很好。

不管是Worker模式或是Prefork 模式,Apache总是试图保持一些备用的(spare)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。


<IfModulempm_worker_module>StartServers 3
MinSpareThreads 75
MaxSpareThreads 250 
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0</IfModule>


# StartServers:  初始数量的服务器进程开始

# MinSpareThreads:  最小数量的工作线程,保存备用

# MaxSpareThreads:  最大数量的工作线程,保存备用

# ThreadsPerChild:  固定数量的工作线程在每个服务器进程

# MaxRequestWorkers:  最大数量的工作线程

# MaxConnectionsPerChild:  最大连接数的一个服务器进程服务

  Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样, 为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数

  而MaxRequestWorkers 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程 

  MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节 。

  ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。 

  Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时 也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。


# Event MPM 

  Event MPM以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰时),而Event MPM可以用来处理更高负载。值得注意的是,Event MPM不能在安全HTTP(HTTPS)访问下工作。 

<IfModule mpm_event_module>StartServers3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0</IfModule>


# StartServers:初始数量的服务器进程开始

# MinSpareThreads:  最小数量的工作线程,保存备用

# MaxSpareThreads:  最大数量的工作线程,保存备用

# ThreadsPerChild:  固定数量的工作线程在每个服务器进程

# MaxRequestWorkers:  最大数量的工作线程

# MaxConnectionsPerChild:  最大连接数的一个服务器进程服务


 在httpd2.2中并不支持event,生产环境中特别不稳定,2.4中event则已经可以在生产环境中使用了

 

如何查看当前安装的Apache 的三种MPM

在2.2中:

[root@Cent6 ~]#  ps aux | grep http
root       2197  0.0  1.0 139212  4936 pts/0    S+   12:52   0:00 vim conf/httpd.conf
root       2798  0.0  0.9 184120  4452 ?        Ss   13:20   0:00 /usr/sbin/httpd.worker
apache     2963  0.0  0.7 528380  3432 ?        Sl   13:26   0:00 /usr/sbin/httpd.worker
apache     2964  0.0  0.7 528380  3420 ?        Sl   13:26   0:00 /usr/sbin/httpd.worker
apache     2965  0.0  0.7 528380  3420 ?        Sl   13:26   0:00 /usr/sbin/httpd.worker

httpd -l 的方式并不可靠。

在2.4中:

[root@centos7-2 httpd]# httpd -M | grep mpm
 mpm_worker_module (shared)

 

另外2.2不支持DSO机制,使用安装包的httpd编辑/etc/sysconfig/httpd,后需要重新启动服务。

而2.4则很好的支持了DSO(平滑重启)的机制,修改/etc/httpd/conf.module.d/00-mpm.conf后立即生效

 

1. prefork 中没有线程的概念,是多进程模型,一个进程处理一个连接;稳定;响应快。其缺点是在连接数比较大时就非常消耗内存。
2. worker 是多进程多线程模型,一个进程有多个线程,每个线程处理一个连接。与prefork相比,worker模式更节省系统的内存资源。不过,需要注意worker模式下的Apache与php等程序模块的兼容性。
3. event 是worker模式的变种,它把服务进程从连接中分离出来,在开启KeepAlive场合下相对worker模式能够承受的了更高的并发负载。event模式不能很好的支持https的访问(HTTP认证相关的问题)

 

 

7、httpd2.4的特性以及httpd2.2和2.4的区别

 

 

 

httpd-2.4

   新特性:

1.MPM支持运行为DSO机制,以模块形式按需加载

2.eventMPM生产环境可用

3.异步读写机制

4.支持每模块及每目录的单独日志级别定义

5.每请求相关的专用配置

6.增强版的表达式分析式

7.毫秒级持久连接时长定义

8.基于FQDN的虚拟主机时,不用使用namevirtualhost

9.新指令,AllowOverridelist

10.支持用户自定义变量

11.更低的内存消耗

 

1.新模块:

    1.mod_proxy_fcgi

    2.mod_proxy_scgi

    3.mod_remotei

.切换使用的MPM的方式:

编辑/etc/httpd/conf.module.d/00-mpm.conf

 

2.基于IP的访问控制:

    允许所有主机访问:require allgranted

    拒绝所有主机访问:require all deny

    控制特定的ip访问:

    requireipIpaddr:授权指定来源的ip访问

    requirenotip IPADDR:拒绝

控制特定的主机访问:

    RequirehostHOSTNAME:授权指定来源的主机访问

    requirenothost HOSTNAME:拒绝

    HOSTNAME这种比较少用,需要反解域名

    FQDN:特定主机

domin.tld;指定域名下的所有主机

  eg: 要加封装

 <RequireAll>

     Requireall granted 

     Requirenot ip 172.16.100.2

  </RequireAll>

httpd2.2httpd2.4的不同之处

   

1.2中修改网页文件目录直接修改DocumentRoot即可,而4需要修改DocumentRoot后限定目录,使用Directory

2.2中基于域名的虚拟主机需要加上NameVirtualHost*:80 4中不需要

3.修改MPM的工作模型2中可以通过修改/etc/sysconfig/httpd中的选项设置;4中可以修改/etc/httpd/conf.modules.d/00-mpm.conf中的模块

4.httpd2.4ssl的配置文件ssl.confListen443https(2.2中不需要加https)

5.支持毫秒级,持久连接中keepAliveTimeout5ms 

6.2.2MPM是非DSO机制,不支持LoadModule进行切换