如何在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应用程序)部署在弹性beanstalknode.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
,等等)
- 如果存在,请使用它并重置超时
- 如果没有,则从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一起工作。谢谢你的帮助!