如何在 nginx 中缓存静态文件

这篇教程说明你应该怎样配置 nginx、设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片、 CSS 和 Javascript 文件)设置一个时间,这样用户的浏览器就会缓存这些文件。这样能节省带宽,并且在访问你的网站时会显得更快些(如果用户第二次访问你的网站,将会使用浏览器缓存中的静态文件)。

1、准备事项

我想你需要一个正常工作的 nginx 软件,就像这篇教程里展示的:在 Ubuntu 16.04 LTS 上安装 Nginx,PHP 7 和 MySQL 5.7 (LEMP)

2 配置 nginx

可以参考 expires 指令手册来设置 HTTP 头部过期时间,这个标记可以放在 http {}server {}location {} 等语句块或者 location {} 语句块中的条件语句中。一般会在 location 语句块中用expires 指令控制你的静态文件,就像下面一样:


  1. location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
  2. expires 365d;
  3. }

在上面的例子中,所有后缀名是 .jpg、 .jpeg、 .png、 .gif、 .ico、 .css 和 .js 的文件会在浏览器访问该文件之后的 365 天后过期。因此你要确保 location {} 语句块仅仅包含能被浏览器缓存的静态文件。

然后重启 nginx 进程:


  1. /etc/init.d/nginx reload

你可以在 expires 指令中使用以下的时间设置:

  • off 让 Expires 和 Cache-Control 头部不能被更改。
  • epoch 将 Expires 头部设置成 1970 年 1 月 1 日 00:00:01。
  • max 设置 Expires 头部为 2037 年 12 月 31 日 23:59:59,设置 Cache-Control 的最大存活时间为 10 年
  • 没有 @ 前缀的时间意味着这是一个与浏览器访问时间有关的过期时间。可以指定一个负值的时间,就会把 Cache-Control 头部设置成 no-cache。例如:expires 10d 或者 expires 14w3d
  • 有 @ 前缀的时间指定在一天中的某个时间过期,格式是 Hh 或者 Hh:Mm,H 的范围是 0 到 24,M 的范围是 0 到 59,例如:expires @15:34

你可以用以下的时间单位:

  • ms: 毫秒
  • s: 秒
  • m: 分钟
  • h: 小时
  • d: 天
  • w: 星期
  • M: 月 (30 天)
  • y: 年 (365 天)

例如:1h30m 表示一小时三十分钟,1y6M 表示一年六个月。

注意,要是你用一个在将来很久才会过期的头部,当组件修改时你就要改变组件的文件名。因此给文件指定版本是一个不错的方法。例如,如果你有个 javascript.js 文件 并且你要修改它,你可以在修改的文件名字后面添加一个版本号。这样浏览器就要下载这个文件,如果你没有更改文件名,浏览器将从缓存里面加载(旧的)文件。

除了把基于浏览器访问时间设置 Expires 头部(比如 expires 10d)之外,也可以通过在时间前面的modified 关键字,将 Expires 头部的基准设为文件修改的时间(请注意这仅仅对存储在硬盘的实际文件有效)。


  1. expires modified 10d;

3 测试

要测试你的配置是否有效,可以用火狐浏览器的开发者工具中的网络分析功能,然后用火狐访问一个静态文件(比如一张图片)。在输出的头部信息里,应该能看到 Expires 头部和有 max-age 标记的 Cache-Control 头部(max-age 标记包含了一个以秒为单位的值,比如 31536000 就是指今后的一年)

原文发布时间为:2016-08-28

本文来自合作伙伴“Linux中国”

时间: 2024-10-01 21:49:51

如何在 nginx 中缓存静态文件的相关文章

如何在nginx中缓存静态文件

这篇教程说明你应该怎样配置 nginx.设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片. CSS 和 Javascript 文件)设置一个时间,这样用户的浏览器就会缓存这些文件.这样能节省带宽,并且在访问你的网站时会显得更快些(如果用户第二次访问你的网站,将会使用浏览器缓存中的静态文件). 1.准备事项 我想你需要一个正常工作的 nginx 软件,就像这篇教程里展示的:在 Ubuntu 16.04 LTS 上安装 Nginx,PHP

禁止IIS缓存静态文件的方法(png,js,html等)_win服务器

