配置imgproxy
DevOps
Railway的bucket目前还没有提供公开可访问的功能,所以需要自己想办法支持,imgproxy就是一个方案。完整的模板在public-bucket-image-proxy。
imgproxy默认会把传入的图片质量压缩到原有的80%。所以,不需要添加额外的配置就能使用。只是其他部分比如环境变量还是非常多要根据需要修改使用。
找AI汇总了一些最佳配置实践:
# 必须设置,防止 DoS 攻击
IMGPROXY_KEY=你的16进制密钥 # 32字节,用 xxd -g 2 -l 64 -p /dev/random 生成
IMGPROXY_SALT=你的16进制盐值 # 16字节以上
# 限制图片来源域名(白名单)
IMGPROXY_ALLOWED_SOURCES="https://your-cdn.com,https://api.your.com"
# 绑定地址
IMGPROXY_BIND=0.0.0.0:8080
# 超时设置(根据网络状况调整)
IMGPROXY_TIMEOUT=30 # 总超时 30 秒
IMGPROXY_DOWNLOAD_TIMEOUT=15 # 下载源图超时 15 秒
IMGPROXY_WRITE_RESPONSE_TIMEOUT=20 # 响应写入超时 20 秒
# 并发控制
IMGPROXY_WORKERS=8 # 4核CPU推荐设为 8(核心数×2)
IMGPROXY_MAX_CLIENTS=4096 # 最大并发连接数
IMGPROXY_REQUESTS_QUEUE_SIZE=1024 # 请求队列长度
# 限制源图大小(必须设置,否则可能被大文件拖垮)
IMGPROXY_MAX_SRC_FILE_SIZE=10485760 # 10MB,根据业务调整
IMGPROXY_MAX_SRC_RESOLUTION=100 # 百万像素(100MP),对应约 10000×10000 像素
# 缓冲区优化
IMGPROXY_BUFFER_POOL_SIZE=100 # 复用缓冲区,减少 GC 压力
IMGPROXY_FREE_MEMORY_INTERVAL=10 # 定期释放内存间隔(秒)
# ARM 架构优化(Graviton 3)
ENV VIPS_VECTOR=167772160 # 禁用 SVE 指令,使用 NEON [^4^]
ENV MALLOC_ARENA_MAX=2 # 减少内存碎片
ENV IMGPROXY_MALLOC=jemalloc # 使用 jemalloc 分配器
# 启用多阶段并行处理(高并发场景收益明显)[^6^]
IMGPROXY_MAX_PARALLEL_STEPS=12 # 建议设为 CPU 核心数的 1.5 倍
# 启用 SO_REUSEPORT(Linux 下优化连接分发)
IMGPROXY_SO_REUSEPORT=true
# 下载结果缓存(推荐)
IMGPROXY_CACHE_ETAG_ENABLED=true
IMGPROXY_CACHE_CONTROL_PUBIC=true
IMGPROXY_CACHE_CONTROL_MAX_AGE=31536000 # 1 年
# 处理结果缓存(需配合外部存储)
IMGPROXY_RESULT_CACHE_TTL=3600 # 缓存 1 小时
# 优先使用现代格式
IMGPROXY_AUTO_WEBP=true # 对支持 WebP 的浏览器自动返回 WebP
IMGPROXY_AUTO_AVIF=true # 对支持 AVIF 的浏览器自动返回 AVIF
IMGPROXY_ENABLE_JXL=true # 启用 JPEG XL 格式(未来趋势)
# 差异化质量设置(平衡体积与画质)[^2^]
IMGPROXY_QUALITY=75 # 全局默认质量
IMGPROXY_FORMAT_QUALITY="webp:70,avif:60,jxl:72" # 各格式专用质量
# WebP 专项优化(电商场景)[^5^]
IMGPROXY_WEBP_COMPRESSION=6 # 压缩级别 0-6,6 最慢但体积最小
IMGPROXY_WEBP_SMART_SUBSAMPLE=true # 智能色度子采样,减少 30% 体积
# PNG 量化(大幅减小文件大小)[^2^]
IMGPROXY_PNG_QUANTIZE=true
IMGPROXY_PNG_QUANTIZATION_COLORS=224 # 颜色数 224,透明度保留
# JPEG 渐进式加载
IMGPROXY_JPEG_PROGRESSIVE=true
IMGPROXY_JPEG_NO_SUBSAMPLE=false # 文字类图片设为 true 保真
# 禁用动画(减少资源消耗)
IMGPROXY_MAX_ANIMATION_FRAMES=1 # 只取第一帧
IMGPROXY_MAX_ANIMATION_FRAME_RESOLUTION=1 # 限制动图分辨率
# 定义业务场景预设
IMGPROXY_PRESETS="thumbnail:resize:fit:100:100:0:quality:60,product:resize:fit:800:800:1:quality:85,hd:resize:fit:1920::1:quality:90"
## 调用方式:/preset:product/plain/https://example.com/image.jpg
# 限制处理维度(防止生成超大图)
IMGPROXY_MAX_SRC_DIMENSION=8192 # 原图最大边长
IMGPROXY_MAX_DST_DIMENSION=4096 # 输出图最大边长
# 限制处理复杂度
IMGPROXY_MAX_PROCESSING_RESOLUTION=300 # 300 MP,防止过度放大
IMGPROXY_MAX_ANIMATION_FRAMES_LIMIT=100 # 动图最多 100 帧
# SVG 安全
IMGPROXY_SANITIZE_SVG=true # 清理 SVG 中的恶意脚本
# 并发限速(保护后端存储)
IMGPROXY_MAX_PARALLEL_DOWNLOADS=10 # 同时下载源图数
IMGPROXY_DOWNLOAD_BUFFER_SIZE=5000000 # 5MB 下载缓冲区
# IP 黑白名单(配合反向代理)
IMGPROXY_TRUSTED_IPS="10.0.0.0/8,172.16.0.0/12" # 信任内网 IP
# 启用指标导出
IMGPROXY_PROMETHEUS_ENABLED=true
IMGPROXY_PROMETHEUS_BIND=:9090 # 独立端口避免干扰业务
# 关键指标:
# - imgproxy_requests_total(总请求数)
# - imgproxy_request_duration_seconds(处理耗时)
# - imgproxy_images_in_progress(当前处理中)
# - imgproxy_buffer_pool_size(缓冲池占用)
# 配置健康检查端点
IMGPROXY_HEALTH_CHECK_PATH=/health # K8s 或 LB 探测用
IMGPROXY_READY_CHECK_PATH=/ready # 就绪探针
IMGPROXY_LOG_LEVEL=warn # 生产环境用 warn 或 error
IMGPROXY_LOG_FORMAT=json # 便于日志收集系统解析
相关:use-prettier