imgproxy 4.0 配置参数详解

imgproxy v4.0.19 全部 IMGPROXY_* 环境变量详解:签名 KEY/SALT/SIGNATURE_SIZE、图源与白名单、TTL/ETag/调试头、质量与 WebP/AVIF 自动协商、分辨率与体积上限、超时、水印、日志,每项配修改-重启-实测回显闭环,附两套生产配置模板

imgproxyimgproxy图片处理2026/10/26

imgproxy 4.0 配置参数详解

目标:系统梳理 imgproxy v4.0.19 的全部 IMGPROXY_* 环境变量——签名与安全、图源控制、缓存协商、质量与格式、安全上限、超时、水印、可观测性八大类。每个影响运行时行为的参数均给出「修改 → 重启 → 实测验证」完整闭环,响应头、状态码、日志逐条照录实测结果;文末附两套生产配置模板与 FAQ。已在 Ubuntu 24.04.5 LTS(x86_64)+ imgproxy 4.0.19 环境实测通过。

一、环境信息

  • 操作系统:Ubuntu 24.04.5 LTS(x86_64)
  • imgproxy:v4.0.19(imgproxy version 实测输出 4.0.19)
  • 服务监听:127.0.0.1:8140
  • 演示源站:内部 HTTP 图片服务器 http://origin(另经 127.0.0.1:8141 暴露同一批文件,用于白名单对照实验)
  • 本地图源根目录:/images(内含 photo-1920x1080.jpg 104248 字节、two-tone-320x240.jpg 2352 字节、watermark-300x120.png 等)
  • 配置方式:imgproxy 无配置文件,全部配置经 IMGPROXY_* 环境变量注入;本文以 /etc/imgproxy/imgproxy.env + systemd EnvironmentFile= 托管为例
  • 签名密钥对(演示环境实测值):IMGPROXY_KEY=e2f29550ff27f4f6b6475b16b1af3cb648434daa215361c03ca61efab13c04f0,IMGPROXY_SALT=b858fad4bd3ec36662d606c13c0d6fdda3ba980689163ff6128022ded3a662c9(openssl rand -hex 32 生成)
  • 参考底稿:官方文档 Configuration 页(docs.imgproxy.net,2026-10-25 查询);标注「官方口径」的参数为官方默认值转述、未单独复现,其余均附实测小节

二、前置条件

  • imgproxy 4.0.19 已部署并监听 8140 端口,部署全过程见《imgproxy 4.0 Docker Compose 部署指南》;
  • 理解签名 URL 结构 /<签名>/<处理选项>/<Base64编码源URL>[.<输出格式>]。本文全部实验 URL 由以下 Python 代码生成(HMAC-SHA256 + URL-safe Base64,算法逐字段验证与更多选项示例见《imgproxy 4.0 API 使用详解》):
import base64, hashlib, hmac

KEY  = "e2f29550ff27f4f6b6475b16b1af3cb648434daa215361c03ca61efab13c04f0"
SALT = "b858fad4bd3ec36662d606c13c0d6fdda3ba980689163ff6128022ded3a662c9"

def b64(data: bytes) -> str:
    return base64.urlsafe_b64encode(data).decode().rstrip("=")

def sign(path: str) -> str:
    digest = hmac.new(bytes.fromhex(KEY), bytes.fromhex(SALT) + path.encode(), hashlib.sha256).digest()
    return b64(digest)

path = "/rs:fill:800:600:1/" + b64(b"http://origin/photo-1920x1080.jpg") + ".jpg"
url  = "http://127.0.0.1:8140/" + sign(path) + path
print(url)

实测输出(即下文「远程图源基线 URL」):

http://127.0.0.1:8140/D0J1LxFduGjvsfIGlAocpMdUkGUSHn8gX0AqSQaRf48/rs:fill:800:600:1/aHR0cDovL29yaWdpbi9waG90by0xOTIweDEwODAuanBn.jpg
  • 本文基线环境变量(未单独说明的实验均在此基线上改动单项):
