Total Pageviews

Thursday 7 April 2016

如何查看网页的response header信息并利用其提升性能

查看网页的header是优化web应用的关键一环,从header中,可以检查到非常多的信息:网页在squid中的缓存时间(age)、客户端缓存时间(expires)、是否有最后修改时间(last-modified)、是否在squid中命中(x-cache)、服务器版本、服务器时间(Date)、gzip压缩情况(Content-Encoding)等等。以上说的这些都是比较基本的信息,本文最后介绍一个利用header来分析客户端请求走向的问题。

先介绍几种查看header的办法:

1、httpwatch

这个软件是在windows+ie下最方便的工具了,在网上可以找到下载地址,并且找到破解的key,没有破解的版本是不可以查看header的。安装完成后,在ie的工具栏上就会有个httpwatch的按钮,点下就在ie的下部打开了一个窗口,在这个窗口的左上角有开启的按钮,按下后,在浏览器输入地址查看时就会把这个网页所有发送的请求链接都记录在窗口里,单击任意一个链接,在下方选择header,就可以看到针对这个链接的request header和response header了。使用httpwatch感觉不便的一点是它无论如何会把浏览的网页里的所有链接都记录起来,如果这些链接非常多,以致于难以找到希望查看的链接,那么就得利用它的filter功能过滤掉无关的链接,但查看下一个网页的时候,要把filter改掉。

2、curl

在linux下使用curl查看一个链接的header的办法更为直接,另外,它还可以通过修改request header来对目标地址进行调试,非常方便:

curl -I http://www.xyz.com

这样就可以看到response header了,但是这个header是无压缩的,所以并不是大多数人所取得的header。要查看压缩版本,执行:

curl -I --compressed http://www.xyz.com

这是使用了curl默认的请求压缩功能,但这个功能在某些时候还是不能取得压缩版本……,执行一个最为原始的:

curl -I -H "Accept-Encoding:gzip, deflate" http://www.xyz.com

这个办法对所有的可支持gzip或defalte压缩的服务器,都是生效的,如果还是没有压缩(没有返回Content-Encoding:gzip),那就是服务器没有支持压缩的了。

顺带记录一个curl检查指定ip的链接的办法,这个对lvs集群下某台机的检查是非常有用的:

curl -I -H "Host:www.xyz.com" -H "Accept-Encoding:gzip, deflate" http://64.233.189.99/

附带一个wget的用法:

wget -S --spider http://www.xyz.com

wget查阅header的功能并不十分好使,所以不经常用它。

3、firebug

如果使用了linux作为桌面,要调试一个带cookie或session之类的网页,那么用curl就非常不便了,这时只能通过浏览器来调试,linux下有普遍支持的浏览器firefox(iceweasel),在firefox里安装上firebug这个插件,便能很容易地查看response header。firebug的使用在网上查查就可以了,应该说还是比较方便的,另外firebug的其它功能也都比较强,这是后话。

有了以上几种办法,查看header应该不算大难题了。

下面来介绍一下如何利用header来分析客户端请求的走向:

因为服务器端做了lvs或者其它类型的负载均衡,所以要检查一些琐碎的故障就变得不太方便,譬如有一台机器,因为种种原因导致它和其它服务器上的程序版本不一致,那么查起来是比较麻烦。通过打印header的方式就可以较为轻松地找到这台有问题的机器。打印header是将能代表本机的一个字符串打印到response header中,一般使用via这个头,这个头可以穿过squid,并且穿过后显示顺序仍为最里的机器到最外的机器,整个流向一目了然。

打印header可以用程序(jsp/php)打印,也可以用服务器来打印,介绍几种:

1、squid

修改squid的配置文件里的visible_hostname 64.233.189.99.cache.sudone.com,使其能标志机器,这样就能在response的via头里看到机器名。常用的就是把ip地址打上去,如果担心被人看到这个ip地址然后ddos,可以打上一些代号。

2、nginx

nginx在配置里敲上一行add_header via $server_addr,便可打印本机ip地址到via里,另外,如果nginx是作为负载均衡的前端,那么打印后端地址也非常方便,敲入:add_header via $upstream_addr即可.