HTTP优化:使用gzip压缩所有文本文件

众所周知,wordpress实在是太大了,文件也多。使用syntaxhighlighter后,还多了一堆js文件。很有必要在文件传输上进行一下优化。
一般像搜索引擎等访问量大的页面都会使用到页面压缩以减少流量和减少服务器负担。通常采用的方法是在HTTP头里加入Content-Encoding选项。
一个典型的HTTP请求:

GET / HTTP/1.1
Host: xiaoxia.org
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 Chrome/6.0.472.63 Safari/534.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
If-Modified-Since: Tue, 19 Oct 2010 04:33:34 GMT


这次对HomeServer所做的内部更新,是检查浏览器可以接受的压缩编码Accept-Encoding,如果含有gzip项,则启用gzip压缩输出Content-Type里含有text的文件,包括动态脚本(php,cgi等)。压缩算法来自zlib。在util.c里增加了一段压缩代码:

int def( const char* in, int in_len, char* out, int out_len )
{
	z_stream strm;
	strm.zalloc = (alloc_func) Z_NULL;
	strm.zfree = (free_func) Z_NULL;
	strm.opaque = Z_NULL;
	if( deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 16+15, 
8, Z_DEFAULT_STRATEGY) != Z_OK ){
		DBG("deflate failed");
		return -1;
	}
	strm.avail_in = in_len;
	strm.next_in = (unsigned char*)in;
	strm.next_out = (unsigned char*)out;
	strm.avail_out = out_len;
	deflate(&strm, Z_FINISH);
	deflateEnd(&strm);
	return out_len - strm.avail_out;
}

针对512字节到8MB之间的文本文件进行压缩,下面是输出时候的判断。

if( conn->data_size > 512 && conn->data_size < MB(8) && 
	strstr(conn->document_type, "text") && 
	strstr(header_value(conn, "Accept-Encoding"),"gzip") &&
	strstr(conn->header_send, "Content-Encoding")==NULL ){
	NEW( buffer, MAX_DATASEND+KB(1) );
	int ret = def( conn->data_send, conn->data_size, buffer, MAX_DATASEND+KB(1) );
	DBG("compress from %d bytes to %d bytes.", conn->data_size, ret );
	if( ret > 0 ){
		conn->data_size = ret;
		DEL( conn->data_send );
		conn->data_send = buffer;
		sprintf( conn->header_send, "%sContent-Encoding: gzip\r\n", conn->header_send );
	}else{
		DEL(buffer);
	}
}

一般情况下只针对文本文件压缩输出即可,其它文件例如jpg压缩后的大小可能比原来的文件更大。一般页面的压缩后可以节约30%-90%的流量。我测试了下载一个20KB的含有一串以0123456789为循环节的数字文本文件,gzip压缩成86字节传输。而一般html页面都含有大量重复的标签,所以有很高的压缩率。

低碳生活,从我做起!

HTTP优化:使用gzip压缩所有文本文件》有10个想法

    1. Xiaoxia 文章作者

      第一次打开wordpress慢也很正常。。。浏览器有缓冲后,也许就快多了。gzip压缩也能减少一定的传输时间哦!

      回复
    1. Xiaoxia 文章作者

      如果是静态页面,并且在服务器里保存gzip的缓存,gzip就发挥得很好了,也比较少出现你说的负担!
      对于不是很大型的服务器,并发访问量不超过100个,开启gzip都不会造成太大的负担吧。

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据