
用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 区分错误类型

评论(0)