背景
使用nginx
部署web项目,调整nginx
的配置进行性能优化。
-
GZIP 压缩:压缩响应数据,减少文件大小,提升传输效率。
-
强缓存:通过缓存策略减少重复请求,减轻服务器负担,提升响应速度。
-
HTTP/2:优化并行(
多路复用
)请求和传输,提升页面加载速度,减少延迟。
nginx配置
server
{
listen 80;
listen 443 ssl http2;
server_name xxx.domain.com;
index index.html index.htm default.htm default.html;
gzip on; # 开启gzip压缩
gzip_vary on; # 根据请求头中的'Accept-Encoding'启用压缩
gzip_proxied any; # 无论请求是否来自代理,都进行压缩
gzip_comp_level 5; # 压缩级别,1(最快)到9(最小)
gzip_min_length 256; # 只压缩大于256字节的响应
gzip_types text/plain application/xml application/json application/javascript text/css text/js text/xml application/x-javascript text/javascript ; # 指定压缩的MIME类型
gzip_disable "MSIE [1-6]\.(?!.*SV1)"; # 不对IE6及以下版本的浏览器启用Gzip
# 静态js css资源强缓存12小时
location ~ .*\\.(js|css)?$
{
expires 12h;
}
# 不变资源强缓存(这里单独配置是因为5173项目返回资源的时候返回了 Cache-Control:no-store 请求头)
location /node_modules/@dcloudio/uni-h5/dist/uni-h5.es.js {
proxy_pass http://127.0.0.1:5173;
proxy_hide_header Cache-Control; # 隐藏后端服务器返回的 Cache-Control 头
add_header Cache-Control "public, max-age=604800"; # 缓存一周,根据业务变动修改
}
}
优化前后对比
gzip压缩
开启前
开启后
可以看到:文件大小,传输时间,完成时间,dom加载时间都得到了优化。
注意:使用 Vite 和 Webpack 插件打包生成.gzip 文件可以优化首次访问速度,可以避免 Nginx 在首次请求时的动态压缩耗时。
因为 Nginx 开启 gzip 功能后,如果没找到gzip文件,会将首次访问的文件压缩并缓存,以便后续请求可以直接提供压缩文件。直接提供就省去了这步操作。
强缓存
注意:一般的单页面应用来说,都是通过index.html引用各种打包后的js,css。例如vite打包后都是会给文件名带上hash值的,文件修改hash值才会变化。默认情况下:index.html文件的响应会带Last-Modifie,走协商缓存(询问服务器资源是否修改,没修改服务器返回304状态码,然后从浏览器缓存获取文件)。
感想:在几年前使用webpack打包项目的时候就因为没有配置生成的文件带上hash值
。导致打包后刷新页面也获取不到最新js。只能强制刷新。o(╥﹏╥)o
开启前
看看响应头
可以看出每次都不会缓存。但是这个文件600多Kb。如果每次访问页面都请求一次,消耗服务器资源的同时还降低用户体验。
开启后
看看响应头
http2
开启前
开启后
多次请求测试,可以明显发现资源的请求时间缩短了。可以验证
http2
的多路复用(同一个TCP链接发送多个请求和响应)http链接
生效了。