WebP Cloud Services Blog

WebP Server Go 0.11.0 发布

我们相信开源软件是自由的根基,我们在努力推进我们的 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