IMGPROXY_KEY=e2f29550ff27f4f6b6475b16b1af3cb648434daa215361c03ca61efab13c04f0
IMGPROXY_SALT=b858fad4bd3ec36662d606c13c0d6fdda3ba980689163ff6128022ded3a662c9
IMGPROXY_LOCAL_FILESYSTEM_ROOT=/images
IMGPROXY_WATERMARK_PATH=/images/watermark-300x120.png
IMGPROXY_WATERMARK_OPACITY=0.8
IMGPROXY_TTL=86400
IMGPROXY_QUALITY=80
IMGPROXY_USE_ETAG=true
IMGPROXY_ENABLE_DEBUG_HEADERS=true

三、参数查看与修改方式

imgproxy 没有配置文件,官方只提供环境变量一种配置方式:全部参数以 IMGPROXY_ 前缀的环境变量在进程启动时读取,运行时修改不生效,必须重启进程。

修改与生效流程(systemd 托管形态):

vi /etc/imgproxy/imgproxy.env      # 增删改 IMGPROXY_* 变量
sudo systemctl restart imgproxy    # 重启进程使变量生效
imgproxy health                    # 验证服务已恢复

实测回显:

imgproxy is running

💡 说明:以其他方式启动 imgproxy(直接 export 变量后前台运行、编排工具注入环境变量等)等价——核心规则只有一条:变量在进程启动时读取,改后必须重建进程。imgproxy health 是二进制自带的健康检查子命令,返回 imgproxy is running 即表示服务正常。

验证参数是否生效的通用手段(下文逐参数演示):缓存类看响应头 Cache-Control/ETag;格式协商类用 curl -H 'Accept: image/webp,image/*' 等请求头对照 Content-Type;安全上限类看 422/404 状态码与响应体;签名校验类看 403 与启动日志。

四、参数总览

按官方文档口径整理运行时参数(本文实测项打 ✅,其余为官方口径转述):

