Cloudflare R2 不像国内的对象存储提供了免费的图片缩放功能,他们的图片处理是另外收费的。使用开源项目imageproxy可以实现完美的图片缩放服务
项目地址 https://github.com/willnorris/imageproxy
docker compose配置
version: '3' # Docker Compose 文件格式版本
services:
# imageproxy 服务主配置
imageproxy:
image: ghcr.io/willnorris/imageproxy # 来自 GitHub Container Registry 的官方镜像
ports:
- "8080:8080" # 将容器的 8080 端口映射到主机的 8080 端口
environment:
# 将服务器绑定到所有网络接口的 8080 端口
- IMAGEPROXY_ADDR=0.0.0.0:8080
# 配置两级缓存系统:
# 1. 第一级:200MB 内存缓存,缓存项最多保存 6 小时
# 2. 第二级:基于 /cache 目录的磁盘缓存
- "IMAGEPROXY_CACHE=memory:200:6h /cache"
# 安全设置:限制可以代理的远程主机
# 只处理来自这些域名的图像,如不限制可用*
- IMAGEPROXY_ALLOWHOSTS=example.com,example.org
# 限制接受的内容类型
# 只处理 image/* MIME 类型
- IMAGEPROXY_CONTENTYPES=image/*
# 设置请求超时为 30 秒
# 超过此时间的请求将返回 504 网关超时错误
- IMAGEPROXY_TIMEOUT=30s
# 启用详细日志记录,便于调试
- IMAGEPROXY_VERBOSE=true
volumes:
# 将本地 ./cache 目录映射到容器内的 /cache 目录
# 这样可以在容器重启后保留磁盘缓存
- ./cache:/cache
# 除非手动停止,否则容器会自动重启
restart: unless-stopped
基本使用
指定宽度,保持比例:
/200x/https://example.com/image.jpg
指定高度,保持比例:
/x150/https://example.com/image.jpg
指定宽度和高度(裁剪):
/100x150/https://example.com/image.jpg
正方形裁剪:
/100/https://example.com/image.jpg
功能介绍
核心图像处理功能
- 裁剪功能 - 支持矩形裁剪,可以通过cx、cy、cw、ch参数指定裁剪区域
- 智能裁剪 - 基于图像内容自动寻找最佳裁剪点
- 调整大小 - 支持按像素或百分比调整图像尺寸
- 旋转 - 支持90°、180°、270°旋转
- 翻转 - 支持水平和垂直翻转
- 适应模式 - 在不裁剪的情况下调整图像大小以适应指定尺寸
- 质量调整 - 可以指定JPEG图像的质量百分比
- 格式转换 - 支持JPEG、PNG和TIFF格式之间的转换
- 边缘裁剪 - 自动裁剪图像边缘的相同颜色像素
缓存系统
- 内存缓存 - 使用内存LRU缓存存储处理后的图像
- 磁盘缓存 - 将处理后的图像缓存到本地磁盘
云存储缓存 - 支持多种云存储服务:
- Amazon S3 - 支持S3兼容的存储服务
- Google Cloud Storage - 支持GCS存储
- Azure Storage - 支持Azure存储
- Redis缓存 - 支持使用Redis进行缓存
- 多级缓存 - 支持配置多个缓存层级
安全功能
- 主机白名单 - 限制只能从特定主机获取图像
- 主机黑名单 - 禁止从特定主机获取图像
- 引用站点限制 - 限制只允许特定引用站点的请求
- 请求签名 - 使用HMAC-SHA256签名验证请求
- 密钥轮换 - 支持多个签名密钥以实现密钥轮换
部署选项
- 命令行工具 - 作为独立的命令行应用程序运行
- Docker部署 - 支持Docker容器部署
- Caddy模块 - 作为Caddy Web服务器的模块运行
其他功能
- 默认基础URL - 支持相对于基础URL的图像路径
- 放大选项 - 可选择是否允许图像放大超过原始尺寸
- WebP支持 - 支持WebP图像解码
- TIFF支持 - 支持TIFF图像格式
- GIF动画支持 - 支持处理动态GIF图像
- 详细日志 - 可选的详细日志记录
- 自定义User-Agent - 可以设置代理请求的User-Agent
- 请求头传递 - 可以将指定的请求头从入站请求传递到代理服务器
- 请求超时 - 可以设置请求的超时时间
- 重定向控制 - 可以控制是否跟随重定向