内容:
1、http协议概述
2、http协议特点
3、http的工作模式(过程)
4、http请求报文、响应报文格式、常见状态码解析
5、web资源概述(静态资源、动态资源)
1、http协议概述
http协议工作在TCP/IP模型的应用层,其定义web服务间通信的约定通信方式,HTTP基于tcp传送数据,默认是80端口(服务器端)
几个名词:
http:hyper texttransfer protocol,超文本传输协议,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。目前我们使用的是HTTP/1.1 版本。
超文本:超文本文件是与其它数据有关联(links)的数据。包含与其他文档链接的文档;选择链接时自动显示第二个文档。超文本文件的一个简单例子是大百科全书。假设你正在读“树”这个条目,在文章的最末有一个参考这样写到,“相关信息参见‘植物’”。这最末一行就是一个关联,从“树”到“植物”这个条目。
当然这只是一个简单例子,全球网是基于一个远远复杂得多的超文本文件。特别的是,在文件的任何地方都可能有关联,不仅是在末尾。举一个想象的例子。假设你正在用全球网阅读树的超文本文件,每次提到一种新的树就有一个关联,每个关联都以某种方式标识起来以显得突出。例如,有关联的字可能被加亮或者加了下划线,或者标注了一个数字。如果跟着关联走,你将转到那种类型的树的条目去。在主条目里还有其它题目的关联,如“雨林”或“木”。这些关联又引出完整的条目。你或许还能找到与技术术语的关联,如“落叶科”和“针叶树”。如果沿着这些关联就会找到其定义。在全球网的语言里,一个超文本文件的文件就是由一些数据组成,而这些数据又可能与其它文件相关联。
html:hyper text marklanguage,超文本标记语
URL:uniform resourcelocation,统一资源定位符,主要用于描述服务器某特定资源的位置,现在几乎和URI相同
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
URL的一般语法格式为:
例如:http://www.sina.com.cn/index.html
scheme://
SCHEME:指明协议的
如果是默认的公认端口,可以省略,比如80,如果改变了端口,需要指明
params:参数;name=value&name=value
query(查询)
可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP。NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
fragment(信息片断)
字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。
2、http协议特点
(1)c/s架构模式,也就是客户端/服务器端模式,一个服务器可以为许多客户服务
(2)简单快速:客户向服务器请求服务时,只需要传送请求方法和路径,请求方法常用的只有GET、HEAD、POST等几种(后面有说明),由于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请求报文、响应报文格式、常见状态码解析
请求报文一般的格式如下(每个值之间都是空格进行隔开):
请求首行:
请求头:Name : Value
Name:Value
...
请求实体:
响应报文格式:
响应首行:
响应头:Name : Value
Name:Value
...
响应实体
(1)method方法:
GET:从服务器获取资源
HEAD:只从服务器获取响应报文的头部
POST:向服务器端提交服务器需要处理的数据
PUT:客户端想服务器上传数据,该数据直接存储在服务器上,而不需要进行处理,这就是与POST的区别
DELETE:删除服务器指定路径的文档
(2)常见错误代码
服务器返回状态码
1xx:表明服务端接收了客户端请求,客户端继续发送请求;
2xx:客户端发送的请求被服务端成功接收并成功进行了处理;
3xx:服务端给客户端返回用于重定向的信息;
4xx:客户端的请求有非法内容;
5xx:服务端未能正常处理客户端的请求而出现意外错误。
举例:
“200” ; 服务端成功接收并处理了客户端的请求;对应的reason为OK
“301” ; 客户端所请求的URL已经移走,而且是永久移动,需要客户端重定向到其它的URL;对应的reason为Moved Permanently
“302” ; 与301相似,客户端所请求的URL已经移走,但是是临时的,对应的reason为Found
“304” ; 客户端发起了条件式请求,客户端缓存的URL是否发生了修改,请求的URL未发生变化;对应的reason为Not Modified
“401” ; 客户端登录认证失败;对应reason为Unauthorized
“403” ; 客户端请求被服务端所禁止(用户没有权限访问相关资源);对应的reason为Forbbiden
“404” ; 客户端所请求的URL在服务端不存在;对应的reason为Not Found
“500” ; 服务端在处理客户端请求时出现异常;对应的reason为Internel server error
“502” ; 此为中间代理返回给客户端的出错信息,表明服务端返回给代理时出错;对应的reason为Bad Gateway
(3)首部的分类:
通用首部
请求首部
响应首部
实体首部
扩展首部
5、web资源
web资源:所谓web资源即放在Internet网上供外界访问的文件或程序,又根据它们呈现的效果及原理不同,将它们划分为静态资源和动态资源。
静态资源:静态资源是浏览器能够直接打开的,一个js文件,在打开方式中选择IE浏览器打开,浏览器可以直接打开没有出现问题,那么就说明它是一个静态资源。html文件、css文件、js文件等它们都是静态资源。
动态资源:一些资源浏览器不能够直接打开,但是经过翻译之后浏览器能够打开的资源称之动态资源。比如说jsp文件、servlet、php、ASP等这些都是动态资源。这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的“动态效果”没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
6、httpd的三种MPM介绍
# perfork MPM
Apache 2.X 支持插入式并行处理模块,称为多路处理模块(MPM)。在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到apache的速度和可伸缩性。
Prefork MPM : 这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
工作的过程:
httpd服务器会根据
当用户向httpd服务器发起连接请求的时候,httpd的主进程就会从进程池中派一个子进程来负责响应用户的请求,
如果该服务器的并发请求量为100的话,一下子就使用完,进程池中空闲进程数(我们定义了进程池中最小空闲进程数为5),90个用户的连接请求只好等待。这时主进程fork()出子进程,然后才能响应处于等待90个用户的连接请求。
虽然是一个进程负责响应一个用户的请求,当该进程完成了用户的请求之后,会话领导进程并不会马上kill掉该进程。而是使用了重用的机制。意思是在进程的生命周期内它响应完负责的用户请求后,还可以响应后续的用户请求。这是为了减少消耗在创建进程上面的时间。
实现快速地响应用户请求的一种机制
这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。
Prefork 是UNIX平台上默认的MPM,它所采用的预派生子进程方式也是apache 1.3中采用的模式。prefork 本身并没有使用到线程,2.0 版本使用它是为了与1.3版保持兼容性;另一方面,perfork用单独的子进程来处理不同的请示,之程之间是彼此独立的,这也使其成为最稳定的MPM之一 。
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
# 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)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
# 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)访问下工作。
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
# 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 granted
Requirenot ip 172.16.100.2
httpd2.2和httpd2.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.4中ssl的配置文件ssl.conf中Listen443https(2.2中不需要加https)
5.支持毫秒级,持久连接中keepAliveTimeout5ms
6.2.2中MPM是非DSO机制,不支持LoadModule进行切换