上文gzip的使用介绍了通过gzip方式减少http请求过程中的流量传输,减少流量的另一个有效方式就是缓存静态资源,譬如css/js/png/jpg等。但对于静态资源或者不常变动的资源,可以通过尽量利用浏览器或者中间网络设备的缓存功能,减少用户的资源请求量,从而提升用户端的页面响应性能。

HTTP缓存的基本概念

Http的Cache-Control指定了请求和响应遵循的缓存机制。好的缓存机制可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担。

Cache-Control定义的字段已经浏览器缓存手段比较丰富,但本文不打算探讨这些具体的技术细节,本文的目的主要是让新同学知道可以通过缓存提供网页响应性能, 以及如何配置缓存。

不过需要注意,HTTP/1.0 缓存没有实现 Cache-Control,本文的缓存机制是基于HTTP/1.1的

Nginx中配置expires

对nginx 来说,配置页面缓存的方法很简单,只要在location段中,使用expires就可以了。举例:

location ~* \.(gif|jpg|jpeg|png) {
    expires 3d;
}

本例子表示将gif/jpg/jpeg/png后缀的图片资源设置超时时间为3天。

expires格式:

  • expires 30s; //表示把数据缓存30秒
  • expires 30m;//表示把数据缓存30分
  • expires 10h;//表示把数据缓存10小时
  • expires 1d;//表示把数据缓存1天

完整例子:

以下是在nginx基础站点配置的基础上,增加对各种资源的缓存机制,包括:

  1. js、css等静态资源缓存30d
  2. png、jpeg等图片资源缓存365d

Nginx配置:

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

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

    server_name www.typechodev.com;

    location / {
        try_files $uri $uri/ =404;
    }

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

        # With php7.0-fpm:
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~.*\.(js|css)?$ {  
        expires 30d;  
    }

    location ~.*\.(png|gif|jpg|jpeg|mp4|avi)?$ {  
        expires 365d;  
    }

    access_log /var/log/nginx/typechodev.access.log;
    error_log /var/log/nginx/typechodev.error.log;
}