繁体   English   中英

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

[英]How to cache an AWS S3 file on a node.js server and serve it on request?

对于我的网站,我将所有assets (fonts / images / js等)部署到S3 bucket index.html (单页Ember.js应用程序)已部署在弹性beantalk node.js服务器上。 节点app.js接受对www.domain.com/*任何请求,并提供本地存储的index.html 我希望能够减少为每个生产版本将新应用程序部署到Elastic beantalk的过程,并只需将所有资产和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 (或其他快速的东西,例如Raikmemcache等)。

  1. 在服务器上运行Redis
  2. 从S3拉出文件时将文件存储到Redis中
  3. 设置为Redis后设置呼气时间
  4. 从S3重新拉出之前,请检查Redis以获取自定义密钥
    • 如果存在,请使用它并重置超时
    • 如果不是,请从S3重新推入(存储在Redis中并设置超时)

我不确定如果文件很大,它将如何响应,但是它仍然比每次从S3提取速度更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM