最近疫情,着实无聊。简单总结点东西,打发时间。

这篇文章主要记录如何在tomcat或nginx中配置前端静态资源的缓存策略,力求简洁明了,不参杂其他无关配置项。

压缩

对于HTTP的压缩,是一种使用CPU时间来换取网络传输时间的技术。在现有网络环境下,CPU所消耗的时间远远小于网络传输所使用的时间。因此,如果服务器的CPU尚有盈余,则开启压缩是有益无害的。

静态资源

对于静态资源,有两种开启压缩的方式,一种是compress in time,另一种是precompression,下面有张图对比了这两种方式的异同。对于第二种,因为静态资源已经提前进行了压缩处理,当HTTP请求到达之后,可以直接响应已经压缩过的文件,所以可以节约服务器的CPU。因此,下面重点介绍如何针对第二种方式进行配置。

CompressionWebpackPlugin

首先,我们需要构建出被压缩过的静态资源,这里可以借助CompressionWebpackPlugin来达成我们的目的。配置如下:

new CompressionPlugin({test: /.js$|.css$|.html$|.json$/, // 对哪些资源进行压缩threshold: 8192, // 超过多大的资源会被压缩,单位bytesminRatio: 0.8, // 压缩过后体积减少到80%以下的文件会被压缩
})

Nginx

如果你们使用的nginx作为静态资源服务器,可以简单在nginx.conf中的location区块中加上gzip_static on;就可以了。这个配置项主要是告诉nginx,如果客户端可以接收gzip过的文件,那么就寻找以.gz结尾的文件,如果存在,就返回它。是不是简单地超乎想象呢?

Tomcat

如果你们使用的tomcat作为服务器,情况稍微有点复杂,但也不困难。首先,如果你的tomcat版本>=8,那么你可以在web.xml中的DefaultServlet中加上这几行:

<servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>...<init-param><param-name>gzip</param-name><param-value>true</param-value></init-param>...</servlet>

这个配置的效果也是让tomcat去寻找.gz结尾的文件,如果客户端支持,就返回它。

如果你使用的tomcat>=9,而且想使用其他压缩算法的话,可以在同样的位置设置这个变量precompressed。它的值可以是br=.br,gzip=.gz,bzip2=.bz2。这个配置项告诉tomcat,若客户端能够接受被br压缩过的内容,那么返回以.br结尾的对应文件,以此类推。

API请求

对于API请求,因为其易变的特性,我们一般采用即时压缩的方式。那么,如果简单开启压缩呢,这里依旧分为nginx和tomcat两块来分开讲解。

Nginx

你可以将下面的配置简单定制后放在http区块里就可以了。

gzip  on;  # 开启gzip压缩
gzip_types application/json; # 对什么类型的资源进行压缩,因为API请求一般是json的,这里可以只配置json,具体需要根据情形来确定
gzip_min_length 8192; # 长度太短的话,压缩没有意义,单位是bytes

tomcat

tomcat的配置原理和nginx大致相同,只是属性名字有些区别,这个配置在server.xml中。

<Connector ...compression="on" # 开启压缩,也可以是个代表压缩等级的数字,0-9compressibleMimeType="application/json" # 对什么类型的资源进行压缩compressionMinSize="8192" # 长度大于多少进行压缩,单位是bytes/>

缓存

缓存的配置一般多用于静态资源,对于API请求极少使用这一层级的缓存。这里只列举对于前端性能有帮助的配置。

缓存的原理

通俗来讲,静态资源的缓存通过HTTP头让客户端和服务器互通有无的过程。这事得从第一次说起,首先,客户端会向服务器要文件,服务器就返回了,顺便,服务器可以选择告诉客户端,这个文件的ETag(哈希)是什么,什么时候创建的,你可以缓存多长时间。客户端可以根据这些信息制定自己的策略。当这件事第二次发生的时候,客户端就可以告诉服务器,我这边有缓存,你看,这是文件的ETag,上次修改发生在什么时候,我是否希望使用本地的缓存。这时,服务器可以告诉客户端,你可以继续使用,或返回新的文件。

这个过程简单来说是这样,但实际情况要稍微复杂一些,这里不再赘述。具体一点的话,大家可以参考这里,https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching。

Nginx

Nginx的缓存策略分为两步。第一步,解决什么类型的资源缓存多长时间的问题。第二步,解决哪些位置的资源应用第一步中的策略问题。

第一步,将不同类型的MIME-TYPE映射到不同的缓存时间上,并存储在变量$expires中,示例:

map $sent_http_content_type $expires {default                                 off;# No content""                                      off;~*application/javascript                1y;
}

第二步,对跟路径应用该缓存,示例:

location / {root $h5;expires $expires;
}

Tomcat

在Tomcat中,情况也是类似的,只是叫法不一样。Tomcat中使用org.apache.catalina.filters.ExpiresFilter过滤器来控制缓存。同样也是两步走,第一步,通过过滤器解决什么类型的资源缓存多长时间的问题。第二步,解决哪些位置的资源应用该过滤器的问题。

第一步,配置过期过滤器ExpiresFilter。这里只配置了JavaScript,大家根据自己的实际情况进行配置。和nginx中的$expire一样,这里的过滤器名字可以随意取(但要表意),示例:

