静态资源服务器和动静分离

1556023839922

负责接收静态资源请求,根据url从文件存储中获取并返回给客户端,常用于动静分离。

静态资源是指无需服务器动态生成的文件资源,比如视频、html、图片等。

针对静态资源的配置,主要有两个切入点:

  • 针对内容压缩

  • 浏览器缓存

  • 跨域访问

  • 防盗链

针对内容压缩

sendfile、tcp_nopush、tcp_nodelay

http_gzip_static_module

此模块用于预读gzip压缩文件:

在请求/download/index.html的时候,此模块会先从root下寻找文件index.html.gz,如果找不到才会去寻找index.html文件。

gz文件需要预先生成,生成可以使用gzip命令:

那么在浏览器请求/download/index.html,会展示index.html.gz解压后的html文件的内容。

http_gunzip_module

部分浏览器不支持gzip压缩,可以使用此模块,此处不再演示。

示例配置

浏览器缓存

使用浏览器缓存静态资源的两个好处:

  • 不用实时从服务器中获取,减少了服务端资源消耗

  • 客户端可以从本地直接读取,响应延时更低

HTTP协议缓存支持

功能
Header

HTTP1.0 记录过期时间,超过指定时间会失效

Expire

HTTP1.1 最大期限,用于替代1.0,超过最大期限会失效

Cache-Control(max-age)

最后修改时间校验比较,值为时间,只能精确到秒,秒级别的更新无效

Last-Modified

判断Etag是否过期,类似Last-Modified,是一个信息摘要字符串,不同就说明已经过期

Etag

Etag 与 Last-Modified 缓存策略下,当缓存处于有效状态时,请求静态资源的响应状态将会变为304。nginx默认采用此种缓存方式

Expire与Cache-Control 的优先级大于 Last-Modified 和 Etag

第一次请求admin.html1556090857714

第二次请求admin.html,此时状态已经变为304: 1556090910417

expires 配置浏览器缓存

示例配置

配置结束后,再次请求静态资源,再次请求admin.html1556090998431

此时可以看到,Cache-Control已经变为86400,单位为秒,即24h

跨域访问

浏览器是不允许ajax跨域访问,但是JS等资源有可能位于CDN中,并且域名不同,此时就需要nginx的跨域访问支持。虽然跨域访问不安全(CSRF攻击),但是出于软件结构设计、业务形态等种种原因,仍需要跨域访问支持。

HTTP对跨域的支持

HTTP协议提供了Access-Control-Allow-Origin头,此头的值由服务端返回给客户端,告诉客户端可以进行跨站访问。

使用add_header添加跨域头

示例配置

防盗链

防盗链就是防止网站资源被盗用:

  • 防止网站资源被爬取

  • 大量伪用户访问网站资源,占用网站性能

防盗链的设置思路

  • 区别哪些请求是非正常用户请求

基于http_refer防盗链

$http_refer代表此请求来源处,如果此请求不是本网站的,就不允许访问,这样就能防止其他网站使用自己网站的图片、视频等资源。

示例配置

动静分离

动静分离是指,通过中间件将动态请求与静态请求分离,从而分离资源,减少不必要的请求消耗,减少请求延时。

在动静不分离之前,一个静态请求需要经过一下几个部分才能获取到:

在东京分离之后,静态请求将会直接由中间件处理,所以效率更高:

并且,如果一方出现问题,另一方不会受到影响。

动静分离配置不再演示

最后更新于

这有帮助吗?