WebP Server Go 0.11.0 发布
我们相信开源软件是自由的根基,我们在努力推进我们的 SaaS 产品 WebP Cloud 和 Public Services 的同时也在不断改进我们的开源软件版本,让用户有更多的选择。
最近我们发布新版本的 WebP Server Go,这次我们带来了不少新的功能的特性,同时由于配置文件的格式发生了一些修改,所以我们没有在 0.10.8 的版本上发布 0.10.9 ,而是直接使用了 0.11.0。
WebP Server Go 是什么
WebP Server Go 是一个以 GPLv3 协议(至少目前是这样),代码托管在 https://github.com/webp-sh/webp_server_go 上的开源程序。
旨在不改变原始 URL 的情况下通过通过动态(On the fly)优化/压缩原始图片到更加现代的格式,解决网站输出较大体积的老格式图片(如 JPG、PNG)导致服务器额外带宽开销和加载速度缓慢的问题,从而提高网页响应速度并提升页面的 Pagespeed 评分。
假设你有一个网站: https://example.com 上面有许多图片和照片在 https://example.com/pics/someimages.jpg ,体积在 1M~5M 不等,如果直接将这些图片放在网页上势必会导致页面加载非常缓慢,这个时候使用 WebP Server Go 后可以做到:
- 保持原始图片地址不变
- 将图片体积缩小并以更现代的图片格式(例如
webp
,avif
)输出
WebP Server Go 的优点在于:
- 不需要提前将网站上的所有图片手动处理,因为这样费事费力
- 不需要改变图片的地址,URL 中图片地址依然可以以
.jpg
结尾,但是输出的是webp
或者avif
格式 - 由于
webp
和avif
等格式有浏览器限制(例如 Firefox 77~92 版本不支持avif
格式),所以 WebP Server Go 会根据浏览器信息自动输出一个浏览器能接受的且体积最小的图片。
WebP Server Go 如何使用
为了让大家更加直观的理解 WebP Server Go 的作用,我们来看看一个非常简单的使用案例,我的图片全部放在了 /path/to/pics
目录下,我希望有个简单的 HTTP 服务可以在访问之后输出优化后的图片。
目前而言最简单的方式是直接使用 Docker 容器部署,我们只要挂载三个目录进去就好了,创建一个 docker-compose.yml
文件,然后写入如下内容:
version: '3'
services:
webp:
image: webpsh/webp-server-go
restart: always
volumes:
- /path/to/pics:/opt/pics
- ./exhaust:/opt/exhaust
- ./metadata:/opt/metadata
ports:
- 127.0.0.1:3333:3333
其中 /path/to/pics
是我们图片所在的目录,剩下的 ./exhaust
和 ./metadata
分别是优化后的图片存储目录和源信息存储目录,为了方便维护这里直接放在和 docker-compose.yml
同一个目录下。
然后通过 docker-compose up -d
启动就好了,此时 WebP Server 已经启动在了 http://127.0.0.1:3333
上了。
假设这个时候我们实际图片为 /path/to/pics/DSC05955.jpg
,那我们可以访问 http://127.0.0.1:3333/DSC05955.jpg
看到优化后的图片了。
- Content-Type:image/webp 表示图片已经输出为了
webp
格式 - X-Compression-Rate:0.13 表示当前图片体积是原图的 13%
怎么样,是不是简单易懂,接下来只要在前面套上 Nginx/Caddy 等 Web Server 就可以对外使用啦。
更多的配置/部署信息可以在我们维护的文档 https://docs.webp.sh/ 中看到。
新特性
好了,让我们来看看这个版本有啥新的东西吧~
新配置文件格式
在 0.10.8 的时候,我们完整的配置文件类似如下:
{
"HOST": "127.0.0.1",
"PORT": "3333",
"QUALITY": "80",
"IMG_PATH": "./pics",
"EXHAUST_PATH": "./exhaust",
"IMG_MAP": {},
"ALLOWED_TYPES": ["jpg", "png", "jpeg", "bmp", "gif", "svg", "heic", "nef", "webp"],
"ENABLE_AVIF": false,
"ENABLE_EXTRA_PARAMS": false,
"READ_BUFFER_SIZE": 4096,
"CONCURRENCY": 262144,
"DISABLE_KEEPALIVE": false,
"CACHE_TTL": 259200
}
这次的变动体现在如下方面:
我们放弃了
ENABLE_AVIF
参数,转而使用"CONVERT_TYPES": ["webp","avif","jxl"]
的格式来定义 WebP Server Go 将尝试转换为的图片格式。- 例如,如果你希望 WebP Server Go 将图片仅尝试转换为
avif
和jxl
格式,那么你可以这么定义:
此时假设你的图片地址在"CONVERT_TYPES": ["avif","jxl"]
http://webp.server/image.jpg
,那么当用户访问时 WebP Server Go 会尝试将原图转换为avif
和jxl
格式,在转换完成后与原图对比找到图片体积最小的,且浏览器支持的格式返回给浏览器。
- 例如,如果你希望 WebP Server Go 将图片仅尝试转换为
新增
STRIP_METADATA
参数设置是否清除图片的元信息
新的配置文件类似如下:
{
"HOST": "127.0.0.1",
"PORT": "3333",
"QUALITY": "80",
"IMG_PATH": "./pics",
"EXHAUST_PATH": "./exhaust",
"IMG_MAP": {},
"ALLOWED_TYPES": ["jpg","png","jpeg","bmp","svg","heic","nef"],
"CONVERT_TYPES": ["webp","avif","jxl"],
"STRIP_METADATA": true,
"ENABLE_EXTRA_PARAMS": false,
"READ_BUFFER_SIZE": 4096,
"CONCURRENCY": 262144,
"DISABLE_KEEPALIVE": false,
"CACHE_TTL": 259200
}
最小化转换
在 0.10.8 版本中,如果用户使用 "ENABLE_AVIF": true
定义了允许将图片转换成 avif
格式的话,当浏览器访问的时候 WebP Server Go 会同时进行 webp
和 avif
转换,并等待两个转换全部完成之后输出。
但是这个时候如果有一个不支持 avif
格式的浏览器(例如 Firefox 77~92 版本)来访问的话,为此来转换 avif
格式显然得不偿失,在 0.11.0 版本中,WebP Server Go 会在判断浏览器支持的格式后选择性转换图片,减少了响应时间和服务器压力。
JPEG XL 格式支持
JPEG XL(JPEG Extended Range)是一种图像压缩格式,旨在提供更高的压缩效率和更好的图像质量。它是对传统JPEG格式的改进和扩展。
JPEG XL利用了现代图像压缩算法和先进的编码技术,包括可变位深度(Variable Bit Depth)和可变色度(Variable Chroma)等特性。这些技术使JPEG XL能够在相对较低的比特率下实现更高的图像质量,同时减小文件大小。
图片来源:https://cloudinary.com/blog/jpeg-xl-and-the-pareto-front ,从图片来看在 lossless 转换中 JPEG XL 在转换速度和图片压缩率上均优于 AVIF/WebP 格式
在我们阅读了 Cloudinary 的 JPEG XL and the Pareto Front 文章(文章不错,建议有兴趣的读者阅读),我们决定开始实验性的支持 JPEG XL 格式。
只需要在 CONVERT_TYPES
中指定即可,例如如下:
"CONVERT_TYPES": ["webp","avif","jxl"]
注意:目前 JPEG XL 格式根据 caniuse 来看只有 Safari 17 可以支持,且截止本文发布时我们的容器运行时环境版本的 libjxl
通过包管理器安装的是 0.7 ,最新版本是 0.10.2,升级到 0.10.2 的话可以获得额外 20% 的性能提升,我们还在解决这个问题中。
max_height
和 max_width
支持
在之前的版本我们有个参数叫做 ENABLE_EXTRA_PARAMS
,开启后可以给图片后面传入 height
和 width
参数对图片进行缩放和裁剪。
由于这个功能有一定被滥用的概率,所以我们做成了开关让用户自行决定是否打开。
最近我们加入了 max_height
和 max_width
参数,这两个参数用来限制图片的最大尺寸,会将大尺寸图片限制在这两个方位内,同时保持小尺寸图片不变。
例如,我们有一个 500x500px 的图片叫做 big.jpg
,当访问 /big.jpg?max_height=200&max_width=100
的时候,由于 max_width
更小一些,图片会被缩放到 100x100px。
如果我们有一个 80x80px 的图片叫做 small.jpg
,当访问 /small.jpg?max_height=200&max_width=100
的时候,由于图片长和宽都在范围内,所以这个图片不会被处理。
这个新功能主要是为了响应: https://github.com/webp-sh/webp_server_go/issues/305 的需求。
Bugfix
此外,我们还修复了一些 Bug,例如:
- 对于原图而言可能会带有 EXIF 信息(元信息) ,我们输出的 WebP/AVIF 格式的图片会默认删除这些元信息,用来减少图片体积和减少潜在的隐私泄漏,但是当遇到不支持 WebP/AVIF 格式的浏览器(比如 cURL)的时候,就会直接原封不动输出原图,造成潜在的隐私泄漏
- 我们修复了这个 Bug
- 我们在配置文件中提供了一个
STRIP_METADATA
的参数设置是否清除图片的元信息
- Prefetch 的时候没有使用
ALLOWED_TYPES
对图片格式进行过滤,导致在 Prefetch 的时候程序崩溃- 我们修复了这个 Bug
希望大家能喜欢这个版本,如果你遇到了问题或者有什么新的想法,欢迎来 Issues · webp-sh/webp_server_go 提交 Issue 反馈!
WebP Cloud Services 团队是一个来自上海和赫尔辛堡的三人小团队,由于我们不融资,且没有盈利压力 ,所以我们会坚持做我们认为正确的事情,力求在我们的资源和能力允许范围内尽量把事情做到最好, 同时也会在不影响对外提供的服务的情况下整更多的活,并在我们产品上实践各种新奇的东西。
如果你觉得我们的这个服务有意思或者对我们服务感兴趣,欢迎登录 WebP Cloud Dashboard 来体验,如果你好奇它还有哪些神奇的功能,可以来看看我们的文档 WebP Cloud Services Docs,希望大家玩的开心~
Discuss on Hacker News