在轨道上使用红宝石提供优质视频

时间:2014-11-27 15:33:17

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

我遇到与性能相关的问题。我在 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上的 FILE SYSTEM 中。我担心的是,如果我的应用程序一次获得超过100个请求,ROR应用程序可能无法服务器请求。我还想把它放在公共文件夹中,但视频只适用于付费用户,所以我不能将它们放在公共视频中。
  2. 任何帮助或解决方案的链接都非常感谢.. 非常感谢:)

2 个答案:

答案 0 :(得分:2)

如果您确实希望支持大量提供静态内容,请不要将负载放在Web服务器上,特别是如果它不那么强大。
保留服务器资源以用于您的核心业务逻辑(如管理帐户和权限),并将服务静态内容委托给其他专用服务。

我只熟悉AWS套件,因此我可以推荐以下内容:

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

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

确实存在等效解决方案(来自其他供应商)。我建议四处寻找最适合你的。

祝你好运!

答案 1 :(得分:2)

如果可能,您应该考虑使用类似于S3或CDN的东西。这些内容旨在快速将文件提供给客户,并在您将文件传递给服务器后,将导致服务器零负载。

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

当您使用send_file时,Rails将使用为您生成这些标头,但为此,您需要适当地配置您的Web服务器。

在apache上,这意味着在nginx上安装sendfile module,你必须configure可以访问文件系统的哪些部分。 Rack::Sendfile的代码(rails使用的机制)解释了如何执行此操作