侧边栏壁纸
  • 累计撰写 54 篇文章
  • 累计创建 31 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

使用 webp-server 和 Docker 实现网站上的 WebP 图像实时转换

nankle
2024-08-12 / 0 评论 / 0 点赞 / 41 阅读 / 21383 字
温馨提示:
本文最后更新于 2024-08-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

引言

为什么要使用webp-server转换图像

WebP是一种由Google开发的现代图像格式,它具有更高效的图像压缩技术。将图像转换成WebP格式,在图像质量损失不大的情况下,可以显著减小图像大小,从而减少带宽消耗,提高网站加载速度,使网站运行更加流畅。

为什么选择 `webp-server` 和 Docker 进行部署。

由于docker可以快速部署,易于维护和管理,本博客是部署在docker上的,nginx也是放在了同一个项目中,为了统一维护,本次也将webp-server部署到docker中。

第一部分:了解 web-server-go

如何优雅的在不替换图片地址的情况下,将图片转为 webp 格式然后输出呢?

这时候就可以使用 webp-sh 组织最新开源的 webp_server_go 了,它的大概原理就是:当我们请求一张图片的时候使用 web 代理工具转发到 webp_server_go 应用进行处理,处理完成之后返回 webp 格式的图片,并且会保留处理后的图片以供后面的访问。

目前大部分主流浏览器都已经支持了 webp 图片的显示,除了 Safari,但是不必担心,webp_server_go 会自动判断请求来源是否为 Safari,如果是,那么会返回原图。

第二部分:准备开发环境

安装 Docker:

确保开发机器上安装了 Docker。

获取 webp-server-go

通过 GitHub 或其他源下载 webp-server 的 Docker 映像。

修改docker-compose.yml 文件

增加了webps的配置

webps:
    image: docker.nankle.us.kg/webpsh/webp-server-go
    container_name: webps
    ports:
      - "3333:3333"
    volumes:
      - ./halo2/attachments:/opt/pics
      - ./webps/exhaust:/opt/exhaust
      - ./webps/metadata:/opt/metadata
      - ./webps/config.json:/etc/config.json
    restart: always
    networks:
      halo_network:

关键参数

下面这几个目录是需要映射的

pics映射的是原图片 ,注意attachments不是图片目录,attachments/upload才是图片目录

- ./halo2/attachments:/opt/pics

这个是缓存路径,好像不映射也可以,转换后的图片会存到这里

- ./webps/exhaust:/opt/exhaust

这个是配置文件路径。不映射就是默认的,映射出来可以自己修改

- ./webps/config.json:/etc/config.json

加入和其他应用相同的网络,因为我这个项目nginx也在一个网络下,所以要配置

networks:

halo_network:

第三部分:webp-server 集成

设置配置文件config.json

{
  "HOST": "0.0.0.0",
  "PORT": "3333",
  "QUALITY": "80",
  "IMG_PATH": "/opt/pics",
  "EXHAUST_PATH": "./exhaust",
  "IMG_MAP": {},
  "ALLOWED_TYPES": ["jpg","png","jpeg","gif","bmp","svg","heic","nef"],
  "CONVERT_TYPES": ["webp"],
  "STRIP_METADATA": true,
  "ENABLE_EXTRA_PARAMS": false,
  "READ_BUFFER_SIZE": 4096,
  "CONCURRENCY": 262144,
  "DISABLE_KEEPALIVE": false,
  "CACHE_TTL": 259200
}

解释:

图片质量参数:QUALITY 80就是压缩百分之80

指定源图像目录:IMG_PATH ,这个路径是可以改成多种匹配方式的,也可以是网络位置

例如

{
  "HOST": "127.0.0.1",
  "PORT": "3333",
  "QUALITY": "80",
  "IMG_PATH": "./pics",
  "EXHAUST_PATH": "./exhaust",
  "IMG_MAP": {
    "/2": "./pics2",
    "/3": "./pics3",
    "http://www.example.com": "https://docs.webp.sh"
  },
  "ALLOWED_TYPES": ["jpg","png","jpeg","bmp","gif","svg","heic","nef"],
  "CONVERT_TYPES": ["webp"],
  "STRIP_METADATA": true,
  "ENABLE_EXTRA_PARAMS": false
}

在 目录下有一些图像,如下所示:./pics./pics2./pics3

  • ./pics包含1.jpg2.jpg3.jpg

  • ./pics2包含example.png

  • ./pics3包含webp_server.jpg

  • https://docs.webp.sh是本地实例可访问的有效 Web 服务主机/favicon.png

然后,您可以通过以下方式访问它们:

  • http://localhost:3333/1.jpg, ,http://localhost:3333/2.jpghttp://localhost:3333/3.jpg

  • http://localhost:3333/2/example.png

  • http://localhost:3333/3/webp_server.jpg

  • http://www.example.com/favicon.png

要使最后一个示例正常工作,您需要将标头作为请求的一部分传递。如果使用,可以使用命令进行测试

Hostcurlcurl -H 'Host: www.example.com' http://localhost:3333/favicon.png

转换后的 WebP 图像存放位置:EXHAUST_PATH

下面是从官网上复制的,自动翻译凑合看吧

各字段说明:

字段名

环境变量

类型

描述

HOST

WEBP_HOST

字符串

主持人收听

PORT

WEBP_PORT

字符串

要侦听的端口

QUALITY

WEBP_QUALITY

字符串

图像质量,从 0 到 100,100 表示无损转换。

IMG_PATH

WEBP_IMG_PATH

字符串

图片目录(原始图片)的路径,如果您想使用远程后端(例如外部 Nginx 提供的静态站点、阿里云 OSS 或腾讯 COS),请参考远程后端。

