picfit(GitHub 项目地址:https://github.com/thoas/picfit)是一个用 Go 编写的 高性能图片处理服务器,支持动态调整尺寸、裁剪、旋转、格式转换等操作。它通常作为 图片处理微服务 部署在后端,配合 CDN 或缓存层(如 Varnish)使用。
下面为你详细介绍 如何部署和使用 picfit,包括安装、配置、启动和调用方式。
一、核心功能
- 支持的操作:
resize(缩放)、thumbnail(缩略图+裁剪)、rotate、flip、noop(原图)、effect(模糊)等 - 支持的格式:JPEG、PNG、GIF、BMP、WebP
- 存储后端:本地文件系统(fs)、HTTP、Amazon S3、DigitalOcean Spaces、Google Cloud Storage 等
- 缓存机制:可搭配 Redis 或内存缓存避免重复生成
- 安全机制:支持请求签名(HMAC-SHA1)防止滥用
- 输出方式:直接显示图片(
/display)、重定向(/redirect)、返回元信息(/get)
二、快速开始(最简示例)
1. 安装(通过 Docker,推荐)
# 拉取镜像
docker pull thoas/picfit
# 启动(仅处理来自 URL 的图片,无持久化存储)
docker run -p 3001:3001 thoas/picfit
默认监听
http://localhost:3001
2. 调用示例(直接处理网络图片)
假设你要将一张网络图片缩放到 200x200:
<img src="http://localhost:3001/display?url=https%3A%2F%2Fexample.com%2Fphoto.jpg&w=200&h=200&op=resize">
或直接访问:
http://localhost:3001/display?url=https://example.com/photo.jpg&w=200&h=200&op=resize
效果:自动下载 photo.jpg,缩放为 200x200 并返回 JPEG/PNG 图片。
三、配置文件详解(config.json)
picfit 通过 JSON 配置文件控制行为。以下是一个 常用生产配置示例(从本地目录读图,结果缓存在内存,图片存本地):
{
"port": 3001,
"debug": false,
"storage": {
"src": {
"type": "fs",
"location": "/var/www/images/original/"
}
},
"kvstore": {
"type": "cache"
}
}
常见配置项说明:
| 配置项 | 说明 |
|---|---|
port |
监听端口,默认 3001 |
storage.src.type |
源图片存储类型:fs(本地)、http+fs(通过 HTTP 访问本地文件)、s3 等 |
storage.src.location |
若为 fs,指定源图片根目录 |
kvstore.type |
缓存已处理图片的 key:cache(内存)、redis、redis-cluster |
shard |
文件分片存储(防止单目录文件过多) |
engine.quality |
全局输出质量(1-100,默认 95) |
secret_key |
用于请求签名(开启安全模式) |
💡 更多配置参考官方 README.rst
四、支持的请求参数(URL Query)
通用格式:
http://picfit-host/{method}?{params}
常用参数:
| 参数 | 说明 | 示例 |
|---|---|---|
url |
网络图片地址(需 urlencode) | url=https%3A%2F%2F... |
path |
本地存储路径(相对于 storage.src.location) |
path=avatars/user123.png |
w / h |
宽度 / 高度(设 0 则按比例) | w=300&h=0 |
op |
操作类型 | op=resize, op=thumbnail, op=rotate |
deg |
旋转角度(90/180/270) | op=rotate°=90 |
pos |
翻转方向 | op=flip&pos=h(水平) |
fmt |
输出格式 | fmt=webp |
q |
图片质量(仅 JPEG/WebP) | q=80 |
sig |
请求签名(防篡改) | sig=abc123... |
方法(Method):
/display:直接返回图片(适合<img>标签)/redirect:生成后 302 重定向到结果 URL(需配置dst存储)/get:返回 JSON 元信息(filename, path, url)
五、安全建议
-
启用请求签名(防止任意图片处理):
{ "secret_key": "your-secret-key-here" }客户端需用 HMAC-SHA1 对查询字符串签名,并附加
sig=xxx。 -
限制允许尺寸(防资源耗尽):
{ "options": { "allowed_sizes": [ {"width": 100, "height": 100}, {"width": 800} ] } } -
关闭上传/删除接口(默认已关闭):
- 如需启用,显式设置
"enable_upload": true,并用 Nginx 限制 IP。
- 如需启用,显式设置
六、Docker 部署示例(带配置文件)
-
创建
config.json:{ "port": 3001, "storage": { "src": { "type": "fs", "location": "/data/images/" } }, "kvstore": { "type": "cache" } } -
启动容器:
docker run -d \ --name picfit \ -p 3001:3001 \ -v $(pwd)/config.json:/app/config.json \ -v /your/image/dir:/data/images \ thoas/picfit -c /app/config.json
七、典型使用场景
- 用户头像自动裁剪:
/display?path=avatars/123.png&w=100&h=100&op=thumbnail - 商品图统一尺寸:
/display?path=products/456.jpg&w=800&h=600&op=resize - 移动端 WebP 优化:
/display?path=img.png&fmt=webp&q=75
官方资源
- GitHub: https://github.com/thoas/picfit
- 文档(README): https://github.com/thoas/picfit/blob/main/README.rst
- Docker Hub: https://hub.docker.com/r/thoas/picfit
如果你有具体需求(比如“如何对接 S3”、“如何加签名”),可以告诉我,我会给出针对性配置!