一、Http协议简介
二、Http协议特点
三、Http版本介绍
四、Http之URL(统一资源定位符)
五、HTTP请求报文与响应报文
**************************************************
一、Http协议简介
HTTP在TCP协议中的位置,如下图所示:
二、Http协议特点
支持客户/服务器模式(C/S模式)
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
灵活: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
三、Http版本介绍
HTTP目前有三个版本:HTTP0.9、HTTP1.0、HTTP1.1。
HTTP0.9是最早的版本 ,它仅能响应文本;
HTTP1.0开始引用MIME(多功能多用途互联网邮件扩展)技术,smtp发送邮件的时候携带非文本数据,引用保存连接技术(keep――alive),引用缓存机制;
HTTP1.1更多的请求方法,更精细的缓存控制(条件式存储方式),持久连接(persistent connection),目前被广泛的使用。
HTTP1.0与HTTP1.1对比:
在HTTP1.0,单一TCP连接内仅执行一个“客户端发送请求―服务器发送应答”周期,之后释放TCP连接。在HTTP1.1优化支持持续活跃连接:客户端连续多次发送请求、接收应答;批量多请求时,同一TCP连接在活跃(Keep-Live)间期内复用,避免重复TCP初始握手活动,减少网络符合和响应周期。
四、Http之URL(统一资源定位符)
URL 的一般形式是:
<URL的访问方式>://<主机>:<端口>/<abs_path>
URL的访问方式有:
1.ftp ―― 文件传送协议 FTP
2.http ―― 超文本传送协议HTTP
3.https ―― 用安全套接字层传送的超文本传输协议
4.file ―― 当地电脑或网上分享的文件
host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
eg:
输入:www.google.com.hk
浏览器自动转换成:http://www.google.com.hk/
五、HTTP请求报文与响应报文
Http请求报文
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式:
1.请求头
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,
GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
1)、GET
最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。
客户端请求
1
2
3
4
5
6
|
[root@localhost ~]
# telnet www.google.com.hk 80
Trying 74.125.128.199...
Connected to www.google.com.hk.
Escape character is
'^]'
.
GET / HTTP
/1
.1
HOST:www.google.com.hk
|
(末尾有一个空行。第一行指定方法、资源路径、协议版本;第二行是在1.1版里必带的一个header作用指定主机)
服务器响应:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
HTTP
/1
.1 200 OK
Date: Thu, 22 Aug 2013 14:06:47 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text
/html
; charset=Big5
Set-Cookie: PREF=ID=191d6c8d0bb04095:FF=0:NW=1:TM=1377180407:LM=1377180407:S=u8OwwZ_w0a5YzJLT; expires=Sat, 22-Aug-2015 14:06:47 GMT; path=/; domain=.google.com.hk
Set-Cookie: NID=67=Jb4v4isJQXT_4WKdwNqVJfT2nJwzArUy_lHzpCYbs5hTAKyFj6-EUAS3Tk5E5r-axhTXuvwGDKP0JZ5DEM8ReCJ3OhTREoJwioqfDWBMrNlg99jGQBBwBa9BZqbeSwKd; expires=Fri, 21-Feb-2014 14:06:47 GMT; path=/; domain=.google.com.hk; HttpOnly
P3P: CP=
"This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
Transfer-Encoding: chunked
|
2).POST
使用POST方法可以允许客户端给服务器提供信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,这样POST方式对传送的数据大小没有限制,而且也不会显示在URL中。
3).HEAD
HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。
4).PUT
上传资源(不安全)
5).DELETE
删除资源(不安全)
6).OPTIONS:
返回请求的资源所支持请求方法的方法(客户端不知道服务器所支持的方法,需要服务器返回所支持的方法)
7).TRACE
追踪一次资源请求中间所经过的代理服务器
2.请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
3.空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
4.请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
HTTP响应报文
HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。
如下所示,HTTP响应的格式与请求的格式十分类似:
<status-line>
<headers>
<blank line>
[<response-body>]
正如所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
常见状态代码、状态描述的说明如下。
200 OK:客户端请求成功。
301:永久重定向, Location响应首部的值仍为当前URL,因此为隐藏重定向;
302 :临时重定向,显式重定向, Location响应首部的值为新的URL
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
504 Gateway Timeouteg: 服务器找不到网关服务器
*************************************************
一、Apache简介
二、Apache版本介绍
三、Apache工作模式
四、Http服务器的安装于配置
**************************************************
一、Apache简介
Web服务器软件有Apache,Tomcat,IIS,Nginx 等,由于 Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一,所以我们在这里详细介绍Apacehe服务器软件
二、Apache版本介绍
httpd-1.3 :很稳定但是官方已经不维护了
httpd-2.0 :常用版本
httpd-2.2 :目前使用最广的版本
httpd-2.4 :最新版本(引用了许多新特性)
三、Apache工作模式
Prefork工作模式:
特点:一个进程响应一个客户端请求,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。
Worker工作模式:
特点:主进程产生子进程,一个子进程产生多个线程,每个线程响应一个请求,各个线程独立的处理请求。
Event:(在HTTP-V2.4版本引用了此模式,在V2.2是作为测试模块)
事件驱动模式
四、Apache的安装于配置
使用yum方式安装(源码安装的方式请参照http://xiaodong88.blog.51cto.com/1492564/1006542 )
1
|
yum installhttpd -y
|
HTTP的相关信息:
服务脚本:/etc/rc.d/init.d/httpd
运行目录:/etc/httpd
配置文件:/etc/httpd/conf/
主配置文件:httpd.conf
扩展配置:/etc/httpd/conf.d/*.conf
网页文件目录(DocumentRoot):/var/www/html
详解Apache主配置文件的常用选项
[root@localhost conf.d]# vim /etc/httpd/conf/httpd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
ServerRoot
"/etc/httpd"
#软件安装目录
PidFile run
/httpd
.pid
#指定pid文件
KeepAlive Off
#关闭永久连接
MaxKeepAliveRequests 100
#最多客户端连接数
KeepAliveTimeout 15
#客户端超时时间
<IfModule prefork.c>
#prefork模式
StartServers 8
#开机启动的进程
MinSpareServers 5
#最小空闲进程数
MaxSpareServers 20
#最大空闲进程数
ServerLimit 256
#单个进程的最大并发量
MaxClients 256
#单个进程允许连接的客户端数
MaxRequestsPerChild 4000
#单个进程最大处理请求数
<
/IfModule
>
<IfModule worker.c>
#work工作模式
StartServers 4
#开机启动的进程数
MaxClients 300
#最大客户端数
MinSpareThreads 25
#最小空闲线程数
MaxSpareThreads 75
#最大空闲线程数
ThreadsPerChild 25
#每进程最多产生多少线程
MaxRequestsPerChild 0
#每个子进程在其生存期内允许伺服的最大请求数量
<
/IfModule
>
Listen 80
#监听端口
User apache
#以apache用户身份运行
Group apache
#以apache组的身份运行
DocumentRoot
"/website"
#指定网站的站点(此处修改为/website)
<Directory
/website
>
#定义站点的权限
Options none
AllowOverride None
Order allow,deny
Allow from all
<
/Directory
>
DirectoryIndex index.html index.html.var
ErrorLog logs
/error_log
LogLevel warn
LogFormat
"%h %l %u %t \"%r\" %>s %b"
common
#定义日子格式
LogFormat
"%{Referer}i -> %U"
referer
LogFormat
"%{User-agent}i"
agent
CustomLog logs
/access_logcombined
ServerSignature On
Alias
/icons/
"/var/www/icons/"
#定义别名
<Directory
"/var/www/icons"
>
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
<
/Directory
>
<IfModule mod_dav_fs.c>
DAVLockDB
/var/lib/dav/lockdb
<
/IfModule
>
ScriptAlias
/cgi-bin/
"/var/www/cgi-bin/"
#定义CGI别名
<Directory
"/var/www/cgi-bin"
>
AllowOverride None
Options None
Order allow,deny
Allow from all
<
/Directory
>
|
注释:
第4行:开启永久连接功能以后,下面两行才能生效
第43行:服务器使用alias可以隐藏站点,以提高网站的安全性
第29行:定义站点的访问权限
第7-14行:设置perfork工作模式的属性,此处可以更具站点需要进行调优
第15-23行:设置worker工作模式的属性,此处可以更具站点需要进行调优
第22行:将MaxRequestsPerChild设置成非零值有两个好处:
可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
1、网站访问目录的权限设置
1
2
3
4
5
6
|
<Directory
"/var/www/html"
>
#默认网站存放目录
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
<
/Directory
>
|
注释:
第2行:Options:
Indexes: 索引文件(一般不是下载站点建议关闭此功能)
FollowSynLinks: 是否跟随软链接文件
ExecCGI:是否允许执行CGI脚本;
None:关闭所有功能
All:开启所有功能
第3行: AllowOverride None 是否允许覆盖
第4行: Orader allow,deny 先拒绝后允许
第5行:Allow from all 允许所有
通过以上对权限的说明,不知道你是否已经理解,下面我们举例说明一下。。
例1.
仅拒绝172.16.0.0/16端的主机访问/var/www/html
1
2
3
4
5
6
|
<Directory
"/var/www/html"
>
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
Deny from 172.16.0.0
/16
<
/Directory
>
|
例2.
拒绝172.16.1.1的主机访问,允许172.16.0.0/16网端的主机访问。
1
2
3
4
5
6
7
|
<Directory
"/var/www/html"
>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Deny from
172.16
.
1.1
Allow from
172.16
.
0.0
/
16
</Directory>
|
2、查看与修改默认工作模式
重启httpd服务。。。
此时httpd已经切换到worker模式,但是worker模式不一定比prefork模式性能要强。稳定性相对要略一些。此时启用与不启用依据环境而定。正如适合自己的才是最好的。。
3、站点别名设置
HTTP服务器设置
注意xiaodong这个目录不需要建立
客户端验证
设置别名可以有效隐藏站点目录,可以提高安全性。
4、基于SSL的虚拟主机配置
1)、建立CA服务器(用户颁发证书)
生成CA的私钥
1
2
3
4
5
|
[root@stu10 CA]
# (umask 077; openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
..................+++
............................................................................................................................................................................................................+++
e is 65537 (0x10001)
|
为CA生成自签证书
建立序列号文件和数据库文件
1
2
3
|
[root@localhost CA]# touch serial index.txt
[root@localhost CA]# echo
01
> serial
[root@localhost CA]#
|
至此CA创建完成,我们就可以为客户端颁发证书了
2)、客户端配置
生成私钥
1
2
3
4
5
6
|
[root@stu10 ~]
# (umask 077; openssl genrsa -out /key/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
.........................................................................................+++
..+++
e is 65537 (0x10001)
[root@stu10 ~]
#
|
制作一个证书签署请求:
CA 签署证书
3)、 安装ssl模块
1
2
3
4
5
6
7
8
9
|
[root@stu10 htdoc]# yum install mod_ssl -y
[root@stu10 htdoc]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/
var
/cache/mod_ssl
/
var
/cache/mod_ssl/scache.dir
/
var
/cache/mod_ssl/scache.pag
/
var
/cache/mod_ssl/scache.sem
[root@stu10 htdoc]#
|
4)、服务器配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@stu10 CA]# htpasswd -c -m /key/.htpass user1 #设置user1为虚拟用户
New password: #设置密码
Re-type
new
password: #再次输入密码
Adding password
for
user user1
[root@stu10 htdoc]# vim /etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:
443
> #定义虚拟主机
DocumentRoot
"/var/www/html"
#网站目录
ServerName www.xiaodong.com:
443
#定义主机名
<Directory
"/var/www/html"
>
Options None
AllowOverride AuthConfig #设置用户认证
AuthName
"Only for employees."
#认证名称
AuthType Basic #认证类型为Basic
AuthUserFile /key/.htpass #指定用户文件
Require valid-user #指定虚拟用户
</Directory>
SSLCertificateFile /key/httpd.crt #指定HTTP服务器证书文件
SSLCertificateKeyFile /key/httpd.key #指定HTTP服务器私钥文件
[root@stu10 htdoc]# service httpd restart #重启服务
|
5)、客户端验证:
客户端下载CA证书(/etc/pki/CA/cacert.pem ),并修改cacert.pem扩展名为.crt ;安装证书并访问验证