`
Ryee
  • 浏览: 280072 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Gzip压缩原理Optimize Your Site With GZIP Compression

阅读更多

Compression is a simple, effective way to save bandwidth and speed up your site. I hesitated when recommending gzip compression when speeding up your javascript because of problems in older browsers.

But it’s the 21st century. Most of my traffic comes from modern browsers, and quite frankly, most of my users are fairly tech-savvy. I don’t want to slow everyone else down because somebody is chugging along on IE 4.0 on Windows 95. Google and Yahoo use gzip compression. A modern browser is needed to enjoy modern web content and modern web speed — so gzip encoding it is. Here’s how to set it up.

Wait, wait, wait: Why are we doing this?

Before we start I should explain what content encoding is. When you request a file like http://www.yahoo.com/index.html, your browser talks to a web server. The conversation goes a little like this:

HTTP_request.png

1. Browser: Hey, GET me /index.html
2. Server: Ok, let me see if index.html is lying around…
3. Server: Found it! Here’s your response code (200 OK) and I’m sending the file.
4. Browser: 100KB? Ouch… waiting, waiting… ok, it’s loaded.

Of course, the actual headers and protocols are much more formal (monitor them with Live HTTP Headers if you’re so inclined).

But it worked, and you got your file.

So what’s the problem?

Well, the system works, but it’s not that efficient. 100KB is a lot of text, and frankly, HTML is redundant. Every <html>, <table> and <div> tag has a closing tag that’s almost the same. Words are repeated throughout the document. Any way you slice it, HTML (and its beefy cousin, XML) is not lean.

And what’s the plan when a file’s too big? Zip it!

If we could send a .zip file to the browser (index.html.zip) instead of plain old index.html, we’d save on bandwidth and download time. The browser could download the zipped file, extract it, and then show it to user, who’s in a good mood because the page loaded quickly. The browser-server conversation might look like this:

HTTP_request_compressed.png

1. Browser: Hey, can I GET index.html? I’ll take a compressed version if you’ve got it.
2. Server: Let me find the file… yep, it’s here. And you’ll take a compressed version? Awesome.
3. Server: Ok, I’ve found index.html (200 OK), am zipping it and sending it over.
4. Browser: Great! It’s only 10KB. I’ll unzip it and show the user.

The formula is simple: Smaller file = faster download = happy user.

Don’t believe me? The HTML portion of the yahoo home page goes from 101kb to 15kb after compression:

yahoo_compression.PNG

The (not so) hairy details

The tricky part of this exchange is the browser and server knowing it’s ok to send a zipped file over. The agreement has two parts

  • The browser sends a header telling the server it accepts compressed content (gzip and deflate are two compression schemes): Accept-Encoding: gzip, deflate
  • The server sends a response if the content is actually compressed:Content-Encoding: gzip

If the server doesn’t send the content-encoding response header, it means the file is not compressed (the default on many servers). The “Accept-encoding” header is just a request by the browser, not a demand. If the server doesn’t want to send back compressed content, the browser has to make do with the heavy regular version.

Setting up the server

The “good news” is that we can’t control the browser. It either sends the Accept-encoding: gzip, deflate header or it doesn’t.

Our job is to configure the server so it returns zipped content if the browser can handle it, saving bandwidth for everyone (and giving us a happy user).

For IIS, enable compression in the settings.

In Apache, enabling output compression is fairly straightforward. Add the following to your .htaccess file:


# compress text, html, javascript, css, xml:
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

# Or, compress certain file types by extension:
<Files *.html>
SetOutputFilter DEFLATE
</Files>

Apache actually has two compression options:

  • mod_deflate is easier to set up and is standard.
  • mod_gzip seems more powerful: you can pre-compress content.

Deflate is quick and works, so I use it; use mod_gzip if that floats your boat. In either case, Apache checks if the browser sent the “Accept-encoding” header and returns the compressed or regular version of the file. However, some older browsers may have trouble (more below) and there are special directives you can add to correct this.

If you can’t change your .htaccess file, you can use PHP to return compressed content. Give your HTML file a .php extension and add this code to the top:


In PHP:
<?php if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start(); ?>

We check the “Accept-encoding” header and return a gzipped version of the file (otherwise the regular version). This is almost like building your own webserver (what fun!). But really, try to use Apache to compress your output if you can help it. You don’t want to monkey with your files.

Verify Your Compression

Once you’ve configured your server, check to make sure you’re actually serving up compressed content.

  • Online: Use the online gzip test to check whether your page is compressed.
  • In your browser: Use Web Developer Toolbar > Information > View Document Size (like I did for Yahoo, above) to see whether the page is compressed.
  • View the headers: Use Live HTTP Headers to examine the response. Look for a line that says “Content-encoding: gzip”.

Be prepared to marvel at the results. The instacalc homepage shrunk from 36k to 10k, a 75% reduction in size.

Try Some Examples

I’ve set up some pages and a downloadable example:

  • index.html – No explicit compression (on this server, I am using compression by default :) ).
  • index.htm – Explicitly compressed with Apache .htaccess using *.htm as a rule
  • index.php – Explicitly compressed using the PHP header

Feel free to download the files, put them on your server and tweak the settings.

Caveats

As exciting as it may appear, HTTP Compression isn’t all fun and games. Here’s what to watch out for:

  • Older browsers: Yes, some browsers still may have trouble with compressed content (they say they can accept it, but really they can’t). If your site absolutely must work with Netscape 1.0 on Windows 95, you may not want to use HTTP Compression. Apache mod_deflate has some rules to avoid compression for older browsers.
  • Already-compressed content: Most images, music and videos are already compressed. Don’t waste time compressing them again. In fact, you probably only need to compress the “big 3″ (HTML, CSS and Javascript).
  • CPU-load: Compressing content on-the-fly uses CPU time and saves bandwidth. Usually this is a great tradeoff given the speed of compression. There are ways to pre-compress static content and send over the compressed versions. This requires more configuration; even if it’s not possible, compressing output may still be a net win. Using CPUcycles for a faster user experience is well worth it, given the short attention spans on the web.

Enabling compression is one of the fastest ways to improve your site’s performance. Go forth, set it up, and let your users enjoy the benefits.

分享到:
评论

相关推荐

    High Performance iOS Apps Optimize Your Code for Better Apps 无水印pdf

    High Performance iOS Apps Optimize Your Code for Better Apps 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源...

    High Performance iOS Apps- Optimize Your Code for Better Apps 无水印pdf

    High Performance iOS Apps- Optimize Your Code for Better Apps 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源...

    Drupal 启用缓存和Gzip压缩设置方法

    - **Page compression**:选择“Enabled”,这将启用Gzip压缩,减少页面传输大小。 4. **块缓存**: - **Block cache**:选择“Enabled”,这样可以将区块缓存起来,避免每次请求都需要重新加载。 5. **CSS...

    C++ High Performance Boost and optimize the performance of your C++17 zip

    C++ High Performance Boost and optimize the performance of your C++17 code_Code 源码 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书

    Qualcomm Hexagon SDK: Optimize Your Multimedia

    ### Qualcomm Hexagon SDK: 深入解析与多媒体优化 #### 一、Hexagon SDK简介 **Qualcomm Hexagon SDK** 是由Qualcomm Technologies, Inc.开发的一款强大的软件开发工具包,旨在帮助开发者轻松利用Hexagon数字信号...

    High Performance iOS Apps: Optimize Your Code for Better Apps [2016]

    If you’re an iOS developer with app-building experience, this practical guide provides tips and best practices to help you solve many common performance issues. You’ll learn how to design and ...

    Getting Started with Varnish Cache: Accelerate Your Web Applications

    Getting Started with Varnish Cache: Accelerate Your Web Applications by Thijs Feryn English | 13 Mar. 2017 | ASIN: B06XP3D6Z2 | 253 Pages | AZW3 | 720.91 KB How long does it take for your website to ...

    System Optimize Tools V1.0.1

    System Optimize Tools V1.0.1 System Optimize Tools V1.0.1 System Optimize Tools V1.0.1 System Optimize Tools V1.0.1 System Optimize Tools V1.0.1 System Optimize Tools V1.0.1 System Optimize Tools V...

    前端开源库-node-optimize

    "node-optimize"库的核心功能是代码合并与压缩。它能将多个JavaScript模块整合到一个文件中,这样浏览器只需要加载一个文件就能执行整个应用,大大减少了网络请求。此外,该库还会对合并后的代码进行压缩,去除不必...

    Laravel开发-laravel-optimize-images

    `laravel-optimize-images`是一个针对Laravel 4的扩展,旨在帮助开发者更有效地管理和优化项目中的图片资源。这个扩展提供了命令行工具,使得批量处理和优化图像变得更加便捷。 在深入探讨`laravel-optimize-images...

    Robust FREE Internet Speed Booster

    for d1-7C1-6k1-3srcBoost Your Modem & Browser Speed up to 400% & Optimize your Internet Experience. Easy-to-use, Internet Optimizer for Windows 95, 98, ME, NT, 2000 and XP designed to automatically ...

    HTML, CSS & JavaScript Web Publishing in One Hour a Day 7th 第7版 0分

    Sams Teach Yourself HTML, CSS & JavaScript Web Publishing in One Hour a Day, Covers HTML5, CSS3, and jQuery 7th Series: Sams Teach Yourself Paperback: 768 pages ...Optimize your site for search engines

    Go Web Development Cookbook2018

    HTTP and TCP servers, optimize server responses with GZIP compression, and implement routing and logging in a Go web application. Chapter 2, Working with Templates, Static Files, and HTML Forms, ...

    SSD Optimize v1.1 Build 823

    SSD Optimize v1.1 Build 823是一款专为固态硬盘(SSD)设计的优化软件,旨在最大化地提升SSD的性能和寿命。固态硬盘与传统的机械硬盘(HDD)在工作原理上有所不同,SSD没有机械部件,数据读取速度更快,但写入操作...

    Data Analytics with Spark Using Python

    • Extend, accelerate, and optimize Spark routines with advanced API platform constructs, including shared variables, RDD storage, and partitioning • Efficiently integrate Spark with both SQL and ...

    WP-Optimize插件

    WP-Optimize插件就是帮你解决这个问题的,它可以优化和删除那些存在于数据库中的冗余数据,它具有以下特点: •删除修改后的WordPress中的冗余数据 •删除所有评论中的垃圾数据 •删除无效的留言 •为你的用户...

    Nginx HTTP Server, Third Edition,英文

    Nginx can be employed in many situations, whether you are looking to construct an entirely new web-serving architecture or simply want to integrate an efficient tool to optimize your site loading ...

Global site tag (gtag.js) - Google Analytics