WebP Server Go 0.13.0 发布
我们相信开源软件是自由的根基,我们在努力推进我们的 SaaS 产品 WebP Cloud 和 Public Services 的同时也在不断改进我们的开源软件版本,让用户有更多的选择。
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
)输出 - 将图片转换成浏览器支持的图片输出(例如原图是
avif
格式但是访客的浏览器不支持avif
格式,WebP Server 会将图片转换成webp
格式给访客)
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.13.0 版本引入的新特性吧!
非图片文件直接输出
我们看到有许多用户有非图片直接输出的需求:
- https://github.com/webp-sh/webp_server_go/issues/322
- https://github.com/webp-sh/webp_server_go/issues/267
- https://github.com/webp-sh/webp_server_go/issues/25
- https://github.com/webp-sh/webp_server_go/issues/351
从 0.13.0 版本开始,如果你的配置文件中 ALLOWED_TYPES
设置为 * 的话,类似这样:
"ALLOWED_TYPES": ["*"],
那么对于非图片的文件 WebP Server Go 可以直接输出啦
这里我们通过文件后缀名来判断一个文件是否为图片,我们认为图片的后缀列表为:
"jpg", "png", "jpeg", "bmp", "gif", "svg", "nef", "heic", "webp", "avif", "jxl"
例如:
curl -H "Accept: image/webp" http://localhost:3333/config.json
{
"HOST": "0.0.0.0",
"PORT": "3333",
"QUALITY": "80",
"IMG_PATH": "./pics",
"EXHAUST_PATH": "./exhaust",
"ALLOWED_TYPES": [
"*"
],
"CONVERT_TYPES": ["webp","avif","jxl"],
"ENABLE_EXTRA_PARAMS": true,
"MAX_CACHE_SIZE": 5
}%
反向转换
在 0.13.0 版本之前,我们的目标是作为从老版本图片格式(例如 JPG,PNG)到新版本图片格式(例如 WebP 和 AVIF)的桥梁,所以我们一直假设了用户的原始图片是老版本图片格式,并且在浏览器不支持新版本图片格式的情况下直接输出原始图片。
但这样就会有一个问题,如果用户的原始图片格式为 AVIF,但是访客的浏览器不支持 AVIF 格式怎么办?
在 0.13.0 版本之前,WebP Server 会直接输出原始图片格式(AVIF),导致用户看不到任何图片,在 Issue https://github.com/webp-sh/webp_server_go/issues/369 中也有用户提出过这个问题。
从 0.13.0 版本开始,我们会独立对待所有的图片,不再以简单的老版本图片格式和新版本图片格式来区分,例如,你的原始图片为 AVIF 格式,但是浏览器只支持 WebP 格式的图片,这个时候我们会输出 WebP 格式图片给浏览器:
curl -I -H "Accept: image/webp" http://localhost:3333/k.avif
HTTP/1.1 200 OK
Server: WebP Server Go
Date: Sat, 11 Jan 2025 04:00:31 GMT
Content-Type: image/webp
Content-Length: 106524
X-Compression-Rate: 1.25
Accept-Ranges: bytes
Last-Modified: Sat, 11 Jan 2025 04:00:25 GMT
HEIC 图片格式也是同理:
curl -I -H "Accept: image/webp,image/apng,image/*,*/*;q=0.8" http://localhost:3333/sample3.heic
HTTP/1.1 200 OK
Server: WebP Server Go
Date: Sat, 11 Jan 2025 04:03:26 GMT
Content-Type: image/webp
Content-Length: 603808
X-Compression-Rate: 1.12
Accept-Ranges: bytes
Last-Modified: Sun, 29 Dec 2024 04:01:30 GMT
考虑到 WebP 格式已经被绝大多数浏览器所支持,我们对于不支持 WebP 格式的客户端(例如 cURL
)会保持输出原始图片(在这个例子中就是 AVIF/HEIC 格式的原始图片了),而不会进一步转换成 PNG/JPG 格式的图片。
Metadata
在两个月前我们在 WebP Cloud 上提供了 Metadata 功能,相关的文章在「预览体验更好一点!WebP Cloud 支持带 Blurhash 的 Metadata 请求」。
在这个版本中我们将 Metadata 功能引入了 WebP Server Go 中,和 WebP Cloud 上一样,只需要在请求后加入 ?meta=full
即可获得一个原始图片的 Metadata 信息,例如:
curl -H "Accept: image/png" http://localhost:3333/DSC05953.jpg\?meta\=full
{"blurhash":"LrF~8PIUWBfk~VM{WBaz-pWBRjay","colorspace":"sRGB","format":"jpeg","height":3375,"num_pages":1,"size":60750000,"width":6000}
Bugfix & Optimize
除了上面的新功能以外我们还做了一些小的修复和优化,例如:
ALLOWED_TYPES
没有使用深拷贝导致配置文件和实际加载的配置会被覆盖(https://github.com/webp-sh/webp_server_go/issues/369#issuecomment-2551614864)- 我们修复了这个 Bug
- 对于原图为 WebP 格式图片的情况下会被 WebP Server 再次转换成 WebP/AVIF 格式
- 对于这种情况我们会直接复制原图到转换目标目录,减少转换算力开销
希望大家能喜欢这个版本,如果你遇到了问题或者有什么新的想法,欢迎来 Issues · webp-sh/webp_server_go 提交 Issue 反馈!
WebP Cloud Services 团队是一个来自上海和赫尔辛堡的三人小团队,由于我们不融资,且没有盈利压力 ,所以我们会坚持做我们认为正确的事情,力求在我们的资源和能力允许范围内尽量把事情做到最好, 同时也会在不影响对外提供的服务的情况下整更多的活,并在我们产品上实践各种新奇的东西。
如果你觉得我们的这个服务有意思或者对我们服务感兴趣,欢迎登录 WebP Cloud Dashboard 来体验,如果你好奇它还有哪些神奇的功能,可以来看看我们的文档 WebP Cloud Services Docs,希望大家玩的开心~
Discuss on Hacker News