要想做好Apache的压力测试和日常的监控,肯定是要对http协议以及其工作过程有一定了解的,如果说是通过一些流量分析软件来进行监视的话还好说,一旦直接通过查看Apache的日志来分析流量、查看错误,就变得无从下手了,那么我们先来简单看看http协议是什么
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,适用于分布式超媒体信息系统。常基于TCP的连接方式,目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generationof HTTP)的建议已经提出,HTTP1.1版本中给出一种持续连接的机制。绝大多数的Web开发,都是构建在http协议之上的Web应用。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径即可,HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
接下来看看http的请求和响应:
http请求由三部分组成,分别是:请求行、消息报头、请求正文,请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式就像这样:“Method Request-URI HTTP-Version CRLF”,其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行。
请求方法有多种,各个方法的解释如下:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
举例:
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源。
POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。比如我们在执行搜索动作的时候就会连同我们的搜索内容提交给搜索引擎
HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
http的请求与Apache监视维护关系不是很密切,所以我们做一般的了解就行,而http的响应则在分析Apache日志的时候扮演者重要的角色。接下来就来仔细看看http的响应部分:
在接收和解释请求消息后,服务器返回一个HTTP响应消息。
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文,对于我们观察Apache日志来说,了解状态行就已经足够。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK//客户端请求成功
400 Bad Request//客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden//服务器收到请求,但是拒绝提供服务
404 Not Found//请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable//服务器当前不能处理客户端的请求,一段时间后可能恢复正常
Apache的通用日志格式有两种,common和combined,接下来就来对照一条Apache成功访问的common日志来理解一下这些参数:
192.168.2.101 - - [25/Aug/2013:15:44:15+0800] "GET /log/usage.png HTTP/1.1" 200 2010"http://192.168.2.20/log/" "Mozilla/5.0 (compatible; MSIE 10.0;Windows NT 6.2; Trident/6.0)"
192.168.2.101 -----客户端IP
- -----使用identd时才会有信息,一般情况下都是-
- -----远程用户(从验证获取到的)
[25/Aug/2013:15:44:15 +0800] -----收到请求时的时间
"GET /log/usage.png HTTP/1.1" -----请求的首行
200 -----服务器端返回的状态码
2010 -----除HTTP头以外的返回的字节数
http://192.168.2.20/log/ -----从哪个页面链接跳转到的此页面
"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT6.2; Trident/6.0)" -----用户的User-Agent,简单的可以理解为使用的哪种浏览器
下面来介绍两种压力测试工具和一款日志监控软件,先来简单说明一下我机器的环境以及要安装的源码包:
lOS:Redhat Enterprise Linux AS v5.4
lhttpd-2.2.3-31.el5.i386.rpm
lhttp_load-12mar2006.tar.tar
lwebalizer-2.23-05-src.tgz
工具一:ab
ab是Apache自带的HTTP压力测试工具,全称是ApacheBench,同微软的WAST、惠普的LoadRunner、QALoad等比起来,它要方便易用得多,是Apache的一个安装组件,所以只需要下载Apache安装后就能使用,该命令位于Apache安装目录下的bin文件夹中。ab专门用于HTTP Server的benchmark testing,可以同时模拟多个并发请求,它的设计意图是描绘当前所安装的Apache的执行性能,主要是显示所安装的Apache每秒可以处理多少个请求。ab没有LR那么强大,但它足够轻便,若只是在开发过程中想检查一下某个模块的响应情况,或者做一些场景比较简单的测试,ab是个不错的选择。
由于ab是Apache自带的测试工具,不需要我们再去额外安装,那么干脆就直接拿来用即可,要测试一个合法的域名,需要有DNS服务的支持,在这里我用hosts文件来代替DNS服务器的功能,首先要编辑hosts文件:
测试
以上只是简单的举个例子描述一下怎么去使用这个工具,当然,这个工具的参数远不止这些,可以查看帮助一慢慢理解
工具二:http_load
http_load基于linux平台的一种性能测工具。以并行复用的方式运行,用以测试web服务器的吞吐量与负载,测试web页面的性能。
它有以下几个优点优点:
1.基于命令行,简单、易于上手
2.小巧轻便,解压缩后不到100k
3.开源,免费
但是也有一定的缺点:
1.仅适用于web页面的性能测试,不适用于访问数据库
2.测试结果分析有限
3.平台依赖linux
安装http_load
http_load的使用其实和ab比较相似,主要还是去多多了解其中的参数
工具三:webalizer
Webalizer是用C写的程序,所以其具有很高的运行效率。在主频为200Mhz的机器上,webalizer每秒钟可以分析10000条记录,所以分析一个40M大小的日志文件只需要15秒。
它支持标准的一般日志文件格式(Common Logfile Format),除此之外,也支持几种组合日志格式(Combined Logfile Format)的变种,从而可以统计客户情况以及客户操作系统类型。并且现在webalizer已经可以支持wu-ftpd xferlog日志格式以及squid日志文件格式。支持命令行配置以及配置文件。可以支持多种语言,也可以自己进行本地化工作。支持多种平台,比如UNIX、linux、NT, OS/2 和 MacOS等。
安装webalizer:
* * * * *,从左到右依次代表
minute 每到多少分钟
hour 每到多少小时
day of month 每到一个月的多少天
month 每到多少个月
day of week 每到一周的某几天
即每天凌晨1点执行该脚本。
说明:
-F clf 指明我们的web日志格式为标准的一般日志文件格式(Common Logfile Format)
-p 指定使用递增模式,这就是说每作一次分析后,webalizer会生产一个历史文件,这样下一次分析时就可以不分析已经处理过的部分。这样我们就可以在短时间内转换我们的日志文件,而不用担心访问量太大时日志文件无限增大了。
-n ““指定服务器主机名为空,这个输出紧跟在结果标题后面
-o “www.test.com”指定输出结果标题.
/var/log/httpd/access_log: 指定日志文件这样就能轻松的实现对日志的非常直观的监控了