禁止IIS缓存静态文件(png,js,html等)背景:IIS为了提高性能,默认情况下会对静态文件js,html,gif,png等做内部缓存,这个缓存是在服务器iis进程的内存中的.IIS这么做在很大程度上可以提高静态文件的访问性能,在正常情况下只要静态文件更新了IIS也会更新缓存.但是如果更新的静态文件很多就有可能出现缓存不更新的情况. 弯路:我遇到这样一个场景,服务器循环更新上万张股票行情图片,IIS也会对图片进行缓存,由于更新的频率很高,文件很多,就出现了IIS缓存文件超过几十分钟都无法更

javascript-如何在iframe中嵌入mht文件

问题描述 如何在iframe中嵌入mht文件 除了IE浏览器可以直接显示外其它浏览器都会弹出下载,该如何解决这样的问题? 解决方案 如果你有php服务器端,可以将mht文件作为mime编码的html解析,然后返回客户端,而不是直接嵌入(和读取邮件附件其实是一个道理,mht其实就是邮件附件的格式).因为mht是微软自己用的,所以别的浏览器不认. 解决方案二: Iframe不能解析mht格式文件

ftp-如何在FTP中找到指定文件

问题描述 如何在FTP中找到指定文件 有时想寻找的文件不知道在哪个目录里,有没有什么方法 ,可以像搜索".java"的形式找到以.java后缀的文件?

如何在wiform中显示一个文件夹中所有图片的缩略图

问题描述 各位大侠:我一菜鸟,请问如何在wiform中显示一个文件夹中所有图片的缩略图 解决方案 解决方案二:看一下GDI方面的知识,很容易解决解决方案三:http://www.ssware.com/megapack/download.htm破解版我們有解决方案四:学习GDI,可以解决的解决方案五:打酱油

Apache/Nginx配置浏览器缓存静态文件的详情教程

网页使用缓存最明显的好处就是:减少页面加载时间.减少服务器负载. 浏览器是否使用缓存.缓存多久,是由服务器控制的.准确来说,当浏览器请求一个网页(或者其他资源)时,服务器发回的响应的「响应头」部分的某些字段指明了有关缓存的关键信息. Cache-Control Cache-ControlHTTP 响应头是 HTTP 1.1 协议新增的指令,每个资源都可以通过设定 Cache-Control 来建立缓存策略.通常,可为它指定一个max-age,表示缓存的最长时间,单位为秒.例如,若设定Cache-

网页优化系列二:使用Cache缓存静态文件、图片(asp.net版)

网站中存在一些不会经常变更的内容如静态文件.图片等,我们称之为静态资源.针对这些静态资源使用cache缓存到客户端中,以减少用户再次浏览该 网页时的请求量,从而加速了网页的加载.呈现速度.同样,要设置静态资源缓存到客户端,我们需要加一个中间层来处理静态资源的请求.下面以图片为例进行说 明.(若图片十分巨大情况下才使用该方法,若图片k级数的话,初次加载速度会更慢,因为IIS对于静态文件和动态文件的处理是不同的,如果图片容量小,动态文件处理的时间占大部分总体加载时间)   未优化:   Defaul

如何在 Linux 中查找一个文件

对于新手而言,在 Linux 中使用命令行可能会非常不方便.没有图形界面,很难在不同文件夹间浏览,找到需要的文件.本篇教程中,我会展示如何在 Linux 中查找特定的文件. 第一步要做的是通过 SSH 连接到你的 Linux.在 Linux 中查找文件有两种方法.一种是使用 find 命令,另外一种是使用 locate 命令.我们先看第一种. find 命令 使用 Linux find 命令可以用不同的搜索标准如名字.类型.所属人.大小等来搜索目录树.基本语法如下: # find path ex

如何在Linux中查找一个文件

对于新手而言,在 Linux 中使用命令行可能会非常不方便.没有图形界面,很难在不同文件夹间浏览,找到需要的文件.本篇教程中,我会展示如何在 Linux 中查找特定的文件. 第一步要做的是通过 SSH 连接到你的 Linux.在 Linux 中查找文件有两种方法.一种是使用 find 命令,另外一种是使用 locate 命令.我们先看第一种. find 命令 使用 Linux find 命令可以用不同的搜索标准如名字.类型.所属人.大小等来搜索目录树.基本语法如下: # find path ex