HICK 者,乡巴佬也

windows 下浏览器和操作系统的 DNS cache

Posted in: Web 开发 — Hick @ 2008/01/30 12:32:14 Comments (2)

一般来说,windows 下操作系统和浏览器把某域名解析为 ip 地址以后,都会把解析结果做 cache ,也就是在一定时间内,该域名会一直被解析为该 ip ,而不管该域名对应的 ip 是否变化或者还绑定了其他 ip 。而浏览器通常都会忽略操作系统的 dns cache 。操作系统的 cache 可以通过 ipconfig /flushdns 命令来清除,而浏览器的 dns cache ,则一般需要启动一个新的浏览器进程(ie 的浏览器 dns cache 是以进程为基本单元的)。

在 ping 一个域名的时候,得到的 TTL 表示 Time To Live ,表示的就是建议操作系统对 dns 做 cache 的时间。浏览器的 dns cache 一般由浏览器自己控制,某些版本的 ie 中 默认 cache 是 30 分钟,也可以通过修改注册表来指定值,参考 >http://support.microsoft.com/default.aspx?scid=KB;en-us;263558

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings\ 中创建 DnsCacheTimeout 和 ServerInfoTimeOut ,类型为 DWORD 。都指定为 5 ,浏览器就的 dns cache 过期时间就是 5s 。

一点比较奇怪的是 http://support.microsoft.com/kb/813827 中说明建立值是以毫秒为单位。虽然针对 ie 不完全一致,但是有重合的版本。我希望的是尽快 timeout ,不再深究。

firefox 也可以在 about:config 中找到相关的配置选项。

Apache 默认字符集问题

Posted in: Web 开发 — Hick @ 2008/01/23 12:22:56 Comments (0)

一个 AsciiDoc 转换后的网页(UTF-8 编码)直接在电脑上打开正常,但是放到某 web server(Apache) 上却显示乱码,手工选择为 utf-8 编码才显示正常。想可能是 http 包头的问题,抓包一看果然是 gb2312 。

找到 httpd.conf 文件,果然配置 apache 的时候通过 AddDefaultCharset 指令设置 apache 的默认字符集为 gb2312。这时候浏览器请求到的网页 http 包头中就会使用该值来指定字符集,而浏览器会根据该值决定网页的字符集——这时候网页的 html 中通过 meta 指定字符集会被忽略。在 ie6, ie7, firefox 下验证了都是如此。

指令说明参见 http://httpd.apache.org/docs/2.0/mod/core.html#adddefaultcharset 。 中文版 http://man.chinaunix.net/newsoft/ApacheManual/mod/core.html#adddefaultcharset

High Performance Web Sites 读书笔记1

Posted in: Web 开发 — Hick @ 2008/01/17 8:31:25 Comments (2)

前言

一想到优化网站,大多数情况下我们都是优化动态的后台程序,比如程序执行效率,查询数据库效率等。一些大规模的站点,比如 www.yahoo.com 等,页面的载入已经是超越了动态程序生成页面的消耗。虽然书中说 10-20% 的时间损耗在服务器端程序生成 html ,其他的损耗在浏览器和服务器的交互以及页面渲染。但是我看来,很多时候还是需要根据网站的规模和表现来评估实际损耗,给出这样的数据并不一定适应所有,甚至是大部分网站。当然,基本上是网站规模(主要是说页面内容量)越大,后台生成 html 的损耗越小——实际上大型站点的很多页面都是完全或者部分静态化的。

这方面的优化,很重要的一方面是了解常见浏览器跟服务器的交互以及解释 html 的方式。开头有提到 Parallel Downloads ,这个解释了浏览器拉取页面组件的一些方式,后面会讲述,比较有价值。还提了一条说,大多数浏览器在请求脚本的时候,会阻塞其他请求,无法并行其他请求。对很多大型站点来说,前台优化的代码,在很多情况下确实要比后台优化来得简单,快速。

http 协议概要

因为它定义了浏览器和服务器的交互方式,了解 http 协议,才能够更好的进行优化,下面主要抽取一些优化比较相关的包头简单介绍:

压缩
浏览器请求头中 Accept-Encoding: gzip,deflate 是告诉服务器它支持的压缩类型。需要注意的是,在服务器回包的时候,apache2.0 的 deflate 也会标记为 gzip 压缩。

