我遇到与性能相关的问题。我在 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
我的问题是,
任何帮助或解决方案的链接都非常感谢.. 非常感谢:)
答案 0 :(得分:2)
如果您确实希望支持大量提供静态内容,请不要将负载放在Web服务器上,特别是如果它不那么强大。
保留服务器资源以用于您的核心业务逻辑(如管理帐户和权限),并将服务静态内容委托给其他专用服务。
我只熟悉AWS套件,因此我可以推荐以下内容:
至于价格 - 您可以在产品页面上看到。在我看来这很便宜,考虑到它给你的可扩展性,绝对物有所值。您可能在开始时有一些学习曲线开始使用他们的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使用的机制)解释了如何执行此操作