【问题标题】:How to cache an AWS S3 file on a node.js server and serve it on request?如何在 node.js 服务器上缓存 AWS S3 文件并根据请求提供服务?
【发布时间】:2014-09-15 16:48:29
【问题描述】:

对于我的网站,我将所有 assets(字体/图像/js 等)部署到 S3 bucketindex.html(单页 Ember.js 应用程序)部署在弹性 beanstalk node.js 服务器上。节点app.js 接受对www.domain.com/* 的任何请求,并为本地存储的index.html 提供服务。我希望能够为每个生产构建削减将新应用程序部署到弹性 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 分钟到期。

谢谢!

【问题讨论】:

    标签: node.js amazon-web-services ember.js amazon-s3 ember-cli


    【解决方案1】:

    看看亚马逊的 CloudFront。对于您要完成的工作听起来很熟悉,即文件不必再次通过您的服务器。为您的整个页面加载的往返增加了一点。

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

    1. 在您的服务器上运行 Redis
    2. 从 S3 拉取文件时将文件存储到 Redis 中
    3. 保存到 Redis 后设置过期时间
    4. 在从 S3 重新拉取之前检查 Redis 的自定义键
      • 如果存在,使用它并重置超时
      • 如果没有,则从 S3 中退出(存储在 Redis 中并设置超时)

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

    【讨论】:

    • 我不熟悉 Redis 或其中的任何一个,您能否提供一个示例代码来说明如何实现这一点?抱歉,我对 node.js 很陌生!
    • 在这种情况下,我建议每次都将所有内容部署到弹性 beantalk。或者至少将您的项目分成两部分 - 服务器端和前端。在您熟悉您的系统并拥有一个完全可以工作的“东西”之前,不要担心优化。
    • 我现在已经成功设置了 redis。我遵循本教程medium.com/@feifanw/… 我可以获得最新的 index.html 键,因此可以获得最新的文件。您对提供接收到的 html 文件有明确的建议吗?
    • 这听起来像是一个新问题,因此请四处搜索,但您可以使用任何 http 框架(ExpressJS、Restify、Connect 等)来提供文件。您将在 http response 变量中提供文件 - 实际命令将取决于您的 http 框架。
    • 嘿,我设法让它与 express、aws-sdk 和 redis 一起用于 node。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多