
这篇文章本来早就该出来的,早在2024年初,我就已经使用了zstd-nginx-module,但当时它与ngx_brolti的兼容不是很好,且浏览器几乎没有支持的(只有Chrome开发版支持),便放弃了。
而如今2026年了,原始项目tokers/zstd-nginx-module自2024年后可以说是没有任何更新的,包括一些问题也一直没有得到解决,比如与google/ngx_brotli的部分兼容问题,其实在zstd-nginx-module Issue #40或zstd-nginx-module PR #44等早已有说法及修复,但一直没有Merge,也没有答复。
目前该项目有两个不同的分支(Fork)在维护(一个是由eilandert创建,另外一个是由hsw创建),我目前选择的是eilandert创建的myguard-labs/nginx-zstd-module这个fork,他俩的fork分别对原项目进行较多的fix,目前也有针对原始项目提交Pull request(eilandert的PR更完整些),但暂未获批准。
eilandert的这篇关于zstd-nginx-module导读文章比较有意思,大家可以看一下,传送门。
编译上,只要保证zstd模块比brolti模块晚加载就行了(这是Nginx的特性,无论是否为动态模块。其实按照PR内容来看,应该无所谓了,但还是照规矩来吧)。对于Nginx的Zstd参数,我的设置是:
zstd on;
zstd_static on;
zstd_comp_level 5;
zstd_types text/plain text/css text/csv application/json application/x-ndjson application/json-seq application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml application/atom+xml application/ld+json application/manifest+json application/problem+json application/rss+xml application/vnd.api+json application/xhtml+xml application/wasm text/wgsl font/ttf font/otf application/x-font-opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon;
压缩等级其实你可以选择到6,收益是比较高的。但因为我现在用的VPS的宿主机CPU是Sandy Bridge E5-2670,并不支持AVX2、BMI2指令集,只支持第一代AVX。没有BMI2,zstd代码还有优化,但不支持AVX2,就比较伤了,优势对比brolti小了不少。这也是我多次测试后,设置到Level 5(6的话负收益)。
目前为了在E5-2670更好的使用,Brolti压缩的平衡点选择的是Level 4(默认值为6,Cloudflare据说也是使用Level 6)。但即便是面对Brolti 4,Zstd 5也有很大的优势,最主要的是zstd对于压缩和解压缩都比较友好,压缩上服务器的CPU占用Zstd比起Brolti是要低的(虽然极限压缩上,大小对比br没有优势)。
首先根据我的测试结果,Zstd 6后的文件大小就跟Brolti 4压缩后大小相差无异了,或者说互有上下。但在CPU占用上,Zstd 6压缩比Brolti 4压缩占用少10%以上,压缩速度是Brolti 4的1.5倍,在现代CPU的情况下。
而Zstd 5的情况下,压缩后大小比Brolti 4稍大(不超5%),在CPU占用上,压缩比Brolti 4占用少40%左右(如果是SandyBridge的话,少15%),压缩速度是Brolti 4的2倍有多(如果是SandyBridge的话,快近50%)。
所以测试完后,就突然觉得Zstd很香,特别在我Level 5的设置下,明显感觉到TTFB更短了。这也是在有Brolti的情况下,还考虑Zstd的支持的原因。然后就有了文章开头的故事。
至于你说,那我为什么不直接Brolti 3,Brolti 3的压缩率只能说对比GZIP来说要好,Zstd 4就比他要小要快还要占用少(小一点点,快近2.5倍,占用少60%左右)。只能说Brolti的压缩等级还不够细,不能满足老CPU的极致调优(虽然可能并没有什么用,比如换掉Wordpress、换掉PHP的收益,比抠这个来的收益要高)。
还有如果你是现代CPU,且用着Brolti 6,如果日常无感的话,Zstd你可以设置到10,比Brolti 6要快2倍以上吧,占用少30%左右,大小的话,比它小一些。
刚刚发完文章后,让Gemini根据文章内容为本篇文章生成了题图,似乎还可以。
转载请注明转自: kn007的个人博客 的《Nginx使用Zstd压缩传输》
