WebP Cloud Services Blog

WebP Server Go 0.11.0 发布

· Nova Kwok

我们相信开源软件是自由的根基,我们在努力推进我们的 SaaS 产品 WebP CloudPublic 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 后可以做到:

  1. 保持原始图片地址不变
  2. 将图片体积缩小并以更现代的图片格式(例如 webpavif)输出

WebP Server Go 的优点在于:

  1. 不需要提前将网站上的所有图片手动处理,因为这样费事费力
  2. 不需要改变图片的地址,URL 中图片地址依然可以以 .jpg 结尾,但是输出的是 webp 或者 avif 格式
  3. 由于 webpavif 等格式有浏览器限制(例如 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 将图片仅尝试转换为 avifjxl 格式,那么你可以这么定义:
      "CONVERT_TYPES": ["avif","jxl"]
      
      此时假设你的图片地址在 http://webp.server/image.jpg ,那么当用户访问时 WebP Server Go 会尝试将原图转换为 avifjxl 格式,在转换完成后与原图对比找到图片体积最小的,且浏览器支持的格式返回给浏览器。
  • 新增 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 会同时进行 webpavif 转换,并等待两个转换全部完成之后输出。

但是这个时候如果有一个不支持 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_heightmax_width 支持

在之前的版本我们有个参数叫做 ENABLE_EXTRA_PARAMS,开启后可以给图片后面传入 heightwidth 参数对图片进行缩放和裁剪。

由于这个功能有一定被滥用的概率,所以我们做成了开关让用户自行决定是否打开。

最近我们加入了 max_heightmax_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