变量默认值作用实测
IMGPROXY_KEY / IMGPROXY_SALT未设(签名校验关闭)URL 签名密钥/盐(hex,可逗号分隔多组轮换)✅
IMGPROXY_SIGNATURE_SIZE32(字节)签名校验时比对的前 N 字节,可截短签名✅
IMGPROXY_TRUSTED_SIGNATURES未设免校验的签名清单(官方口径)—
IMGPROXY_LOCAL_FILESYSTEM_ROOT未设(local:// 关闭)本地图源根目录✅
IMGPROXY_ALLOWED_SOURCES未设(全部允许)来源白名单(协议/主机/前缀)✅
IMGPROXY_S3_ENABLED / GCS / ABS / SWIFTfalse各对象存储图源开关(官方口径)—
IMGPROXY_TTL3600结果缓存秒数 → Cache-Control max-age✅
IMGPROXY_USE_ETAGfalse输出 ETag 并支持 304 条件请求✅
IMGPROXY_ENABLE_DEBUG_HEADERSfalse输出 X-Origin-/X-Result- 调试头✅
IMGPROXY_QUALITY80默认输出质量(1–100)✅
IMGPROXY_AUTO_WEBP / IMGPROXY_AUTO_AVIFfalse按 Accept 头自动协商 WebP/AVIF✅
IMGPROXY_ENFORCE_WEBP / ENFORCE_AVIFfalse强制输出某格式(官方口径)—
IMGPROXY_MAX_SRC_RESOLUTION16.8(百万像素)原图分辨率上限,超限 422✅
IMGPROXY_MAX_SRC_FILE_SIZE0(不限)原图字节上限,超限 422✅
IMGPROXY_MAX_ANIMATION_FRAMES0(不限)动图帧数上限(官方口径)—
IMGPROXY_DOWNLOAD_TIMEOUT5(秒)拉取源图总超时,超时 504✅
IMGPROXY_WORKERSCPU 核数 × 2并发处理数上限(官方口径)—
IMGPROXY_REQUEST_QUEUE_SIZE0(不限)排队请求数上限,超限 429(官方口径)—
IMGPROXY_WATERMARK_PATH / OPACITY未设 / 1水印图路径与默认不透明度✅
IMGPROXY_PRESETS未设服务端固化选项组合 pr:名称(官方口径)—
IMGPROXY_LOG_LEVEL / LOG_FORMATinfo / text日志级别与格式(官方口径)—
IMGPROXY_OPEN_TELEMETRY_*未启用OpenTelemetry 指标/追踪(Pro 功能为主,官方口径)—

读表要点:生产必备的「安全三件套」是 KEY/SALT(签名)+ ALLOWED_SOURCES(白名单)+ MAX_SRC_RESOLUTION/MAX_SRC_FILE_SIZE(上限);缓存三件套 TTL/USE_ETAG 配合 CDN 使用;AUTO_WEBP/AUTO_AVIF 是零成本省流量的两个开关。下文逐项实测。

五、核心参数分类详解

5.1 URL 签名:IMGPROXY_KEY / IMGPROXY_SALT / IMGPROXY_SIGNATURE_SIZE

KEY 与 SALT 是 imgproxy 安全模型的根基:设置后所有请求必须携带用二者计算的 HMAC-SHA256 签名,签名覆盖 URL 路径(处理选项 + 源地址),攻击者无法篡改任何一段。二者均为十六进制字符串,支持逗号分隔多组(用于密钥轮换时新旧并存)。

未设置的后果(实测):从基线 env 中删掉 KEY/SALT 并重启,启动日志明确告警签名校验已关闭:

time="2026-10-25 15:13:28" level="WARNING" msg="No keys defined, signature checking is disabled" name="IMGPROXY_KEY" format="comma-separated hex-encoded strings" value=""
time="2026-10-25 15:13:28" level="WARNING" msg="No salts defined, signature checking is disabled" name="IMGPROXY_SALT" format="comma-separated hex-encoded strings" value=""

此时任意签名字段都能通过——用 /unsafe/ 作为签名段请求也返回 200(实测,源图被正常处理):

HTTP/1.1 200 OK
Cache-Control: max-age=86400, public
Content-Disposition: inline; filename="photo-1920x1080.jpg"
Content-Length: 10046
Content-Type: image/jpeg
X-Origin-Content-Length: 104248
X-Origin-Height: 1080
X-Origin-Width: 1920
X-Result-Height: 300
X-Result-Width: 400

body-bytes: 10046

即实例沦为开放代理:任何人都可借它处理任意来源图片。仅限本机体验,严禁暴露公网。

只设 KEY 不设 SALT(实测):服务直接无法启动,日志反复输出 CRITICAL:

time="2026-10-25 15:13:43" level="CRITICAL" msg="number of keys and number of salts should be equal. Keys: 1, salts: 0"

KEY 与 SALT 必须成对且数量相等(多组轮换时一一对应)。

IMGPROXY_SIGNATURE_SIZE(截短签名):默认比对完整 32 字节签名;设为 16 后只比对前 16 字节,URL 更短。实测设置 IMGPROXY_SIGNATURE_SIZE=16 后,16 字节截短签名的 URL 通过校验:

$ curl -sS -D - -o /dev/null "http://127.0.0.1:8140/AIvWRA-L4Lt8H4IlHvXC9w/rs:fill:300:300:1/aHR0cDovL29yaWdpbi9waG90by0xOTIweDEwODAuanBn.jpg"
HTTP/1.1 200 OK
Cache-Control: max-age=86400, public
Content-Disposition: inline; filename="photo-1920x1080.jpg"
Content-Length: 7727
Content-Type: image/jpeg
X-Origin-Content-Length: 104248
X-Origin-Height: 1080
X-Origin-Width: 1920
X-Result-Height: 300
X-Result-Width: 300

body-bytes: 7727

而完整 32 字节签名的同路径 URL 反而被拒(签名段长度与配置不符):

HTTP/1.1 403 Forbidden
Content-Type: text/plain
Content-Length: 9

body-bytes: 9

⚠️ 注意:改 SIGNATURE_SIZE 等于切换签名格式,全网已分发 URL 必须同步重新生成;16 字节(128 bit)截短在暴力枚举层面仍足够安全,但不要再往小调。

5.2 图源控制:IMGPROXY_LOCAL_FILESYSTEM_ROOT / IMGPROXY_ALLOWED_SOURCES

IMGPROXY_LOCAL_FILESYSTEM_ROOT 开启 local:// 图源并把访问收进指定根目录(目录之外的路径不可达,防路径穿越)。基线中已设为 /images,故 local:///photo-1920x1080.jpg 可正常处理。实测未设置该变量时,同一条 local:// 签名 URL 直接 404:

$ curl -sS -D - -o /dev/null "http://127.0.0.1:8140/m0cQ_tO539CqwcwynyLwbB_KAr_U6EdX0TSFJAyrq3U/rs:fill:400:300:1/bG9jYWw6Ly8vcGhvdG8tMTkyMHgxMDgwLmpwZw.jpg"
HTTP/1.1 404 Not Found
Content-Type: text/plain
Content-Length: 21

body-bytes: 21

IMGPROXY_ALLOWED_SOURCES 限定允许拉取的源站(逗号分隔,支持 http://host、https://host/path 等前缀),把 imgproxy 从「开放代理」收口为「指定源站的处理器」。实测设置 IMGPROXY_ALLOWED_SOURCES=http://origin 后:

白名单内源站(http://origin/photo-1920x1080.jpg)正常处理:

HTTP/1.1 200 OK
Cache-Control: max-age=86400, public
Content-Length: 23416
Content-Type: image/jpeg
X-Origin-Height: 1080
X-Origin-Width: 1920
X-Result-Height: 600
X-Result-Width: 800

body-bytes: 23416

白名单外地址(同一批文件的另一个地址 http://127.0.0.1:8141/photo-1920x1080.jpg)被拒:

HTTP/1.1 404 Not Found
Content-Type: text/plain
Content-Length: 18

body-bytes: 18

⚠️ 注意:白名单按 URL 前缀匹配,http://origin 与 http://origin:80 之外的同源别名(IP、其他端口、其他主机名)一律视为不同来源。生产环境建议同时配合网络层 ACL 双保险。

5.3 缓存与内容协商:IMGPROXY_TTL / IMGPROXY_USE_ETAG / IMGPROXY_ENABLE_DEBUG_HEADERS

IMGPROXY_TTL 直接映射为结果图的 Cache-Control: max-age=<值>, public,是 CDN/浏览器缓存的唯一时效依据。基线 86400 时实测响应头:

HTTP/1.1 200 OK
Cache-Control: max-age=86400, public
Content-Disposition: inline; filename="photo-1920x1080.jpg"
Content-Length: 23416
Content-Type: image/jpeg
Etag: "6ade0950-19738"
Last-Modified: Sun, 25 Oct 2026 13:51:12 GMT
X-Origin-Content-Length: 104248
X-Origin-Height: 1080
X-Origin-Width: 1920
X-Result-Height: 600
X-Result-Width: 800

body-bytes: 23416

改为 600 重启后,同一 URL 实测(Cache-Control 同步变为 600;字节数变化来自同批实验把 QUALITY 一并改为 50,见 5.4):

HTTP/1.1 200 OK
Cache-Control: max-age=600, public
Content-Disposition: inline; filename="photo-1920x1080.jpg"
Content-Length: 14814
Content-Type: image/jpeg
Etag: "6ade0950-19738"
Last-Modified: Sun, 25 Oct 2026 13:51:12 GMT
Vary: Accept
X-Origin-Content-Length: 104248
X-Origin-Height: 1080
X-Origin-Width: 1920
X-Result-Height: 600
X-Result-Width: 800

body-bytes: 14814

IMGPROXY_USE_ETAG:true 时输出 ETag 头并支持条件请求。实测带 If-None-Match 请求返回 304 且零字节传输:

$ curl -sS -o /dev/null -D - -H "If-None-Match: \"6ade0950-19738\"" "http://127.0.0.1:8140/D0J1LxFduGjvsfIGlAocpMdUkGUSHn8gX0AqSQaRf48/rs:fill:800:600:1/aHR0cDovL29yaWdpbi9waG90by0xOTIweDEwODAuanBn.jpg"
HTTP/1.1 304 Not Modified
Cache-Control: max-age=86400, public
Etag: "6ade0950-19738"
Last-Modified: Sun, 25 Oct 2026 13:51:12 GMT

body-bytes: 

IMGPROXY_ENABLE_DEBUG_HEADERS:true 时输出 X-Origin-Width/Height、X-Result-Width/Height、X-Origin-Content-Length 调试头(以上回显中可见),排障期极有用。实测把 USE_ETAG 与 ENABLE_DEBUG_HEADERS 同设为 false 后,响应头收敛为最小集(无 ETag、无调试头):

HTTP/1.1 200 OK
Cache-Control: max-age=86400, public
Content-Disposition: inline; filename="photo-1920x1080.jpg"
Content-Length: 23416
Content-Type: image/jpeg
Last-Modified: Sun, 25 Oct 2026 13:51:12 GMT

body-bytes: 23416

💡 说明:ETag 内容派生自源图的 Last-Modified/大小等元信息(本例 "6ade0950-19738"),源图不变则 ETag 不变,CDN 回源校验可命中 304,显著节省回源带宽。生产建议 TTL 拉长(如 86400 以上)+ USE_ETAG=true,调试头在排障期过后关闭。

5.4 质量与格式:IMGPROXY_QUALITY / IMGPROXY_AUTO_WEBP / IMGPROXY_AUTO_AVIF

IMGPROXY_QUALITY(默认 80)是输出质量的默认值,URL 中 q: 选项可逐请求覆盖。实测同一张 1920×1080 原图、同为 fill 800×600:QUALITY=80 时输出 23416 字节;改为 QUALITY=50 后输出 14814 字节,体积降 36.7%。

IMGPROXY_AUTO_WEBP / IMGPROXY_AUTO_AVIF(默认 false)开启按请求 Accept 头的自动格式协商:URL 不带扩展名时,按客户端能力输出 JPEG/WebP/AVIF,并自动附加 Vary: Accept 保证缓存正确分叉。实测设置 IMGPROXY_AUTO_WEBP=true、IMGPROXY_AUTO_AVIF=true(TTL=600、QUALITY=50)后,同一条无扩展名 URL:

声明 Accept: image/jpeg 时:

HTTP/1.1 200 OK
Cache-Control: max-age=600, public
Content-Disposition: inline; filename="photo-1920x1080.jpg"
Content-Length: 14814
Content-Type: image/jpeg
Vary: Accept
X-Result-Height: 600
X-Result-Width: 800

body-bytes: 14814

声明 Accept: image/webp,image/* 时:

HTTP/1.1 200 OK
Cache-Control: max-age=600, public
Content-Disposition: inline; filename="photo-1920x1080.webp"
Content-Length: 10158
Content-Type: image/webp
Etag: "6ade0950-19738"
Last-Modified: Sun, 25 Oct 2026 13:51:12 GMT
Vary: Accept
X-Origin-Content-Length: 104248
X-Origin-Height: 1080
X-Origin-Width: 1920
X-Result-Height: 600
X-Result-Width: 800

body-bytes: 10158

声明 Accept: image/avif,image/* 时:

HTTP/1.1 200 OK
Cache-Control: max-age=600, public
Content-Disposition: inline; filename="photo-1920x1080.avif"
Content-Length: 9280
Content-Type: image/avif
Etag: "6ade0950-19738"
Last-Modified: Sun, 25 Oct 2026 13:51:12 GMT
Vary: Accept
X-Origin-Content-Length: 104248
X-Origin-Height: 1080
X-Origin-Width: 1920
X-Result-Height: 600
X-Result-Width: 800

body-bytes: 9280

同图同尺寸三种格式体积对比:JPEG 14814 B → WebP 10158 B(-31.4%)→ AVIF 9280 B(-37.4%)。零代码改动、仅靠两个开关即为现代浏览器省约三分之一图片流量,且 Vary: Accept 已自动带上,CDN 可安全按 Accept 分叉缓存。

💡 技术拓展:图片格式选型不止「能转就行」。常见输出格式对比——

格式压缩效率浏览器支持适用场景
JPEG基准全部兜底格式、照片
WebP比 JPEG 省约 30%全现代浏览器通用首选
AVIF比 JPEG 省约 35–50%现代浏览器(老旧终端无)流量敏感大图
PNG无损、体积大全部截图/透明底/图形
JXL高(无损+有损)支持面窄前瞻性归档/实验

本文自动协商采用「AVIF > WebP > JPEG 按 Accept 择优」,URL 固定扩展名(如 .webp)则强制单格式输出(实测见《imgproxy 4.0 API 使用详解》)。

5.5 安全上限:IMGPROXY_MAX_SRC_RESOLUTION / IMGPROXY_MAX_SRC_FILE_SIZE

这两个参数是防「解压炸弹」的硬闸门:攻击者即使拿到合法签名,也无法用超大原图耗尽解码内存。

IMGPROXY_MAX_SRC_RESOLUTION(默认 16.8,单位百万像素):原图宽×高超出即拒。实测临时调为 1(百万像素)做边界验证:1920×1080(约 2.07 MP)的远程图被 422 拒绝:

HTTP/1.1 422 Unprocessable Entity
Content-Type: text/plain
Content-Length: 20

body-bytes: 20

320×240(0.077 MP)的小图仍正常处理:

HTTP/1.1 200 OK
Cache-Control: max-age=86400, public
Content-Disposition: inline; filename="two-tone-320x240.jpg"
Content-Length: 4012
Content-Type: image/jpeg
X-Origin-Content-Length: 2352
X-Origin-Height: 240
X-Origin-Width: 320
X-Result-Height: 600
X-Result-Width: 800

body-bytes: 4012

IMGPROXY_MAX_SRC_FILE_SIZE(默认 0=不限,单位字节):原图体积超出即拒。实测设为 50000 后,104248 字节的 photo-1920x1080.jpg 被 422 拒绝,响应体明确为 Invalid source image:

HTTP/1.1 422 Unprocessable Entity
Content-Type: text/plain
Content-Length: 20

body: Invalid source image

💡 说明:生产建议显式设置这两个上限(如 MAX_SRC_RESOLUTION=50 即 50MP、MAX_SRC_FILE_SIZE 按业务原图量级设 10–50MB),不要依赖默认值——默认 16.8MP 对手机直出大图已偏紧,不限字节则给超大文件留了口子。

5.6 网络与超时:IMGPROXY_DOWNLOAD_TIMEOUT

IMGPROXY_DOWNLOAD_TIMEOUT(默认 5 秒)是拉取源图的总超时。源站慢/不可达时,该值决定请求挂起多久——过短会误杀慢源站,过长会堆积 worker。实测调为 1 秒后请求一个不可达源地址(http://10.255.255.1/slow.jpg,签名 URL 合法):

$ curl -sS -o /dev/null -D - -w 'time_total=%{time_total}s http_code=%{http_code}\n' "http://127.0.0.1:8140/AeAwK0YnAdIQd42tZtY-jbJNsEBg43KKqlSCxcheTaI/rs:fit:200:200:1/aHR0cDovLzEwLjI1NS4yNTUuMS9zbG93LmpwZw.jpg"
time_total=1.001502s http_code=504
HTTP/1.1 504 Gateway Timeout
Content-Type: text/plain
Content-Length: 21

body: Source is unreachable

1.00 秒整断开并返回 504,超时控制精确生效。生产建议保持默认 5 秒或更短,把慢源站问题暴露在监控里而不是用长超时掩盖。

5.7 水印:IMGPROXY_WATERMARK_PATH / IMGPROXY_WATERMARK_OPACITY

IMGPROXY_WATERMARK_PATH 指定水印图片路径(可为 local 路径或远程 URL),IMGPROXY_WATERMARK_OPACITY(默认 1)设默认不透明度;URL 中 wm: 选项控制开关、位置与缩放。基线设为 /images/watermark-300x120.png + 0.8 后,同一条 rs:fit:800:450 请求实测对照:

叠加水印(wm:0.5:soea:10:10:0.2,右下角、不透明度 0.5、按比例 0.2):

HTTP/1.1 200 OK
Cache-Control: max-age=86400, public
Content-Disposition: inline; filename="photo-1920x1080.jpg"
Content-Length: 19806
Content-Type: image/jpeg
X-Result-Height: 450
X-Result-Width: 800

不带 wm 选项的同图处理:

HTTP/1.1 200 OK
Cache-Control: max-age=86400, public
Content-Disposition: inline; filename="photo-1920x1080.jpg"
Content-Length: 18486
Content-Type: image/jpeg
X-Result-Height: 450
X-Result-Width: 800

两者尺寸一致(800×450),含水印版本大 1320 字节(水印叠加引入的额外像素信息)。注意水印不会在 URL 未声明 wm 选项时自动叠加——WATERMARK_PATH/OPACITY 只是提供素材与默认值,这为「同一图源按业务场景决定是否打水印」留了灵活性。

5.8 日志与可观测性:IMGPROXY_LOG_LEVEL / IMGPROXY_LOG_FORMAT / OpenTelemetry

imgproxy 默认向 stdout 输出文本日志(启动两行 INFO + 每请求一条),IMGPROXY_LOG_LEVEL(默认 info,可选 debug/warn/error)控制级别,IMGPROXY_LOG_FORMAT(默认 text,可选 json)切结构化输出便于采集。基线启动日志实测:

time="2026-10-25 16:05:25" level="INFO" msg="OpenTelemetry monitoring" enabled=false logs=false metrics=false
time="2026-10-25 16:05:25" level="INFO" msg="Source URL scheme registered, you can now use local:// source URLs" scheme="local"
time="2026-10-25 16:05:25" level="INFO" msg="Starting server at :8080"

⚠️ 注意:第一行 OpenTelemetry 显示 enabled=false——指标/追踪导出(Prometheus、OTLP 等 IMGPROXY_OPEN_TELEMETRY_* 族)主要属 Pro 版能力(开源/Pro 边界见《imgproxy 4.0 介绍与选型指南》2.2 节),开源版可观测性以日志 + 每请求响应头(X-Request-Id)为主。

六、生产配置模板

以下两套模板在本文基线上按场景调整,均为实测变量的组合(内存/磁盘占用以 libvips 流式管线的公开特征为参考:单请求处理内存数十 MB 级,imgproxy 自身无磁盘存储):

6.1 模板 A:中小站点源站一体机(1–2 vCPU / 2–4 GB 内存,本地图源)

IMGPROXY_KEY=<openssl rand -hex 32 生成>
IMGPROXY_SALT=<openssl rand -hex 32 生成>
IMGPROXY_LOCAL_FILESYSTEM_ROOT=/images
IMGPROXY_ALLOWED_SOURCES=http://origin,https://img.example.com
IMGPROXY_TTL=86400
IMGPROXY_QUALITY=80
IMGPROXY_AUTO_WEBP=true
IMGPROXY_AUTO_AVIF=true
IMGPROXY_USE_ETAG=true
IMGPROXY_MAX_SRC_RESOLUTION=50
IMGPROXY_MAX_SRC_FILE_SIZE=20971520
IMGPROXY_DOWNLOAD_TIMEOUT=5
IMGPROXY_ENABLE_DEBUG_HEADERS=false

要点:本地图源 + 白名单双收口;自动协商省流量;调试头关闭。

6.2 模板 B:CDN 前置的多实例处理层(4 vCPU+ / 8 GB+ 内存 ×N 实例,S3/远程图源)

IMGPROXY_KEY=<与模板 A 同一把或独立密钥对>
IMGPROXY_SALT=<配套盐>
IMGPROXY_ALLOWED_SOURCES=https://bucket.s3.amazonaws.com,https://cdn-origin.example.com
IMGPROXY_TTL=604800
IMGPROXY_QUALITY=80
IMGPROXY_AUTO_WEBP=true
IMGPROXY_AUTO_AVIF=true
IMGPROXY_USE_ETAG=true
IMGPROXY_MAX_SRC_RESOLUTION=80
IMGPROXY_MAX_SRC_FILE_SIZE=52428800
IMGPROXY_DOWNLOAD_TIMEOUT=5
IMGPROXY_WORKERS=8
IMGPROXY_REQUEST_QUEUE_SIZE=100
IMGPROXY_ENABLE_DEBUG_HEADERS=false
IMGPROXY_LOG_FORMAT=json

要点:TTL 拉长到 7 天配合 CDN 充分固化;WORKERS 按 vCPU×2 显式钉住、REQUEST_QUEUE_SIZE 给过载保护(超出即 429 快速失败,把回弹压力交给 CDN 重试);json 日志接采集管道;多实例挂同一密钥对水平扩展。

七、常见问题(FAQ)

Q1:改了 imgproxy.env 后请求行为没变? A:环境变量只在进程启动时读取。确认已重启 imgproxy 进程(systemctl restart imgproxy 后 imgproxy health 返回 imgproxy is running),再核对变量名拼写(官方清单区分极细,如 AUTO_AVIF 与 ENABLE_AVIF_DETECTION 是不同项)。

Q2:配置 KEY/SALT 后全部请求 403? A:URL 是用旧密钥/旧 SIGNATURE_SIZE 签的。用 5.1 节的算法按当前 KEY/SALT 重新生成;SIGNATURE_SIZE 非默认值时签名段需按该长度截短。

Q3:为什么同一 URL 有的客户端拿到 WebP 有的拿到 JPEG? A:AUTO_WEBP/AUTO_AVIF 开启后按请求 Accept 头分叉(5.4 节实测)。若前置缓存没透传/分叉 Accept,会出现串格式——确认响应含 Vary: Accept 且缓存层尊重该头。

Q4:大图 422 但小图正常? A:命中 MAX_SRC_RESOLUTION(百万像素)或 MAX_SRC_FILE_SIZE(字节)上限(5.5 节)。按业务原图分布上调,或在上传侧预压缩。

Q5:远程源偶发 504? A:DOWNLOAD_TIMEOUT 内拉不完(5.6 节实测超时精确生效)。先查源站慢日志/链路,再考虑调大超时;不建议超过 10 秒,否则 worker 被慢请求占满。

Q6:如何判断某个变量在 v4.0.19 是否存在? A:以官方 Configuration 页(见参考链接)为准,变量旁标注引入版本;写错名字的变量会被静默忽略(服务正常启动但不生效),改完务必用本文各节的验证手段实测确认。

八、参考链接