EXHAUST_PATH

WEBP_EXHAUST_PATH

字符串

缓存目录(WebP图片)的路径,例如,如果设置为 ,您的图片将保存在。EXHAUST_PATH/var/cache/webpwebp/var/cache/webp/pics/tsuki.jpg.1582558990.webp

IMG_MAP

/

字典

URI/主机到图像的映射,如果存在,则将被忽略,在 MultiPath 页面上查看更多信息IMG_PATH

ALLOWED_TYPES

WEBP_ALLOWED_TYPES

列表

允许的图像类型列表,如果您想允许所有图像类型,只需在此处使用。["*"]

CONVERT_TYPES

WEBP_CONVERT_TYPES

字符串

WebP服务器将尝试转换为的图像类型列表,默认值为,这意味着它只会尝试将图像转换为WebP,可用选项:。["webp"]["webp","avif","jxl"]

STRIP_METADATA

WEBP_STRIP_METADATA

布尔值

是否从图像中剥离EXIF元数据。

ENABLE_EXTRA_PARAMS

WEBP_ENABLE_EXTRA_PARAMS

布尔值

意味着是否启用额外参数,基本上它允许您对图像进行一些转换,例如,您可以在额外参数页面上找到更多信息。https://img.webp.sh/path/tsuki.jpg?width=20

EXTRA_PARAMS_CROP_INTERESTING

WEBP_EXTRA_PARAMS_CROP_INTERESTING

字符串

定义了 WebP 服务器在开启时应如何裁剪图像,并且图像请求包含两者和,可用选项有:“InterestingNone”、“InterestingEntropy”、“InterestingCentre”、“InterestingAttention”、“InterestringLow”、“InterestingHigh”、“InterestingAll”,您可以在 Extra Parameters 页面上找到更多信息。ENABLE_EXTRA_PARAMSwidthheight

READ_BUFFER_SIZE

WEBP_READ_BUFFER_SIZE

每个连接的缓冲区大小,用于请求读取。这也限制了最大标头大小。如果客户端发送多 KB 的 RequestURI 和/或多 KB 的标头(例如,BIG Cookie),请增加此缓冲区。

CONCURRENCY

WEBP_CONCURRENCY

最大并发连接数

DISABLE_KEEPALIVE

WEBP_DISABLE_KEEPALIVE

字符串

禁用保持连接,服务器将在向客户端发送第一个响应后关闭传入连接

CACHE_TTL

WEBP_CACHE_TTL

缓存 TTL(分钟) 对于远程后端(代理模式),我们使用 request 来获取远程图像信息,因此您的后端需要支持 request,第一次成功请求后,它将被缓存几分钟,在此期间,我们将不会再次发送请求并使用本地缓存进行渲染。将此值设置为 0 表示永远缓存。HEADHEADHEADCACHE_TTLHEAD

MAX_CACHE_SIZE

WEBP_MAX_CACHE_SIZE

如果单位为 MiB,则默认值为 0,不清理本地缓存文件,如果设置了此值,例如 50,则后台任务将与 WebP Server Go 一起每分钟运行一次,以确保本地缓存目录(和(如果使用远程后端))将分别低于 50MiB。./metadata./exhaust./remote-raw

启动 webp-server-go

- 使用 `docker-compose up` 命令启动服务。

- 验证 webp-server 是否正常工作。

2024-08-12224324.png

观察类型变成了webp就是成功了,文件大小也变小了

第四部分:网站集成

本次使用的nginx做的转发,下面是测试环境配置

upstream halo {
        server halo:8090; # 使用容器名称作为服务地址
    }

server {
        listen 8081;
        listen [::]:8081;
        server_name 192.168.31.58;
        client_max_body_size 1024m;

        location / {
            proxy_pass http://halo;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location ^~ /upload/ {
            proxy_pass http://webps:3333;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_hide_header X-Powered-By;
            proxy_set_header HOST $http_host;
            add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
        }
    }

将/upload相关的地址转发到图片转换服务中,我的项目是这个路径,根据实际情况修改。

第五部分:性能监控与优化

- **性能测试**:

- 使用工具(如 Lighthouse 或 PageSpeed Insights)测试网站加载速度。

- 对比使用 WebP 前后页面性能的变化。

我没有使用工具对比,只是观察控制台的速度,比不用更慢了,分析了下原因,不用会走缓存,禁用缓存后,使用图片压缩会变快。但是实际场景中正常用户应该不会禁用缓存,所以新网页打开会变快,历史的刷新会变慢。我的结论不够严谨,只是个人结论。

后来发现上面不走缓存是因为nginx配置的原因

add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';

去掉这个配置就走缓存了,还是转换后的速度更快。

第六部分:故障排除

- **常见问题及解决方法**:

- 如何处理 webp-server 的错误消息。

通过浏览器的F12控制台可以观察错误的原因,我的路径错误就是这样找出原因的。

- 解决 Docker 容器运行时的问题。

通过 docker exec -it webps sh 可以进入容器内查看,看下路径是否正确,里面的文件是否都正常。

总结:

webp-server-go是个好用的工具,图片转换非常快,网站使用优点很多,只是需要经过测试,看看是不是适合,看官方的描述,相同的图片应该可以缓存,所以不会重复的压缩,也就是cpu资源不会过多占用,所以我准备用起来试一下。

参考文献:

本文参考了以下文章

优雅的让 Halo 支持 webp 图片输出 - Halo - 强大易用的开源建站工具

Halo 文档内容陈旧,需要更新 - Halo 社区

使用WebP Server在不改变URL的情况下将网站图像转换为WebP-腾讯云开发者社区-腾讯云 (tencent.com)

Multipath | WebP Server Documentation

0

评论区