【问题标题】:serving premium videos using ruby on rails使用 ruby​​ on rails 提供优质视频
【发布时间】:2015-01-26 06:11:25
【问题描述】:

我遇到了与性能相关的问题。我有一个在 VPS 上运行的 ROR 应用程序。在互联网上花了很多时间讨论这个问题并且无法找到可靠的解决方案后,我在这里发布了我的问题。 我的 ROR 应用程序有近 300 个优质 视频 和 200 个 pdf,注册后用户可以观看免费视频。如果用户通过付款升级帐户,则他/她可以观看优质视频。

目前我正在使用发送文件方法提供视频文件,下面是代码。

  SEND_FILE_METHOD = :default

  def download

    head(:not_found) and return if (track = Video.find_by_id(params[:id])).nil?
    #head(:forbidden) and return unless track.downloadable?(current_user) 

    path = track.video.path(params[:style])

    head(:bad_request) and return unless File.exist?(path) && params[:format].to_s == File.extname(path).gsub(/^\.+/, '')
    contenttype = MIME::Types.type_for(path).first.content_type # => "image/gif"
    send_file_options = { :type =>  contenttype  }

    case SEND_FILE_METHOD
      when :apache then send_file_options[:x_sendfile] = true
      when :nginx then head(:x_accel_redirect => path.gsub(Rails.root, ''), :content_type => send_file_options[:type]) and return
    end

    send_file(path, send_file_options)
  end

我的问题是,

  1. 通过 Rails 应用程序提供优质视频的正确方法是什么?(我的客户端 VPS 只有 1 GB RAM)并且视频保存在 VPS 上的文件系统中。我担心的是,如果我的应用程序一次收到超过 100 个请求,ROR 应用程序可能无法服务器请求。我也想过把它放在公共文件夹中,但是这些视频仅供付费用户使用,所以我不能将它们放在公共视频中。

任何帮助或解决方案的链接都非常感谢.. 非常感谢:)

【问题讨论】:

  • 请不要对短语使用任意粗体格式。它分散了问题的注意力。相反,看看大多数关于 SO 的问题是如何格式化并模仿的。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-3.1


【解决方案1】:

如果您真的想支持大量提供静态内容,请不要将负载放在您的网络服务器上,尤其是当它不是那么强大时。
为您的核心业务逻辑(例如管理帐户和权限)保留服务器资源,并将提供静态内容的服务委托给其他专用服务。

我只熟悉 AWS 套件,所以我可以推荐以下:

  • 对于 PDF(和其他文件)- 将它们存储在 AWS S3 并让您的应用程序指向该位置。您可以在自己的域中创建一个地址,并且可以为不同的客户生成单独的链接(具有过期时间),这样您就可以控制访问文件的人员和访问时间。
  • 对于视频 - 如果您将它们作为常规文件提供(例如下载 mp4) - 我会使用相同的 S3 解决方案。如果您打算将它们流式传输给客户 - 请查看 CloudFront Streaming
  • CloudFront(CDN 的 AWS 实施)通常是一个好主意,如果您有来自不同地区的客户,并且您希望从离他们最近的位置提供他们的内容。

至于价格 - 您可以在产品页面上查看。在我看来,它非常便宜,考虑到它为您提供的可扩展性,绝对物有所值。在开始使用他们的 API 时,您可能有一些学习曲线,但这并不难,而且有大量教程可供使用。

确实存在等效的解决方案(来自其他供应商)。我建议您四处看看,看看哪种最适合您。

祝你好运!

【讨论】:

  • 感谢您的宝贵意见,我同意您的话,但我的客户想使用 VPS 存储,因为它有很多免费存储空间。所以在这里发布了一个问题,但是如果没有办法可以,我最终会像你说的那样选择 AWS。再次感谢
  • 也许尝试向他解释,将 Internet 链接升级到他的 VPS 的成本将比使用 S3(或任何其他专用服务)高得多。如果您向其中添加任何 CDN(如 CloudFront),您的客户将从靠近他们的服务器下载文件,为此他将不得不租用服务器并维护世界各地的网络(如果他愿意的话)它自己)
  • 值得一提的是,S3 具有生成访问令牌的能力,该令牌可以配置为在一段时间后过期,以避免您的内容在不受您控制的情况下被共享。
【解决方案2】:

如果可能,您应该考虑使用类似于 S3 或 CDN 的东西(如果可能)。它们旨在快速将文件发送给客户,并且一旦您将文件交给他们,您的服务器上的负载就会为零。

如果您想坚持从您的 vps 提供文件,那么您应该查看 X-Sendfile (apache) 或 X-Accel-Redirect (nginx)。有了这些文件仍然由您的 VPS 提供,但它由 Web 服务器而不是您的 Rails 代码处理。

当您使用 send_file 时,Rails 会为您生成这些标头,但要使其正常工作,您需要适当地配置您的 Web 服务器。

在 apache 上这意味着安装 sendfile module,在 nginx 上你必须 configure 文件系统的哪些位是可访问的。 Rack::Sendfile 的代码(rails 使用的机制)解释了如何做到这一点

【讨论】:

    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多