hikarinagi的图片处理服务(Hikarinagi Image Process Service),bimg 负责核心的图片处理,gin 负责网络请求处理
- Go 1.24+
- libvips
- Cloudflare R2 账户
sudo apt install libvips-dev
sudo yum install libvips-dev
brew install vips (For MacOS)| 环境变量 | 描述 | 默认值 | 是否必须 |
|---|---|---|---|
R2_ENDPOINT |
Cloudflare R2存储端点地址 | - | ✅ |
R2_ACCESS_KEY |
R2访问密钥 | - | ✅ |
R2_SECRET_KEY |
R2秘密密钥 | - | ✅ |
R2_BUCKET |
R2存储桶名称 | - | ✅ |
PORT |
服务监听端口 | 8080 |
❌ |
MAX_WORKERS |
最大worker数量 | CPU核心数×2 | ❌ |
MAX_QUEUE_SIZE |
最大队列大小 | MAX_WORKERS×10 | ❌ |
TASK_TIMEOUT |
任务执行超时时间 | 30s |
❌ |
ENABLE_ASYNC |
启用异步处理 | true |
❌ |
BUFFER_SIZE |
缓冲区大小 | 100 |
❌ |
VIPS_CONCURRENCY |
libvips内部线程数 | CPU核心数 | ❌ |
VIPS_CACHE_SIZE |
libvips操作缓存数量 | 200 |
❌ |
VIPS_CACHE_MEM_MB |
libvips缓存内存限制(MB) | 256 |
❌ |
NET_MAX_IDLE_CONNS |
最大空闲连接数 | 100 |
❌ |
NET_MAX_IDLE_CONNS_PER_HOST |
每个host的最大空闲连接数 | 20 |
❌ |
NET_MAX_CONNS_PER_HOST |
每个host的最大连接数 | 50 |
❌ |
NET_DIAL_TIMEOUT |
连接超时时间 | 10s |
❌ |
NET_KEEP_ALIVE |
Keep-Alive时间 | 30s |
❌ |
NET_IDLE_CONN_TIMEOUT |
空闲连接超时时间 | 90s |
❌ |
NET_REQUEST_TIMEOUT |
整体请求超时时间 | 60s |
❌ |
NET_DISABLE_COMPRESSION |
是否禁用压缩 | false |
❌ |
CACHE_L1_ENABLED |
启用L1内存缓存 | true |
❌ |
CACHE_L2_ENABLED |
启用L2 Redis缓存 | true |
❌ |
CACHE_L3_ENABLED |
启用L3磁盘缓存 | true |
❌ |
CACHE_L1_MAX_MEMORY_MB |
L1最大内存限制(MB) | 1024 |
❌ |
CACHE_L2_MAX_MEMORY_MB |
L2最大内存限制(MB) | 3072 |
❌ |
CACHE_L3_MAX_DISK_GB |
L3最大磁盘空间(GB) | 10 |
❌ |
REDIS_ADDR |
Redis服务器地址 | localhost:6379 |
❌ |
REDIS_PASSWORD |
Redis密码 | - | ❌ |
REDIS_DB |
Redis数据库编号 | 0 |
❌ |
CACHE_DISK_DIR |
磁盘缓存目录 | ./cache |
❌ |
CACHE_PROMOTE_THRESHOLD |
缓存提升访问次数阈值 | 3 |
❌ |
CACHE_DEMOTE_THRESHOLD |
缓存降级访问次数阈值 | 1 |
❌ |
CACHE_SYNC_INTERVAL |
缓存同步间隔 | 5m |
❌ |
THIRD_PARTY_PROVIDERS_JSON |
第三方图片提供方列表(JSON数组) | - | ❌ |
./scripts/build.sh
# 或者直接构建
go build -o bin/hips cmd/server/main.go
# 运行
./bin/hipsGET /{图片路径}?参数
支持的参数:
w: 宽度 (最大 2048px)h: 高度 (最大 2048px)q: 质量 (1-100,默认 85)f: 格式 (jpeg/png/webp/avif)crop: 裁剪模式 (fit/fill/crop)gravity: 重心位置 (center/north/south/east/west)blur: 模糊程度 (0-100,默认 0)
示例:
http://localhost:8080/path/to/image.jpg?w=300&h=200&q=85&f=webp&blur=2
通过配置第三方提供方后,可以直接请求远程图片地址:
- 配置环境变量(注意JSON需使用双引号):
export THIRD_PARTY_PROVIDERS_JSON='[{"name":"bangumi","allowed_hosts":["lain.bgm.tv"]}]'- 请求示例:
GET /bangumi/https%3A%2F%2Flain.bgm.tv%2Fpic%2Fcover%2Fl%2F1c%2Fba%2F343241_TWFSN.jpg?w=600&h=400&f=avif&q=85说明:
- 第一路径段为
provider名称,对应name - 第二段为远程图片完整URL,建议URL编码;服务端也会尝试解码
- 仅当URL的
host在对应allowed_hosts白名单中时才会拉取
GET /health
默认启用 libvips 的多线程处理,推荐部署在核心数不小于16,RAM不小于32GiB的实例上来达到最佳性能
- L1 - 内存: 最热门的图片,LRU策略,默认1GB
- L2 - Redis: 比较热门的图片,默认3GB
- L3 - Disk: 热门原图,默认10GB
- L4 - CDN: 主要缓存层
AGPL-3.0