条件请求
浏览器并不会把每个请求都发送给服务器,经常会有某些文件已经被浏览器保存起来,这时候浏览器判断被 cache 的文件信息,并把相关信息发送给跟服务器。比如一般浏览器对 cache 文件会发送 If-Modified-Since 表示被 Cache 文件的创建时间,如果服务器发现该文件自该创建以后没有被修改,就直接发给 http 包头告诉浏览器可以读 Cache 即可,这样就节省了传输的时间和服务器消耗。这时候,服务器一般都是返回经典的状态码 304 Not Modified 。

Expires
这个时间指定文件的过期时间,如果浏览器 Cache 了该文件,在没有过期的情况下,根本就不需要跟服务器发送请求。

Keep-Alive
HTTP 协议是建立在 TCP 协议基础上,早期的 HTTP 实现中,每个请求都需要创建一个 socket 连接,这样的话,一个页面通常要与服务器创建很多 socket 连接才能够下载到页面显示需要的组件,这个是很不合理的,socket 连接可能很容易被耗尽。HTTP 1.0 开始允许浏览器跟服务器建立持久连接,也就是所谓的 Keep-Alive ,使得一个连接中能够完成多个请求。这个在浏览器发包和服务器发包中都定义。当一方发包说 Connection: close 时,就会终止该连接。技术上说, HTTP 1.1 不是必须声明的,但是大多数浏览器和服务器还会发送它。HTTP 1.1 里有个叫 Pipelining 的东西,允许浏览器非阻塞(异步)的发送请求。性能应该比持久连接要好,但是 IE 到 IE7 还不支持该功能,Firefox 2 则是默认关闭该功能。因为建立 https 连接更复杂,所以这时候 Keep-Alive 尤其重要。

更好的学习 HTTP 协议可以参考 RFC 文档 http://www.w3.org/Protocols/rfc2616/rfc2616.html 或者 HTTP: The Definitive Guide by David Gourley and Brian Totty (O’Reilly; http://www.oreilly.com/catalog/httptdg) 一书。

(more…)

Real-Time Page Level Time Charts of HttpWatch

Posted in: Web 开发 — Hick @ 2008/01/16 8:39:10 Comments (0)

页面元素载入时间图. 官方文档中的全称为 Real-Time Page Level Time Charts 。可以显示网页各个组件的载入速度以及先后顺序和消耗时间等详细情况。从帮助文档中翻过来的说明:

灰色 blocked
灰色表示阻塞的时间。主要是一些预处理(比如浏览器检索 cache)以及网络连接等待时间。因为 IE 对同一主机同时只能够并发两个连接(这也是 rfc 文档建议的), 当需要多个连接来处理时页面元素时, 某些处理就会被阻塞. 这种情况在请求图片的时候会表现得比较明显.(实际上我还没有确认最多并发两个连接的限制, 据说 firefox 是 8 个并发连接)

粉红 DNS Lookup
把域名解析为 ip 地址花费的时间.

黄色 Connect
浏览器跟服务器或者代理服务器建立 tcp 连接的花费. 在建立 https 连接的时候, SSL 握手进程的相关消耗也被算作再内. Keep-Alive 常常可以用来解决建立连接花费太长的问题.

绿色 Send
浏览器发送请求到服务器的时间. 比如当向服务器 POST 数据的时候, 这个时间一般会稍微长些.

红色 Wait
浏览器发出请求以后, 等待服务器响应的时间. 基本上包括服务器处理请求的时间和网络延时.

墨绿 Receive
颜色描述不一定准. 它表示浏览器活动读取服务区返回数据的时间, 如果服务器返回的文件比较大, 这个时间往往会比较长.

蓝色 Cache Read
包括浏览器读取本地 cache 或者跟服务器请求后返回 304 的时间.

Linux 内核源码管理工具 Git

Posted in: Linux/Unix工具 — Hick @ 2008/01/06 18:56:32 Comments (0)

之前在找 DocBook 资料的时候,曾经接触一个翻译英文技术文档的虚拟团队使用 Git 管理源代码。简单看过一下,今天又无意之中看到有人提及它。

Git 是 Linus Torvalds 实现的源代码管理软件。“Git 是一个快速、可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问。”

Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如,X.org 最近就迁移到 Git 上来了,很多 Freedesktop.org 的项目也迁移到了 Git 上。

Git 目前主要由寻找 CVS 或专有代码管理解决方案替代物的软件开发人员所使用。Git 与 CVS 有很多区别:

1. 分支更快、更容易。
2. 支持离线工作;本地提交可以稍后提交到服务器上。
3. Git 提交都是原子的,且是整个项目范围的,而不像 CVS 中一样是对每个文件的。
4. Git 中的每个工作树都包含一个具有完整项目历史的仓库。
5. 没有哪一个 Git 仓库会天生比其他仓库更重要。

(more…)

Next Page »