WebP Cloud Services Blog

WebP Server Go 0.13.0 发布

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

  1. 保持原始图片地址不变
  2. 将图片体积缩小并以更现代的图片格式(例如 webpavif)输出
  3. 将图片转换成浏览器支持的图片输出(例如原图是 avif 格式但是访客的浏览器不支持 avif 格式,WebP Server 会将图片转换成 webp 格式给访客)

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.13.0 版本引入的新特性吧!

非图片文件直接输出

我们看到有许多用户有非图片直接输出的需求:

从 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