Nginx image_filter模块支持实时图片处理,需编译启用;可缩放、裁剪、旋转、格式转换,不支持原生水印;须配合缓存与限流提升性能。

Nginx 的 image_filter 模块可直接在 Web 服务器层对图片进行轻量级实时处理,无需后端介入或提前生成缩略图。它支持裁剪、缩放、旋转(仅 90° 倍数)、格式转换和简单水印叠加,适合静态资源加速与响应式图片场景。
启用与基础配置
该模块默认不编译进 Nginx,需确认安装时已开启:--with-http_image_filter_module。Debian/Ubuntu 用户可通过 nginx-extras 包获取;CentOS/RHEL 需自行编译或使用 EPEL 提供的带模块版本。
在 location 块中启用处理逻辑,例如:
alias /var/www/images/;
image_filter resize 300 200;
image_filter_jpeg_quality 85;
}
注意:alias 路径必须以斜杠结尾,且文件需真实存在——image_filter 不支持动态生成源图,仅处理已存在的原始图片。
支持的图片操作类型
模块提供以下核心指令,可在同一 location 中组合使用(按顺序执行):
- resize width height:等比缩放至最大指定宽高(保持比例,不拉伸)
- crop width height:从原图中心裁切固定尺寸(超出部分被截断)
- rotate 90|180|270:仅支持 90° 整数倍旋转,性能开销低
- transparency off:禁用透明通道处理(对 PNG/GIF 有效,可提升 JPEG 兼容性)
例如实现「居中裁切 400×300 后转为 JPEG」:
image_filter_jpeg_quality 90;
image_filter_format jpeg;
添加文字或图片水印(需 patch 或替代方案)
官方 image_filter 不支持水印功能。所谓“水印”常被误传,实际是通过第三方补丁(如 cubicdaiya 分支)扩展了 watermark 指令,但稳定性与维护性有限。
更可靠的做法是:
- 用 Nginx + Lua(OpenResty)调用 GD/ImageMagick 进行复杂水印合成
- 将水印逻辑下沉至应用层(如 PHP/Python 生成带水印图片并缓存)
- 前端用 CSS 叠加半透明图层(适用于展示层,不改变原始资源)
若坚持使用补丁版,需注意其不兼容新版 Nginx,且无法处理透明度混合、字体抗锯齿等细节。
缓存与性能注意事项
处理结果默认不缓存,每次请求都会重新解码-变换-编码,CPU 开销明显。建议配合 proxy_cache 或 fastcgi_cache 缓存输出:
proxy_cache_use_stale error timeout updating;
add_header X-Image-Filtered "true";
同时限制请求频率防止滥用:
- 用
limit_req控制单 IP 图片处理请求数 - 禁止对非图片路径(如
/admin/)启用 filter - 设置
image_filter_buffer避免大图解码失败(默认 1MB,可调至 10MB)