<filter><filter-name>ExpiresFilter</filter-name><filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class><init-param><param-name>ExpiresByType application/javascript</param-name><param-value>access plus 1 year</param-value></init-param>
</filter>

第二步,应用该过滤器。注意,filter-name要和上面的匹配,要不然就起不了效果,示例:

<filter-mapping><filter-name>ExpiresFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher>
</filter-mapping>

总结

这里只列举了比较常用的两种。可以看到,这两种的服务器配置方式非常相似,对于其他类型的服务器而言,也是大同小异的,具体可以参考这里,https://github.com/h5bp/server-configs。希望看完本篇文章的小伙伴能够有所收获,也希望大家的前端页面能够快的飞起。

nginx 开启gzip 配置js_前端性能优化之缓存与GZIP相关推荐

  1. 前端性能优化 - 设置缓存

    前言 前端性能优化系列,记录在优化过程中的问题,可能有十万个为什么,待以后懂了再记录,毕竟太菜啥都不懂. 而且部分优化(设置缓存.gzip压缩.使用CDN加速服务)非开发人员来控制,而是网站服务器管理 ...

  2. 使用缓存实现前端性能优化——浏览器缓存机制、缓存分类

    前端性能优化探讨及浏览器缓存机制 一.缓存如何实现前端性能优化 1.什么是浏览器缓存 2.js请求,一般会有哪些地方有缓存处理? 3.静态资源 ① 什么是静态资源 ② 静态资源的缓存策略 二.缓存的类 ...

  3. 聊天室软件源码前端性能优化,缓存角度的相关分析

    在我们考虑提高聊天室软件源码页面渲染速度之前先来思考一个问题,一个页面的速度由什么决定?显而易见,这里主要包含两方面的影响因素. 1.资源传输时间(tcp链接时间和响应时间) 2.dom渲染时间 这两 ...

  4. 前端性能优化之缓存技术

    缓存一直以来都是用来提高性能的一项必不可少的技术 , 利用这项技术可以很好地提高web的性能. 缓存可以很有效地降低网络的时延,同时也会减少大量请求对于服务器的压力. 接下来这篇文章将会详细地介绍在w ...

  5. 不加载执行js_前端性能优化:preload 预加载页面资源

    网上看到一篇来自蚂蚁金服数据体验团队的文章,觉得不错,分享给大伙:https://juejin.im/post/5a7fb09bf265da4e8e785c38 本文主要介绍preload的使用,以及 ...

  6. 前端性能优化:启用 gzip

    大家好,我是前端西瓜哥.今天带大家学习如何启用 gzip 来做前端性能优化. HTTP 上的 gzip gzip 是一种优秀的压缩算法,我们可以在 HTTP 请求上对一些文本文件,设置 gzip 压缩 ...

  7. 前端性能优化基础知识--幕课网

    作为一个前端小码农,在页面样式都能实现以后,就开始考虑:同一个效果,我该用什么样的方式和代码去实现它比较规范?前两天逛幕课网发现了两门课程–<前端性能优化-基础知识认知>和<前端性能 ...

  8. 前端性能优化之gzip

    gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序.它最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩.我们在Linux中经常会用到后缀为.g ...

  9. 1.5W+字的全链路前端性能优化送给你

    点击上方"前端开发博客",选择"星标" 回复"加群",加入我们一起学习 通常来讲前端性能优化是指从用户开始访问我们的网站到整个页面完整的展现 ...

最新文章

  1. golang mysql单元测试_golang test测试使用
  2. logstash配置文件
  3. spring-others
  4. 天天算法 LeetCode-938-二叉搜索树的范围和
  5. 基于Python-Flask实现的网站例子
  6. python全栈开发网络_Python 全栈开发:网络编程
  7. 老男孩Linux Crond定时任务练习题
  8. centos mysql phpmyadmin_CentOS下phpMyAdmin安装
  9. 爬虫--Scrapy-CrawlSpider基于CrawlSpide的分布式爬虫
  10. 【BZOJ】【2626】JZPFAR
  11. Anroid性能优化系列——Improving Layout Performance(一)
  12. Mppt光伏最大功率点跟踪控制matlab仿真
  13. Portapack应用开发教程(四)GPS应用具体更改
  14. latex-多个表格引用
  15. ltunes无法验证服务器,itunes无法验证服务器身份
  16. java计算今天是今年的第几周_java calendar类根据当前日期时间,计算当前日期在当前月是第几周,与周跨月问题,...
  17. 《涨知识啦24》---JBS or MPS?
  18. 排序不等式的两种证明方法
  19. #Sora#peewee管理数据库——笔记
  20. PHP反射(ReflectionClass、ReflectionMethod)

热门文章

  1. csharp通过dll调用opencv函数,图片作为参数
  2. Linux 常见命令
  3. 计算机视觉与深度学习算法工程师面试题整理
  4. 中国18岁美女机器人:出得厅堂,下得厨房,还要什么女朋友!
  5. C++中list的使用方法及常用list操作总结
  6. Mybatis使用总结
  7. html 服务器运行exe,html运行exe文件,兼容浏览器
  8. mysql md_MySQL主从.md
  9. RabbitMQ 消息确认机制 以及 原理解析
  10. java n-ide 支持库,Android N是否要求IDE可以与Java 1.8或更高版本一起运行?