优化网站响应速度的第一件事就应该想到开启流量压缩,这是最简单,成本最低且非常有效果的手段。假如你的网站有大量静态资源(css、js等),或者大量静态页面, 那么开启gzip,效果将会非常明显。

Nginx的gzip配置

本文继续以nginx为例,apache原理类似,但具体配置请自行google。本文假设测试网址是www.typechodev.com,安装的测试程序是typecho1.0正式版,启用默认主题。

现在假设nginx原始配置如下(未开启gzip的配置):

server {
    listen 80;
    listen [::]:80;

    root /var/www/typechodev.com;
    index index.php;

    server_name www.typechodev.com;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ /index.php$request_uri;
    }

    location ~ \.php($|/.*)$ {
        include snippets/fastcgi-php.conf;

        # With php7.0-fpm:
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
    access_log /var/log/nginx/typechodev.access.log;
    error_log /var/log/nginx/typechodev.error.log;
}

访问https://www.typechodev.com首页,打开chrome的开发者工具,可以看到各个资源的流量大小。

接着,我们启用gzip,配置如下:

server {
    listen 80;
    listen [::]:80;

    root /var/www/typechodev.com;
    index index.php;

    server_name www.typechodev.com;
    ### 这里开始gzip配置
    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    ### 这里结束gzip配置
    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ /index.php$uri;
    }

    location ~ \.php($|/.*)$ {
        include snippets/fastcgi-php.conf;

        # With php7.0-fpm:
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
    access_log /var/log/nginx/typechodev.access.log;
    error_log /var/log/nginx/typechodev.error.log;
}

继续对比相同页面的静态资源流量大小:

可以看到,grid.css这个文件,从原来的5.8KB,降到了1.3KB,降幅高达70%以上,可见效果非常好。

注意事项

  1. 不要对img等二进制类型进行压缩,性价比不高

jpg/png等二进制类型的文件,一般情况下都已经做过了优化,可压缩率一般已经不高,因此为了避免不必要的性能损耗,可以排除掉这种二进制类型的压缩。

  1. https需要关闭gzip,否则会有漏洞

如果你网站采用https方式连接,则建议关闭gzip压缩。相同的内容,其压缩长度是固定的(压缩比),如果https连接加上了gzip压缩,攻击者可以在不知道密钥的情况下,通过枚举遍历的方式,不断对比压缩长度,从而有可能猜出你连接中的cookie值,从而泄露认证信息。当然,如果你的网站只是个无具体业务的博客站,就不需要关心这个了。