Nginx搭图片服务器关键三点:路径映射要准(root指定根目录并确保读权限)、传输效率要高(开启sendfile on和tcp_nopush on)、资源不能被白嫖(配置valid_referers防盗链或secure_link签名链接)。

用Nginx搭图片服务器不难,关键在三点:路径映射要准、传输效率要高、资源不能被白嫖。下面直接说实用配置,不绕弯。
基础服务搭建:让图片能被正确访问
Nginx本身处理静态文件极快,核心是把URL请求准确落到磁盘路径上。
-
root指令定根目录:比如设为
/data/images,那么访问/uploads/logo.png就会自动去找/data/images/uploads/logo.png -
权限别漏掉:确保 Nginx 工作进程用户(如
nginx或www-data)对整个图片目录有读取权限,否则 403 错误马上出现 -
开启 sendfile:加上
sendfile on;和tcp_nopush on;,让内核直接搬运文件,省掉用户态拷贝,吞吐翻倍
性能再提速:压缩与缓存必须开
图片体积大、复用率高,不压不缓存,带宽和CPU都扛不住。
-
Gzip 压缩 SVG 和 PNG 原图很有效:即使 JPEG 是有损压缩,SVG、PNG 源文件或未压缩的 WebP 仍可被 gzip 缩减 30%–60%,配置中记得加入
image/svg+xml和image/png -
强缓存设长一点:对不变的图片,加
expires 1y;或add_header Cache-Control "public, max-age=31536000";,浏览器一年内都不再发请求 -
避免小文件压缩拖后腿:设
gzip_min_length 1k;,太小的文件压缩反而增加 CPU 开销
防盗链配置:防普通盗链够用,别信 Referer 绝对安全
Referer 验证是最常用、最易配的方式,适合挡住大部分“右键另存为”式盗链。
-
匹配图片后缀更精准:用正则 location,比如
location ~* \.(jpg|jpeg|png|gif|webp)$,只对图片生效,不影响其他资源 -
valid_referers 白名单写全:至少包含
none(直接访问)、blocked(代理清空 Referer)、server_names(本域名)和*.yourdomain.com(子域名) -
拒绝方式选 return 403 更干净:比跳转提示图更省资源;若需友好提示,可配
rewrite ^/.*$ /res/hotlink-denied.jpg break;,但要确保该提示图本身不防盗链(放在独立 location 或放开 referer)
进阶防护:签名链接防专业盗链
当 Referer 可被伪造、需控制单个链接有效期时,用 secure_link 模块。
-
编译时必须启用模块:安装 Nginx 时加
--with-http_secure_link_module,否则配置无效 -
链接格式固定:例如
/img/photo.jpg?md5=abc123&expires=1745200000,其中 md5 是按secret + URI + expires算出的哈希值 -
校验失败有明确返回码:
$secure_link为空表示哈希错,为0表示过期,为1才放行,可分别用return 402或405区分错误类型



















