如何在Heroku上使用REST API后端优化提供静态文件

时间:2012-04-25 14:12:53

标签: rest heroku proxy nginx

这个问题可能有些主观,但我认为这将为代理heroku和调试延迟问题提供一些有价值的具体信息和解决方案。

我有一个使用Sinatra / Mongo构建的应用程序,它在api.example.com上公开了一个REST API。它在Heroku Cedar上。通常我通过www的nginx提供静态文件,并通过api子域向/ api提供代理请求,以避免跨域浏览器投诉。我有一个机架空间云实例,所以我将前端临时放在nginx上并设置代理。现在,代理时延迟是可怕的,每3或4次请求需要超过1分钟,否则大约150ms。直接进入API(浏览器到api.example.com)时,平均延迟约为40毫秒。虽然我知道设置并不理想,但我没想到它会那么糟糕。

我认为这部分是由于从机架空间代理 - 服务器可能在西海岸 - 在亚马逊ec2东部的heroku。我的想法是,获取一个亚马逊ec2实例并将其代理到我的heroku应用程序可以缓解这个问题,但我想以某种方式验证这一点,而不是盲目猜测(它也更昂贵)。有没有合理的方法来确定长延迟的来源?另外,关于如何构建此应用程序的任何其他建议?我知道我可以在Heroku上提供静态文件,但我不喜欢我的API服务于我的前端的想法,而是希望它们能够彼此独立扩展。

1 个答案:

答案 0 :(得分:3)

由于您正在使用Heroku运行API,我建议将静态文件放入Amazon S3存储桶,名为“myapp-static”,然后使用Amazon Cloudfront通过DNS CNAME记录(static.myapp.com)代理您的静态文件。

在Rackspace上使用S3有什么好处:

  • 您的文件从Heroku上传的速度会更快,因为您的应用和存储都位于同一网络(AWS)上。
  • S3是为直接提供静态文件而构建的,没有运行自己的服务器代理请求的开销。

使用Cloudfront的好处在于,它会根据您的需要缓存静态文件(减少多个HTTP请求),并从最靠近用户的端点提供文件。 EG:如果加利福尼亚州的用户发出API请求并从您那里获取静态文件,那么它将从AWS California服务器提供,而不是您的East Coast Heroku实例。

最后,您在应用程序端执行的操作是将用户LINK发送到REST API中的静态资产(例如:http://static.myapp.com/images/background.png),这样客户端就可以直接下载内容,并且能够尽快下载资产。