2013-02-07 70 views
3

我最近在AppFog上部署了我的Node.js博客。我打算在Amazon S3上使用一個存儲桶來流式傳輸我的資源(javascript/stylesheets/images)。使用Express.js從Amazon S3流式傳輸資產(JS/CSS /圖像)

如何確保Express.js獲取靜態資產到我的Amazon S3存儲桶而不是常規的/public

+0

爲什麼不公開存儲桶並直接鏈接到//s3.amazonaws.com/bucketname/filename.ext上的資產? – josh3736

+0

你是什麼意思?我正在使用像/ images/2012 /這樣的網址遷移我的舊網站...我無法更改路徑。 – jpmonette

+0

我已經添加了一個解釋我的意思的答案。爲什麼你不能改變路徑? – josh3736

回答

8

我不會通過節點服務器–流的資產是資源的浪費,而且你將有處理HTTP緩存頭。

相反,您的HTML應直接鏈接到S3存儲桶。相反的:

<script src="/js/script.js"></script> 

務必:

<script src="//s3.amazonaws.com/bucket/js/script.js"></script> 

既然你要遷移,只需建立一個永久重定向。

app.get(/^\/(js|css|images)\/.*/, function(req, res) { 
    res.redirect(301, '//s3.amazonaws.com/bucket' + req.path); 
}); 

這會將js,css和images文件夾中的所有請求重定向到S3存儲桶。例如,/js/script.js會重定向到//s3.amazonaws.com/bucket/js/script.js。

這將有助於簡化轉換,但您仍應將網站的引用遷移到S3網址,以消除因重定向而導致的不必要的HTTP往返操作。

+0

所以你不會流的原因是它會浪費S3帶寬+我的SaaS帶寬,對不對? 此外,這是一個很好的做法,設置每個圖像/ js/css那裏? – jpmonette

+0

這就是其中一個原因。如果您沒有在節點服務器上使用任何緩存機制(這對於正確使用這些緩存機制並不重要),那麼對資產的每個請求都將傳送到您的服務器,然後您將傳送到S3服務器。您支付從S3傳輸到節點的字節,然後再爲節點傳輸到客戶端。另一個重要原因是客戶端可用性:您是否準備好處理諸如「ETag」,「I​​f-None-Match」和相關頭文件等內容?這些通常由'static'爲你處理,而S3也負責處理它們。請記住爲S3對象設置「Cache-Control」標頭。 – josh3736

+0

謝謝@ josh3736! – jpmonette

相關問題