内容提要
最近将Geeknote的图片处理换到了imgproxy,imgproxy是一个开源的图片处理引擎,可以替代ActiveStorage的图片处理。imgproxy的优势是将图片处理负载移出Rails进程,方便设置CDN,容易控制成本。配置imgproxy需要安装gem并在application.rb中添加配置。部署imgproxy可以使用fly.io,部署成功后添加环境变量并重启应用。imgproxy本身只处理图片,需要在其前面加CDN来处理缓存。以上是在生产环境使用imgproxy替代ActiveStorage图片处理的全过程。
延伸解读
从重定向到代理:图片处理责任的转移
ActiveStorage 默认返回重定向地址,由 Rails 进程即时处理图片变换并上传到云存储;而 imgproxy 返回代理地址,图片处理完全由 imgproxy 进程负责。这种转变将图片处理负载移出 Rails,使 Rails 更专注于应用逻辑,同时为后续 CDN 缓存和成本控制奠定基础。
配置要点:环境变量与加签密钥
启用 imgproxy 需在 Gemfile 添加 imgproxy-rails,并在 application.rb 中根据 IMGPROXY_ENDPOINT 环境变量切换路由。必须设置 IMGPROXY_ENDPOINT,推荐设置 IMGPROXY_KEY 和 IMGPROXY_SALT 用于加签,可选 IMGPROXY_USE_S3_URLS 缩短地址。这些配置确保 Rails 正确生成 imgproxy 地址并保证请求安全。
部署与缓存:fly.io 与 CDN 配合
使用 fly.io 部署 imgproxy 时,通过 fly launch 指定镜像并配置内部端口、自动启停等参数。部署后需添加与 Rails 配对的加签密钥及 S3 后端信息。注意 imgproxy 本身不处理缓存,必须在前端配置 CDN(如 Cloudflare 开启代理和缓存规则),避免每个请求都重新生成图片,从而提升性能并降低成本。
Q&A
imgproxy是什么,有什么优势?
imgproxy是一个开源的图片处理引擎,优势包括将图片处理负载移出Rails进程、方便设置CDN和容易控制成本。
如何在Rails中配置imgproxy?
在Gemfile中添加gem 'imgproxy-rails',并在application.rb中配置IMGPROXY_ENDPOINT等环境变量。
imgproxy与ActiveStorage的主要区别是什么?
imgproxy返回的是代理地址,处理图片的责任转移给imgproxy,而ActiveStorage返回重定向地址,Rails需处理图片变换。
如何部署imgproxy服务?
可以使用fly.io部署,创建应用并配置相关参数,执行部署命令后添加环境变量并重启应用。
使用imgproxy时,如何设置CDN?
在imgproxy前面加CDN,例如使用Cloudflare为imgproxy域名开启代理模式并设置缓存规则。
在生产环境中使用imgproxy的注意事项有哪些?
需要使用S3兼容服务进行测试,imgproxy本身不处理缓存,需在其前面加CDN以避免重复生成图片。