簡體   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