一、httpd报文详解
1、URL:Unifrom Resource Locator
URL方案:scheme
服务器地址:ip:port
资源路径:
例如: http://www.magedu.com:80/bbs/index.php
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:参数
2、HTTP报文
HTTP请求:request HTTP请求报文
HTTP响应:respone HTTP响应报文
HTTP事务:一次请求以及与其对应的响应
HTTP方法:GET,PUT,HEAD,POST,DELETE
3、 报文语法格式:
1)request报文:
<method> <request-URL> <version> #起始行|请求行
<headers> #首部
#2行空白行
<entity-body> #实体
2)response报文:
<version> <status> <reason-phrase> #起始行|请求行
状态码 原因短语
<headers>
<entity-body>
3)<method>:请求方法,希望服务器端执行的动作,如GET、HEAD、POST等
安全的方法:
GET:从服务器获取一个资源,需要服务器发送
HEAD:跟GET相似,但不需要服务器发送资源而仅传回响应首部
POST:向服务器发送要处理的数据,支持HTML表单提交,表单中有用户填入的数据,发送给服务器端,由服务器存储
PUT: 与GET相反,向服务器写入文档:发布系统。将请求的主体部分存储在服务器上,
DELETE:请求删除服URL指向的资源务,器上指定的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:探测服务器对指定资源支持使用的请求方法
4)<request-url>:请求的资源,可以是相对路径,也可以是完整的URL
<version>:协议版本,格式HTTP/<major>。<minor>,如http/1.0
<headers>:HTTP首部
5)<status>:状态码
<reason-phrase>:原因短语,数字状态吗易读信息
<entity-body>:主体部分
4、status(状态码):
三位数字,如200,301,302,404,502;标记请求处理过程中发生的情况
1XX:信息提示性状态码
100:请求继续补充内容
101:转换协议
2XX:成功状态码
200:OK 请求没问题,发送成功
201:Created OK
3XX:重定向状态码
301:Moved Permanebtly 永久重定向:请求的URL指向的资源已经被删除,但在响应报文中通过在响应报文中使用首部“Location:URL”指定资源现在所在的位置,
302:Found 临时重定向:在响应报文中使用首部“Location:URL”指定临时资源位置
304:Not Modified,客户端发出条件式请求,但服务器上的资源未曾发生改变,使用缓存;则通过响应此响应码通知客户端: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,服务器此时无法提供服务,但将来可能可用
reason-phrase:状态码所标记的状态的简要描述
headers:每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值
entity-body:请求是附加的数据或响应时的数据
5、headers(HTTP首部)的分类:
格式:Name: Value
通用首部:请求和响应都可以使用
Date:报文的创建时间
Connection:定义C/S之间请求/响应的有关选项:连接方式,如Keep-alive
Via:显示报文经过的中间节点
Cache-Control:控制缓存
Pragma
请求首部:
Accept首部:用于标明客户自己更倾向于支持使用的能力
Accept:通知服务器自己可接收的媒体类型
Accept-Charset:字符集
Accept-Encoding:通知服务器自己可接收的编码格式。如gzip
Accept-Language:语言
信息式请求首部:
client-IP:
Host:请求的服务器名称和端口号;虚拟环境下的不同虚拟主机
Referer:指明了请求当前资源的原始资源的URL
User-Agent:客户端代理类型,使用什么工具发出的请求
条件式请求首部:
Expect:期望的行为
If-Modified-Since:是否在指定的时间以来修改过此资源
If-Unmodified-Since:
If-None-Match:本地缓存中存储的文件Etag标签是否与服务器不匹配
If-Match
跟安全相关的请求首部:
Authorication:客户端提交给服务端的认证数据,如账号和密码
Cookie:客户端发送给服务器端身份标识
Cookie2
代理请求首部:
proxy-Authorization:向代理服务器认证
响应首部
Age:响应持续的时间
Server:向客户端标明服务器程序名称和版本
协商首部:某资源有多种和表示方法时使用
Accept-Ranges:对当前资源来讲,服务器所能够接受的范围类型
Vary:首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端
跟安全相关的响应首部
Set-Cookie:服务器端在某客户端第一次请求时发给的令牌
Set-Cookie2:
WWW-Authenication:质询,即要求客户端提供账号和密码
实体首部
Location:资源的新位置
Allow:允许对此资源使用的请求方法
内容首部:
Contern-Encoding内容编码
Contern-Language
Contern-Length 实体的长度
Contern-type 实体的对象类型
Contern-Range 实体真正所处位置
Contern-Location
缓存首部:
ETag:实体的扩展标签
Expires:实体过期标签
Last-Modified:上一次的修改时间
扩展首部
二、httpd相关
1、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl的常用选项:
语法:
curl [options] [URL...]
-A/--user-agent <string> 设置用户代理发送给服务器,即告诉服务器浏览器类型
-basic 使用HTTP基本验证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址,跳转过来的网址
--cacert <file> 指定CA证书 (SSL)
--compressed 要求返回是压缩的形势,如果文件本身为一个压缩文件,则可以下载至本地
-H/--header <line>自定义头信息传递给服务器
-I/i/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
另一个工具:elinks
elinks [OPTION]...[URL]...
-dump:不进入交互式模式,而直接将URL的内容输出到标准输出
2、mod_deflate模块
使用mod_deflate模块压缩页面优化传输速度,可以写为一行,也可以写多行,默认为gzip
适用场景:
(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 (Highest 9 - Lowest 1)默认为6 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
3、https
http over ssl = https
http 文本格式
https 二进制格式
ssl:v3 Secure Socket Layer
tls:v1 Transport Layer Security
x509.3证书格式:
证书格式的版本号
证书序列号
证书签名算法
证书颁发者
有效期
拥有者的名称
拥有者的公钥
CA的ID
持有者的ID
其它扩展信息
基本约束
证书策略
证书的使用限制
CA签名
PKI:Public Key Infrastructure
端实体(申请者)
注册机构(RC)
签证机构(CA)
证书撤销列表(CRL)发布机构
证书存取库
ssl会话的简化过程:
1、tcp三次握手建立虚连接
2、ssl会话协商
1)客户端发送可供选择的加密方式(tcp第三次握手时)
2)服务器端发送证书和选定的加密方式给客户端
3)证书验证
如果信任给其发证书的CA:
a、验证证书的合法性,用CA的公钥解密证书上的数字签名
b、验证证书的内容的合法性,
c、检查证书的有限期限
d、证书是否已被吊销
e、证书中拥有者的名字,与访问的目标主机要一致
4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
5)服务器用此密钥加密用户请求的资源,响应给客户端
注意:ssl会话是基于IP地址创建,不支持基于FQDN的虚拟主机;所以单IP的主机上,仅可以使用一个https虚拟主机
回顾几个术语:PKI,CA,CRL,X.509(V1,V2,V3)
配置httpd支持https:
1、为服务器申请数字证书
测试:通过私有CA证书
1)创建私有CA
2)在服务器创建证书签署请求
3)CA签证
2、配置httpd支持使用ssl,及使用的证书
# yum -y install mod_ssl
编辑配置文件:/etc/httpd/conf.d/ssl.conf
配置使用ssl的虚拟主机:
启用 DocunmentRoot
启用 ServerName
配置证书和私钥:
SSLCertificatFile 证书文件
SSLCertificatKeyFile 密钥文件(私钥)
3、重启httpd服务
4、测试
CLI: openssl s_client -connect 验证的服务器地址:端口(443) [-cert 自己的证书路径] -CAfile CA证书的路径
GUI:测试基于https访问相应的主机
4、mod_deflate模块
使用mod_deflate模块压缩页面优化传输速度,
可以写为一行,也可以写多行,默认为gzip
SetOutputFilter DEFLATE # 启用输出过滤器为deflate # mod_deflate configuration <IfModule mod_deflate.c> # 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 (Highest 9 - Lowest 1)默认为6 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 </IfModule>
为了管理方便可以在分段配置文件conf.d中新建deflate.conf单独配置
5、资源限定
软限制:可以超出的限制,但仅能超出一定时长
硬限制:绝对不能超出的限制
ulimit修改的是软限制
ulimit
-n [N]:显示或限定能打开的最大的文件句柄数;默认1024
-u [N]:每个用户所能运行的最多进程数
配置文件:/etc/security/limits.conf
/etc/security/limits.d/*.conf
在配置文件中添加:
apache hard nofile 65535 apache hard nproc 30000
添加后不会立即生效:
echo "ulimit -SHn 65535">> /etc/rc.local echo "ulimit -SHu 30000">> /etc/rc.local
5、httpd自带的工具程序
htpasswd:basic 认证基于文件实现时,用到的帐号密码文件生成工具
apachectl:httpd自带的服务控制脚本,支持start,stop
apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具
dbmmanage:为基本认证创建和更新DBM格式的用户认证文件
logresolve:将Apache日志文件中的Ip地址解析到主机名称
rotatelogs:日志滚动工具,不关闭Apache而切换日志文件,
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行
ab:apache benchmark
http压力测试工具:
ab
webbench
http_load
seige
tcp_copy 能复制真实的流量并重放
ab [options] URL
-n:总的请求数
-c:模拟的并发数
-k:以持久连接模式测试
一般并发数应该小于等于请求数
[root@node1 ~]# ab -c 1000 -n 10000 http://192.168.100.10/index This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 192.168.100.10 (be patient) Completed 1000 requests Completed 2000 requests Completed 3000 requests Completed 4000 requests Completed 5000 requests Completed 6000 requests Completed 7000 requests Completed 8000 requests Completed 9000 requests Completed 10000 requests Finished 10000 requests Server Software: Apache/2.2.15 Server Hostname: 192.168.100.10 Server Port: 80 Document Path: /index Document Length: 283 bytes Concurrency Level: 1000 Time taken for tests: 3.619 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Non-2xx responses: 10013 Total transferred: 4636019 bytes HTML transferred: 2833679 bytes Requests per second: 2763.40 [#/sec] (mean) Time per request: 361.873 [ms] (mean) Time per request: 0.362 [ms] (mean, across all concurrent requests) Transfer rate: 1251.09 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 111 523.5 1 3139 Processing: 0 67 188.7 31 3090 Waiting: 0 65 188.5 30 3090 Total: 23 178 560.5 33 3618 Percentage of the requests served within a certain time (ms) 50% 33 66% 38 75% 48 80% 55 90% 72 95% 1142 98% 3033 99% 3156 100% 3618 (longest request) [root@node1 ~]#