Nginx的动静态gzip压缩配置及参数详解
gzip的两种实现方式。
1、动态gzip压缩的实现。
当前端Vue使用普通的编译打包的方式构建出index.html,xxx.js,xxx.css等文件后,可以直接放到nginx的虚拟主机根目录下即可通过绑定的域名去访问。这时如果想开启gzip压缩则按照如下示例:
gzip on; # 打开gzip |
配置完成之后,直接执行nginx -s reload
即可生效。
浏览器控制台把Content-Encoding显示打开即可查看到有gzip压缩在生效。
2、静态gzip压缩的实现
方法1中的动态压缩有一个缺点就是:客户端每次过来请求时服务端都需要进行压缩,而每次都是来对这些静态资源进行压缩,就有点资源浪费的感觉。我们自然而然的就会想到能不能把这些静态资源提前压缩成gz包,这样就不需要服务端去重复做着相同的压缩指令。
当然了,这个需要前端人员的配合。
首先需要在前端安装压缩插件:compression-webpack-plugin然后在vue.config.js中增加如下配置
new CompressionPlugin({ |
打包完之后同样的步骤上传到nginx的虚拟主机根目录,然后nginx需要一个有http_gzip_static_module模块【ps:这里推荐使用春哥的openresty,虽然我们不是巨人,但是我们要学会站在巨人的肩膀上】有了模块之后需要设置gzip_static on;才可以正常解析静态gz资源。
注:gzip_static on;可以设置到http、server或者location中。
3、反向代理到gz静态压缩资源的处理
有时候我们的前端资源并不是直接在最外层的web服务器中,大多数情况下都是最外层的web服务器反代到内网的某个服务上。例如下面这种简单的反代结构:
graph LR |
这时如果没有做额外处理的话gzip压缩的资源请求将会404,我们需要做以下处理即可解决该问题。
分析:因为静态压缩后实际的资源为gz包而非js等原文件,所以直接请求xxx.js将会报404。所以我们首先想到的应该是重写请求为gz。
rewrite ^(.*)$ /$1.gz break; # 使用rewrite将请求重写为.gz的请求 |
再分析:如上操作后,确实是能在【应用NGINX/TOMCAT等】定位到gz文件,但是还是无法解析该资源,所以我们要声明一下资源的Content-Encoding,这样内层的web服务器就能正确的解析到该资源。
add_header Content-Encoding gzip; |
针对js和css反代静态压缩资源的完整配置如下:
location ~ .*\.(js|css)?$ { |