Nginx静态资源压缩

1. 概述

1.1 背景

静态资源过大,下载耗时导致页面打开慢,希望通过压缩减小文件大小,提升下载速度。

1.2 压缩方式

Nginx压缩支持两种方式,静态压缩和动态压缩。

● 静态压缩

是先把js、css等文件压缩为.gz文件,客户端访问时会自动下载.gz文件,并在客户端自动解压后访问。

● 动态压缩

客户端发起请求时,nginx动态将js、css文件压缩后返回给客户端,客户端收到后自动解压并访问。

2. 实现

Nginx版本:1.24.0

2.1 静态压缩

我们以Vue3为例子来说明整个实现过程。

2.1.1 压缩Vue3资源文件

● 安装压缩插件

java 复制代码
npm install vite-plugin-compression

● 插件配置

vite.config.ts/js 中导入vite-plugin-compression插件和配置

java 复制代码
import vue from '@vitejs/plugin-vue'
import viteCompression from 'vite-plugin-compression'

export default {
  plugins: [
    vue(), 
	
	// 下面是压缩插件配置
    viteCompression({
      filter: /\.(js|css|json|txt|ico|svg)(\?.*)?$/i, // 需要压缩的文件
      threshold: 1024, // 文件容量大于这个值进行压缩
      algorithm: 'gzip', // 压缩方式
      ext: 'gz', // 后缀名
      deleteOriginFile: true, // 压缩后是否删除压缩源文件,false不删除
    })
  ], 
  // 其他配置省略
}

注意不要压缩*.html文件,否则访问时会报403错误,即使添加如下配置也会报错:

● 打包

java 复制代码
npm run build

输出文件后,部署到nginx的静态资源文件目录:

2.1.2 Nginx配置

● 启用静态压缩功能

在http块或server块增加如下配置则可:

java 复制代码
    gzip_static on; # 只需要加这一个配置

● 配置静态资源目录

压缩后的文件部署到自定义目录下:

ini 复制代码
	location / {
       root   /site/static;
       index  index.html index.htm;
    }

2.2 动态压缩

在http块或server块增加如下配置则可:

java 复制代码
    # 开启动态压缩功能
	gzip on;
	
	# 压缩级别
	gzip_comp_level 6;
	
	# 哪些类型的文件需要压缩
	gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

3. 验证

3.1 压缩和未压缩性能对比

3.1.1 本机测试

如下是一个压缩和不压缩对比的例子:

可以看到,压缩后的传输数据变小了,但是加载时间并没有减少,说明压缩/解压缩也需要时间,至于哪种方式更快,取决于网络耗时和压缩耗时的具体大小。

3.1.2 公网测试

压缩前:

压缩后:

可以看到在压缩后体积减小,加载时间也变短了。

3.2 识别静态压缩和动态压缩

● 静态压缩

● 动态压缩

4. 总结

● 压缩后未必一定能提升页面打开速度,需要比较网络耗时和压缩耗时时间,哪个更省时。

● 动态压缩会消耗nginx的处理性能,如果能静态压缩,可以优先考虑使用静态压缩。(可以参考自行实测结果)

● 动态压缩和静态压缩可以同时使用,有静态压缩文件就使用,没有则动态压缩。


其他阅读:

如何编写软件设计文档
Spring Cache架构、机制及使用
布隆过滤器适配Spring Cache及问题与解决策略
JAVA编程思想(一)通过依赖注入增加扩展性
JAVA编程思想(二)如何面向接口编程
JAVA编程思想(三)去掉别扭的if,自注册策略模式优雅满足开闭原则
Java编程思想(七)使用组合和继承的场景
JAVA基础(一)简单、透彻理解内部类和静态内部类
JAVA基础(二)内存优化-使用Java引用做缓存
JAVA基础(三)ClassLoader实现热加载
JAVA基础(五)函数式接口-复用,解耦之利刃

相关推荐
helx821 小时前
SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
spring boot·后端·pdf
01传说1 小时前
nginx部署教程实战
运维·nginx
rOuN STAT2 小时前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
bilI LESS3 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
web前端进阶者4 小时前
Rust初学知识点快速记忆
开发语言·后端·rust
七夜zippoe4 小时前
API设计规范:RESTful API设计与OpenAPI(Swagger)完整指南
后端·restful·设计规范
吹晚风吧4 小时前
解决vite打包,base配置前缀,nginx的dist包找不到资源
服务器·前端·nginx
weixin199701080165 小时前
《施耐德商品详情页前端性能优化实战》
前端·性能优化
2601_949817725 小时前
Spring+SpringMVC项目中的容器初始化过程
java·后端·spring
青柠代码录5 小时前
【SpringBoot】集成 Knife4j
后端