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

负责接收静态资源请求,根据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协议缓存支持
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.html:
第二次请求admin.html,此时状态已经变为304: 
expires 配置浏览器缓存
示例配置
配置结束后,再次请求静态资源,再次请求admin.html: 
此时可以看到,Cache-Control已经变为86400,单位为秒,即24h。
跨域访问
浏览器是不允许ajax跨域访问,但是JS等资源有可能位于CDN中,并且域名不同,此时就需要nginx的跨域访问支持。虽然跨域访问不安全(CSRF攻击),但是出于软件结构设计、业务形态等种种原因,仍需要跨域访问支持。
HTTP对跨域的支持
HTTP协议提供了Access-Control-Allow-Origin头,此头的值由服务端返回给客户端,告诉客户端可以进行跨站访问。
使用add_header添加跨域头
示例配置
防盗链
防盗链就是防止网站资源被盗用:
防止网站资源被爬取
大量伪用户访问网站资源,占用网站性能
防盗链的设置思路
区别哪些请求是非正常用户请求
基于http_refer防盗链
$http_refer代表此请求来源处,如果此请求不是本网站的,就不允许访问,这样就能防止其他网站使用自己网站的图片、视频等资源。
示例配置
动静分离
动静分离是指,通过中间件将动态请求与静态请求分离,从而分离资源,减少不必要的请求消耗,减少请求延时。
在动静不分离之前,一个静态请求需要经过一下几个部分才能获取到:
在东京分离之后,静态请求将会直接由中间件处理,所以效率更高:
并且,如果一方出现问题,另一方不会受到影响。
动静分离配置不再演示
最后更新于
这有帮助吗?