一、HTTP基本定义
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。目前有三个版本:http/0.9;http/1.0;/http/1.1。目前http/1.0和1.1被广泛应用。
http/0.9:仅用于传输HTML文档;
http/1.0:支持多媒体数据的处理;支持keep-live(持久连接);有缓存功能;
http/1.1:支持更多的请求方法和更精细的缓存控制;持久连接;
二、HTTP请求的过程
http事务的过程为:一次请求和与其对应的响应。
http请求:request
1
2
3
4
5
<code>格式</code>
<code><</code><code>method</code><code>> <</code><code>request-URL</code><code>> <</code><code>version</code><code>></code>
<code><</code><code>headers</code><code>></code>
<code> </code>
<code><</code><code>entity-body</code><code>></code>
http响应:response
<code><</code><code>version</code><code>> <</code><code>status</code><code>> <</code><code>reason-phrase</code><code>></code>
<code> </code>
method
请求方法;希望服务器端执行的动作;如GET、POST、HEAD等
request-URL
请求的资源;可以是相对路径(相对主机位置);也可以是完整的URL
version
协议版本;格式:http/<major>.<minor>
headers
http首部信息
status
状态码
reason-phrase
原因短语;数字状态易读信息
entity-body
主体部分
一次完整的请求过程:
<a href="http://s3.51cto.com/wyfs02/M02/22/D3/wKiom1MpBFzQGFLtAAEKfjWGkUY756.jpg" target="_blank"></a>
由于http是一种无状态(stateless)协议;所以无法记录每一次请求者的身份;并且每一次请求结束后立即断开。所以每一次请求都要先经过DNS解析、三次握手和四次断开;所以相当耗费CPU的时钟周期,浪费资源。通用提供效率有两种方法:
1、并行请求:同时发起多个请求和返回多个响应(第一次请求只能是一个资源);
2、持久连接:三次握手请求后不断开;客户端可以继续请求;缺陷是持久连接会导致占用资源;
断开方式:两种方式无论哪个先达到上限都执行断开
超时:在连接后规定一个持久连接的时间限定
请求资源最大数:允许连接后最多请求多少个资源
三、HTTP请求方法和响应状态码等信息
http请求的方法有:GET、HEAD、POST、DELETE、PUT、OPTIONS、TRACE...;前五种方法较为常用。
GET
请求获取一个资源;而需要服务器发送
HEAD
请求一个资源,但是不需要服务器发送资源而仅传回响应的首部信息
POST
提交表单;支持HTML表单提交;表单中有用户填入的数据;这些数据会发送到服务器端;由服务器存储至某位置
PUT
向服务器写入文档;例如发布系统
DELETE
请求删除URL指向的资源
OPTIONS
探测服务器端对某资源所支持的请求方法
TRACE
跟踪请求资源传输所经过防火墙、代理或网关等
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
扩展方法
LOCK、MKCOL、COPY、MOVE...
http响应中的status状态码分为五种:
1xx:信息性状态码
2xx:成功状态码
200:OK
201:created
3xx:重定向状态码
301:Moved Permanentl;在响应报文中使用首部"Location:URL";指定资源现在所在的位置
302:Fonud(临时重定向);在响应报文中使用首部"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;服务器此时无法提供服务;但是将来可能可用
web服务的输入/输出结构:
1、单线程I/O结构:单个线程响应单个请求
2、多线程I/O结构:多个线程响应各对应的请求
3、复用的I/O结构:单个线程响应多个请求
4、复用的多线程I/O结构:多个线程;单个线程响应多个请求
四、web服务httpd软件介绍
linux下http的软件有很多;例如apache:httpd和nginx,这里以httpd为介绍
httpd属性:高度模块化;可以动态装卸载模块。主要是core和modules组合模式的。还支持MPM(Multipath Processing Module):多道处理模块。它不是一个模块;而是对一种特性的称谓。
MPM对应web服务并行结构的模块:
prefock:预fock;一个进程一个请求。
在请求时web服务本身不响应该请求;而是自身fock一个子进程来响应进程;而fock是需要时间来生成子进程的;因此在请求来时,预先fock一些进程来等待请求予以响应;并保持一定的空闲子进程等待其他请求。
worker:一个进程多个线程;一个线程一个请求。
由多个进程生成多个线程;每个线程对应一个请求;如果多个请求在一个进程下请求同一个资源;可以进行资源共享。但是是由于单个线程进行响应请求;需要被调度切换;切换过程还是比较浪费资源。在性能上与prefock是差不多的。
event:一个进程响应对个请求
基于event-driven(事件驱动);单线程响应多个请求。对应web并行结构中的复用的多线程I/O结构。
httpd版本:
httpd-1.3; httpd-2.0; httpd-2.2; httpd-2.4;四个版本。目前官网上2.0-2.4都处于维护状态。
httpd的部分重要功能特性:
路径别名:alias
用户认证:authentication
虚拟主机:virtual host
反向代理:
负载均衡:
用户站点:
CGI:Common Gateway Interface
五、安装httpd
可以先查看下系统内是否安装
<code>[Linux]</code><code>#rpm -qa httpd</code>
<code>httpd</code><code>-</code><code>2.2</code><code>.</code><code>15</code><code>-</code><code>29.el6</code><code>.centos.x86_64</code>
<code>#显示已安装2.2.15版本</code>
如系统内没有安装可以配置好yum源后安装
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<code>[Linux]</code><code>#yum -y install httpd</code>
<code> </code>
<code>#安装完成后可以查看下安装详情和具体的目录</code>
<code>[Linux]</code><code>#rpm -ql httpd</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf.d</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf.d</code><code>/</code><code>README</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf.d</code><code>/</code><code>welcome.conf</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf</code><code>/</code><code>httpd.conf</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>conf</code><code>/</code><code>magic</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>logs</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>modules</code>
<code>/</code><code>etc</code><code>/</code><code>httpd</code><code>/</code><code>run</code>
<code>/</code><code>etc</code><code>/</code><code>logrotate.d</code><code>/</code><code>httpd</code>
<code>/</code><code>etc</code><code>/</code><code>rc.d</code><code>/</code><code>init.d</code><code>/</code><code>htcacheclean</code>
<code>/</code><code>etc</code><code>/</code><code>rc.d</code><code>/</code><code>init.d</code><code>/</code><code>httpd</code>
<code>/</code><code>etc</code><code>/</code><code>sysconfig</code><code>/</code><code>htcacheclean</code>
<code>/</code><code>etc</code><code>/</code><code>sysconfig</code><code>/</code><code>httpd</code>
<code>/</code><code>usr</code><code>/</code><code>lib64</code><code>/</code><code>httpd</code>
<code> </code>
<code> </code>
<code>#安装完成后即可启动</code>
<code>[Linux]</code><code>#service httpd start</code>
<code>Starting httpd: [ OK ]</code>
<code>[Linux]</code><code>#ps aux | grep httpd</code>
<code>root </code><code>3422</code> <code>0.0</code> <code>0.7</code> <code>184284</code> <code>3844</code> <code>? Ss </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
<code>apache </code><code>3425</code> <code>0.0</code> <code>0.6</code> <code>184420</code> <code>3052</code> <code>? S </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
<code>apache </code><code>3426</code> <code>0.0</code> <code>0.6</code> <code>184420</code> <code>3144</code> <code>? S </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
<code>apache </code><code>3427</code> <code>0.0</code> <code>0.6</code> <code>184420</code> <code>3052</code> <code>? S </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
<code>apache </code><code>3428</code> <code>0.0</code> <code>0.6</code> <code>184420</code> <code>3068</code> <code>? S </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
<code>apache </code><code>3429</code> <code>0.0</code> <code>0.6</code> <code>184420</code> <code>3068</code> <code>? S </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
<code>apache </code><code>3430</code> <code>0.0</code> <code>0.4</code> <code>184284</code> <code>2440</code> <code>? S </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
<code>apache </code><code>3431</code> <code>0.0</code> <code>0.4</code> <code>184284</code> <code>2440</code> <code>? S </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
<code>apache </code><code>3432</code> <code>0.0</code> <code>0.4</code> <code>184284</code> <code>2440</code> <code>? S </code><code>16</code><code>:</code><code>20</code> <code>0</code><code>:</code><code>00</code> <code>/</code><code>usr</code><code>/</code><code>sbin</code><code>/</code><code>httpd</code>
启动成功后在浏览器输入对应的IP地址
<a href="http://s3.51cto.com/wyfs02/M01/22/DA/wKioL1MpVpWT2K-7AAE-7aByyP0561.jpg" target="_blank"></a>
本文转自Mr_陈 51CTO博客,原文链接:http://blog.51cto.com/chenpipi/1379763,如需转载请自行联系原作者