如何在node.js服务器上缓存AWS S3文件并根据请求提供服务?

如何在node.js服务器上缓存AWS S3文件并根据请求提供服务?,node.js,amazon-web-services,ember.js,amazon-s3,ember-cli,Node.js,Amazon Web Services,Ember.js,Amazon S3,Ember Cli,对于我的网站,我正在将所有资产(字体/图像/js等)部署到S3存储桶。index.html(一个单页的Ember.js应用程序)部署在弹性beanstalknode.js服务器上。节点app.js接受对www.domain.com/*的任何请求,并提供本地存储的index.html。我希望能够为每一个生产构建省去将新应用程序部署到elastic beanstalk的过程,只需将所有资产和index.html部署到S3 bucket 这就是我到目前为止所做的: var AWS = require(

对于我的网站,我正在将所有
资产
(字体/图像/js等)部署到
S3存储桶
index.html
(一个单页的Ember.js应用程序)部署在弹性beanstalk
node.js
服务器上。节点
app.js
接受对
www.domain.com/*
的任何请求,并提供本地存储的
index.html
。我希望能够为每一个生产构建省去将新应用程序部署到elastic beanstalk的过程,只需将所有资产和
index.html
部署到
S3 bucket

这就是我到目前为止所做的:

var AWS = require('aws-sdk'),
    fs = require('fs');
/*
 * AWS Security credentials
 */
AWS.config.loadFromPath('./config.json');

var port = process.env.PORT || 3000,
    http = require("http");

var static = require('node-static');


/*
* Create a node-static server instance
* to serve the './public' folder
*/
var file = new static.Server();

/*
 * Fetch .index.html from S3
 * and cache it locally
 */
var s3 = new AWS.S3();
var params = {Bucket: 'assets', Key: 'index.html'};
var file = fs.createWriteStream('index.html');

s3.getObject(params).
    on('httpData', function(chunk) { file.write(chunk); }).
    on('httpDone', function() { file.end(); }).
    send();

var server = http.createServer(function (request, response) {
    request.addListener('end', function () {
        file.serveFile('index.html', 200, {}, request, response);
    }).resume();
}).listen(port);
我假设只有在服务器第一次启动时,才会从S3获取
index.html
。缓存的最佳实践是什么,最好是1分钟到期


谢谢

看看亚马逊的CloudFront。听起来很熟悉您试图完成的任务,即文件不必再次通过您的服务器。在整个页面加载的往返过程中添加一点内容

这就是说,要在本地缓存,您可以将整个文件存储在
Redis
(或者类似的其他快捷方式,
Raik
memcache
,等等)

  • 在服务器上运行Redis
  • 从S3中提取文件时将其存储到Redis中
  • 设置保存到Redis后的呼气时间
  • 在从S3重新提取之前,请检查Redis中的自定义密钥
    • 如果存在,请使用它并重置超时
    • 如果没有,则从S3重新调用(存储在Redis中并设置超时)

  • 如果文件很大,我不确定这会有什么反应,但它仍然比每次从S3中提取要快。

    我不熟悉Redis或其中任何一种,你能给出一个如何实现这一点的示例代码吗?很抱歉,我是node.js的新手!在这种情况下,我建议每次都将所有内容部署到elastic beanstalk。或者至少把你的项目分成两部分——服务器端和前端。在您熟悉您的系统并拥有一个完全正常工作的“东西”之前,不要担心优化。我现在已经成功地设置了redis。按照本教程,我可以获得最新的index.html键,从而获得最新的文件。你有没有一个干净的建议来为收到的html文件提供服务?这听起来像是一个新问题,所以四处搜索,但你会用你的http框架(ExpressJS、Restify、Connect等)来为文件提供服务。您将在http
    response
    变量中提供该文件-实际的命令将取决于您的http框架。嘿,我设法让它与express、aws sdk和redis for node一起工作。谢谢你的帮助!