Paperclip + Rails 与负载平衡机器
Posted
技术标签:
【中文标题】Paperclip + Rails 与负载平衡机器【英文标题】:Paperclip + Rails with load balanced machines 【发布时间】:2012-11-15 15:50:29 【问题描述】:如何让 Paperclip 图像上传在运行在 8 台机器上的 Rails 应用程序(负载平衡)上工作?
用户可以在应用上上传图片。图像存储在其中一台机器上。用户稍后请求图像,但未找到,因为它是从另一台机器请求的。
此类问题的解决方法是什么?我不能使用 AWS 或任何云服务;图像必须在内部存储。
谢谢。
【问题讨论】:
如果您不能使用 AWS,则必须将图像放入数据库或您自己的文件存储解决方案中。将它们存储在您的应用程序服务器上是不行的。如果您丢失了其中一台机器,您就丢失了图像。 【参考方案1】:一种解决方案是使用 NFS 挂载一个共享文件夹,该文件夹将成为您的 public/system
的根目录,或者您所称的包含回形针图像的文件夹。
要让一切正常工作,需要考虑一些事项:
使用仅包含资产的专用服务器,这样您的硬盘驱动器专用于为您的回形针图像提供服务 NFS 可能很昂贵。使用它仅将文件从您的应用服务器写入您的资产服务器。您必须配置负载均衡器或反向代理或 Web 服务器,以直接从资产服务器检索所有图像,而无需要求应用程序服务器通过 NFS 执行此操作。 当然建议在您的资产服务器上使用 RAID 系统 推荐第二个资产服务器,具有相同的规格。你可以让它充当备份服务器,并定期将你的回形针图像同步到它。如果主资产服务器出现故障,您将能够切换到此服务器。 挂载共享 NFS 文件夹时,使用soft
选项,并通过高速本地网络连接挂载,例如:mount -o soft 10.0.0.1:/export/shared_image_folder
。如果您没有指定 soft
选项,并且资产服务器出现故障,您的 Ruby 实例将继续等待服务器启动。一切都会卡住,网站会往下看。艰难地学会了这一点...
这些是使用 NFS 的一般准则。我在一个包含数十万张图片的大型制作网站上使用它,它对我来说效果很好。
【讨论】:
如何指示 Paperclip 将文件写入共享的挂载文件夹,例如从 machine1 中? 您必须mount
共享 NFS 文件夹。在 linux 中,mount
将尝试使用 NFS 挂载网络文件夹,将编辑我的答案。当然,您必须先设置您的 nfs 服务器,然后根据您的发行版安装所需的软件包【参考方案2】:
如果您不想使用像 NFS 这样的文件共享,您可以将图像存储在数据库中。这是一个为 Paperclip 提供 :database
存储类型的 gem:
https://github.com/softace/paperclip_database
【讨论】:
以上是关于Paperclip + Rails 与负载平衡机器的主要内容,如果未能解决你的问题,请参考以下文章
Rails 3 和 Paperclip:“'identify' 命令无法识别”
如何直接从 ZipEntry(RubyZip、Paperclip、Rails 3)获取临时文件对象(内容类型正确,无需写入磁盘)?