Nginx image_filter模块支持服务端动态图片处理,需手动编译启用,仅限JPEG/GIF/PNG;支持resize/crop/rotate等指令,可结合rewrite或Lua实现URL参数驱动裁切,但需注意CPU性能、安全限制与缓存优化。

Nginx 的 image_filter 模块可以实现在服务端对图片进行动态缩放、裁剪、旋转等操作,无需提前生成多套尺寸,节省存储空间并提升灵活性。但要注意:该模块默认不编译进 Nginx,需确认已启用,且仅支持 JPEG、GIF、PNG 格式。
确认模块是否可用
运行以下命令检查是否包含 image_filter:
nginx -V 2>&1 | grep -o with-http-image-filter-module
若无输出,说明未编译该模块,需重新编译 Nginx 并添加 --with-http-image-filter-module 参数。部分发行版(如 Ubuntu 的 apt 包)可能默认不启用,建议源码编译或使用 OpenResty 等集成版本。
基础配置与语法
在 location 块中启用图片处理,典型配置如下:
location ~* \.(jpg|jpeg|png|gif)$ {
expires 1h;
image_filter resize 300 200;
image_filter_jpeg_quality 95;
image_filter_sharpen 50;
}
常用指令说明:
- image_filter resize W H:等比缩放到最大宽高不超过指定值(保持比例,不拉伸)
- image_filter crop W H:从图片中心裁切固定尺寸(超出部分被截掉)
- image_filter rotate 90|180|270:顺时针旋转
- image_filter_jpeg_quality:设置 JPEG 输出质量(1–100)
- image_filter_sharpen:锐化强度(0–100),增强边缘清晰度
实现 URL 驱动的动态裁切
纯靠配置无法做到“按 URL 参数实时裁切”,需结合 rewrite + 变量提取。例如将 /img/example.jpg?w=400&h=300&crop=1 映射为裁切操作:
location ~* ^/img/(.+\.jpe?g|png|gif)$ {
set $img_path $1;
set $img_w 0;
set $img_h 0;
set $img_crop 0;
if ($args ~* "w=(\d+)&h=(\d+)") {
set $img_w $1;
set $img_h $2;
set $img_crop 1;
}
if ($img_w != 0 && $img_h != 0) {
image_filter crop $img_w $img_h;
}
alias /data/images/$img_path;
}
注意:if 在 location 中有局限性,复杂逻辑建议用 Lua(via lua-nginx-module)或前置网关处理参数解析。
安全与性能注意事项
image_filter 是 CPU 密集型操作,高并发下易成为瓶颈:
- 禁止对未授权或任意外部 URL 执行处理(防止 SSRF 或 DoS 攻击)
- 限制输入尺寸(如
image_filter_buffer 10M,防超大图耗尽内存) - 搭配缓存(proxy_cache 或 fastcgi_cache)避免重复处理同一请求
- 生产环境建议只对白名单路径或特定子域名启用,避免全站图片都走处理流程
不复杂但容易忽略。










