webp-server-go 重构二开版 支持非图片资源302重定向和直接返回和内存优化等

github仓库

主要修改点

  1. 如果文件非图片类型, 302重定向到源文件
  2. 完全删除ETAG相关逻辑, 处理后的文件直接按目录显式存储到exhaust目录, 在图片处理完毕5分钟后, 清理远程源图像文件
  3. 低于30KB的图片不处理, 直接存到EXHAUST_PATH, 下次从本地存储中提供访问
  4. 优化日志可读性
  5. 内存优化:
  • 控制预取并发
  • 流式处理大文件
  • 内存使用监控
  1. 根目录设置打招呼(没啥用)

  2. 移除IMG_PATH的配置方式, 只保留IMG_MAP.(依旧可以配置本地路径)

  3. 当前缀与IMG_MAP不匹配时, 直接返回错误(减少处理量)

  4. 处理后的文件, 直接从exhaust目录提供访问,包含以下几个处理逻辑:

    • 处理后图片比源文件大, 那么保留原图片

    • 有查询参数的图片, 保存为包含查询参数的图片名, 并且二次访问也是直接从保存的处理后图片去提供访问,如图

    • 图片重新编码失败, 保存原图并提供访问

    • 图片超过优化尺寸范围限制(超大,比如高有几万像素), 保存原图提供访问

  5. web引擎从fiber切换到gin (2024.10.28)

经过以上修改, 本项目跟原项目的根底逻辑已经变化了. 更类似于我之前写的两个项目:

举例

远程资源情况下

源资源: https://cf-r2.czl.net/status.html
webp-server-go站点: https://webp.czl.net/r2/status.html

访问webp链接会重定向到源资源

本地资源情况下

源资源: 本地映射到容器的/v目录
webp-server-go链接: https://webp.czl.net/v/status.html

访问webp链接, 会直接返回资源

部署方法

docker compose

services:
    webp:
        container_name: webp-server-go
        image: woodchen/webp-server-go
        ports:
            - 3333:3333
        restart: always
        environment:
          - TZ=Asia/Shanghai
        volumes:
            - ./config.json:/etc/config.json
            - ./exhaust:/opt/exhaust
            - ./metadata:/opt/metadata
            - ./remote-raw:/opt/remote-raw
            - /opt/.../www/sites/xxx.net/uploads:/opt/v
           

示例config.json

{
  "HOST": "0.0.0.0",
  "PORT": "3333",
  "QUALITY": "90",
  "EXHAUST_PATH": "./exhaust",
  "MetadataPath":  "./metadata",
  "RemoteRawPath": "./remote-raw",
  "IMG_MAP": {
    "/oracle": "https://xxx.ap-singapore-1.xxxer-xxx.com/n/.../o",
    "/b2": "https://cf-xxx.xxx.net",
    "/r2": "https://cf-yyy.yyy.net",
    "/v": "./v"
  },
  "ALLOWED_TYPES": ["*"],
  "CONVERT_TYPES": ["webp"],
  "STRIP_METADATA": true,
  "ENABLE_EXTRA_PARAMS": true,
  "EXTRA_PARAMS_CROP_INTERESTING": "InterestingAttention",
  "ReadBufferSize": "1024*4",
  "CONCURRENCY": 256,
  "DISABLE_KEEPALIVE": true,
  "CACHE_TTL": 1440,
  "MAX_CACHE_SIZE": 10240
}

具体配置参数含义和可配置值可以参考: Configuration | WebP Server Documentation

使用nginx反代

可以单独反代一下favicon.ico

location = /favicon.ico { #这里是你需要直接访问的链接后缀
    alias /www/sites/webp.czl.net/index/favicon.ico;#这里是你文件的详细目录
}
location ^~ / {
    proxy_pass http://localhost:3333; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header REMOTE-HOST $remote_addr; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $http_connection; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_http_version 1.1; 
    add_header X-Cache $upstream_cache_status; 
    add_header Cache-Control no-cache; 
    proxy_ssl_server_name off; 
    add_header Strict-Transport-Security "max-age=31536000"; 
}

使用即可.

注意的点

  1. 如果转换后的webp文件比原图还要大, 那么会使用原图. 主要是看返回标头是否有x-compression-rate, 有的话就说明已经经过webp-server-go的处理了.日志里也有详细显示
  2. 源站最好支持下etag标签
  3. 如果每天访问量有20w以上, 可以考虑自行优化下, go的劣势在于内存回收时会阻塞, 有能力的话使用rust重构也许会更好.