http协议和http的配置
URL方案:scheme(http://;https://)
服务器地址:ip:port
资源路径:
http://www.mageedu.xom/bbs/index.php
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:参数,类似表单的数据
http://www.a.com/bba/hello;gender=f(参数)
query:查询标准
http://www.a.com/bba/item.php?username=tom&title=abc
frag:锚定
相对URL:同站内文档;
绝对URL:跨站文档
http协议:
http/0.9, http/1.0, http/1.1,http/2.0
http协议:stateless(无状态) 服务器无法持续追踪访问者来源。
解决方法:cookie:访问服务器时通过cookie从服务器发送至客户端,然后客户端保存至磁盘,到时在发请求网站时,就知道曾经访问过。
追踪手段:cookie,session
http事务:request response
一次请求以及与其对应的响应
http方法:get,put,head,post,delete
报文:
http请求报文
报文格式:
<method><request-URL><version>
<headers>
<entity-boby>
http响应报文
报文格式:
<version><status><reason-phrase>
<headers>
<entity-boby>
注释:
<method>:请求方法,希望服务器端执行的动作,如get,put,head,options,trace
<request-URL>:可以是相对资源或者是绝对资源
<version>:协议版本格式http/<major>.<minor>,如:http/1.0
<headers>:http首部;每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值。
<status>:状态码 如:200,301,404,502
<reason-phrase>:原因短语,数字状态码简要信息
<entity-boby>:主体部分,请求时附加数据或响应时附加的数据,请求实体可能为空。
method(方法):
安全方法:get,head,options,trace,
post
危险方法:put,deletet,
GET:从服务器获取一个资源,请求资源没有报文。
HEAD:跟GET相似,但其不需要服务器发送资源,而只要响应报文首部
POST:向服务器发送服务器要处理的数据,支持HTML表单提交,服务器发送表单,客户端表单中有用户填入的数据,这些数据会发送到服务器段,由服务器存储至某位置。
PUT:与GET相反,向服务器写入文档;例如:发布系统
DELETE:删除服务器上url指向的资源
OPTIONS:探测服务器端对某资源所支持的请求的方法
TRACE:跟踪请求要经过的防火墙、代理和网关等
响应报文状态码
1**:100-101信息性状态码
2**:成功状态码
200-206:ok
3**:重定向的状态码(300-305)
301: moved permanently永久重定向,响应报文中是使用首部“Location:URL”指定资源现在所处的位置
302:founnd临时重定向,响应报文中是使用首部“Location:URL”指定临时资源位置
304:not modified服务器资源没有修改,使用本地缓存;修改的话,发过来,条件式请求中使用
4**: 客户端错误 (400-415)
401:输入账号和密码,认证服务器资源 unauthorized
403:forbidden 拒绝访问,请求被服务器权限拒绝
404:not found 服务器无法找到请求的url
405: Method not allowed 不允许使用此方法请求相应的url
5**: 服务器类的错误(500-505)
500:internal server error 服务器内部错误;服务器权限错,脚本无法执行
502: bad gateway 代理服务器从上游收到一条伪响应
503: serice unavaiabe: 服务器此时无法提供服务,但将来可能可用
首部格式:Name:Value
例如:
首部分三类:
通用首部:请求和响应都可以使用的;
请求首部:定义请求首部
响应首部:定义响应首部
实体首部:定义主题部分
扩展首部:非标准首部,可能有程序开发者创建的,例如x-forword-for
通用首部:
connection:定义C/S之间关于请求/响应的有关选项;连接状态close,keeplive
connection:keep-alive持久连接
via:显示了报文经过的中间节点
cache-control:缓存指示
请求首部:
client-IP:
host:请求的主机名和端口号,虚拟主机环境下用于不同的虚拟主机
referer:指明请求当前资源的上级资源url
user-Agent:用户代理,使用什么工具发出的请求
accep首部:标明客户端自己更倾向于支持的方式
accept:指明服务器能发送的媒体类型
accept-charset:支持使用的字符集
accept-Encoding:支持使用的内容编码方式
accept-Language:支持使用语言
条件请求首部:
expect:客户端告诉服务端,自己期望的行为
IF-Modfied-Since:是否在指定的时间以来,是否修改此资源;
If-None-Match:是否不匹配本地缓存的文档的Etag是否与服务器文档Etag
安全相关的请求首部:
Authorization:客户端提交给服务端的认证数据,如:账号和密码
cookie:客户端发送给服务端身份标识
cookie2
代理请求首部:
Proxy-Authorization:向代理服务器认证
响应首部:
信息性首部:
Age:资源的有效期限
server:向客户端标明服务器程序名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:对当前资源来讲,服务器所能接受请求范围类型
vary:服务器会根据列表中的内容挑选出 最适合的版本发送给客户端
跟安全相关的响应首部:
set-cookie:服务端在某客户端第一次请求时发给的令牌
set-cookie2:服务端在某客户端第一次请求时发给的令牌
www-Authentication:质询,即要求客户提供账号和密码
实体首部:
Location:资源的新位置
Allow:允许对资源使用的请求方法
内容首部:
content-encoding
content-language
content-length 主体大小
content-Location 实体真正所处位置
content-range
content-type 主题的对象类型
缓存首部:
Etag:实体扩展标签
expires:过期期限
last-modified:上一次的修改时间
15 curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTPS,HTTP,GOPHER,TELNET,DICT,FILE及LDAP等协议,curl支持HTTPS的POST、PUT等方法,FTP上传,kerberous认证,HTTP上传,代理服务器,cookies,socks5代理服务器,通过http代理服务器上文件到FTP服务器等等,功能十分强大。
用法:curl [options] [URL...]
curl的常用选项:
-A 设置用户代理发送给服务器
-basic 使用http基本认证,当服务器使用basic认证就使用,一般会紧跟-u指明用户名和密码发送服务器端
-e 来源网址(模拟从那个网站跳转而来)
--cacert <file> CA证书 验证服务器端与客户端的公钥与私钥验证,数据完整性
--compressed 要求服务器发送数据是压缩格式
-H <line> 自定义首部信息给服务器
-I 返回响应首部
--limit-rate <rate> 设置下载限速
-u <user[:password]> 设置发送服务器的用户和密码
-0 使用http 1.0的协议
示例:
另外的一个工具:elink
elinks [OPTION]... [URL]...
-dump 不进入交互模式而直接将URL的内容输出至标准输出。
16 使用mod_deflate模块压缩页面优化传输速度
优点:对于带宽不怎么够用的情况下,通过压缩文件传输,减轻带宽压力
缺点:使用压缩,一般是要压缩后至服务器,服务器压缩后到客户端解压缩,这样会增加服务器的工作压力
使用场景:
(1)节约带宽,额外消耗CPU;有些较老的浏览器不支持压缩
(2)压缩适用于压缩资源,例如文本文件,不适用流文件
配置如下:
SetOutputFilter DEFLATE
# mod_deflate configuration
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Hghest 9 - Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
测试:
17 https
http over ssl = https 443/tcp
ssl:v3
tls:v1
ssl会话简化过程
tcp的三级握手
在第3次的发送给给服务端的时候,如下:
(1)客户端发送可以供选择的加密方式,并向服务器请求证书;
(2)服务器端发送证书,选定的加密的方式给客户端
(3)证书验证:
如果信任给其发证书的CA
(a)验证证书来源的合法性,用颁发证书的CA公钥解密证书上数字签名
(b)验证证书的内容的合法性,用单向加密计算证书指纹与解密指纹一致,完整性验证
(c)检查证实的有效性
(d)检查证书是否被吊销
(e)证书中拥有者额名字,与访问的目标主机(申请CA主机)要一致
(4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换。
(5)服务端就用此密钥加密用户请求的资源,响应给客户端
注意:ssl回话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机。
配置httpd支持https
(1)为服务器申请数字证书;
测试:通过创建CA发证书
(a)创建私有CA
(b)在服务器创建证书签署请求
(c)ca签证
(2)配置httpd支持使用ssl,及使用的证书
yum -y install mod_ssl
配置文件:/etc/httpd/cong.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile 已请求的证书
SSLCertificateKeyFile 私钥证书
(3)测试基于https访问相应的主机
openssl s_client [-connect host:port] [-cert filename] [-CAfile filename]
示例:
(a)创建私有CA
(b)
(c)
验证:
https配置:
测试ca
解决方法:
(1)将CA证书下载放入桌面,将web服务器/tmp/cacert.pem改名cacert.crt
(2)双击安装
18 http自带的工具程序
htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具
apachectl:服务自带脚本,支持start.stop
apxs: 扩展工具,为了编译安装第三方模块工具的 ,有httpd-devel包安装
rotatelogs:日志滚动工具
access.log,access.1.log,access.2.log
suexec:访问某些有特殊权限资源时,临时切换至指定用户运行。
ab:apache benchmark;压力测试工具
19 http压力测试工具
模拟:ab
webbench
http_load
专业:jmeter,loadrunner
tcpcopy
ab [OPTIONS] URL
-n:总的请求数
-c:模拟并发数
-k:持久连接模式
ulimit -n #:调整当前用户所同事打开的文件数