我最近在AppFog上部署了我的Node.js博客。我打算在Amazon S3上使用一個存儲桶來流式傳輸我的資源(javascript/stylesheets/images)。使用Express.js從Amazon S3流式傳輸資產(JS/CSS /圖像)
如何確保Express.js獲取靜態資產到我的Amazon S3存儲桶而不是常規的/public
?
我最近在AppFog上部署了我的Node.js博客。我打算在Amazon S3上使用一個存儲桶來流式傳輸我的資源(javascript/stylesheets/images)。使用Express.js從Amazon S3流式傳輸資產(JS/CSS /圖像)
如何確保Express.js獲取靜態資產到我的Amazon S3存儲桶而不是常規的/public
?
我不會通過節點服務器–流的資產是資源的浪費,而且你將有處理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往返操作。
所以你不會流的原因是它會浪費S3帶寬+我的SaaS帶寬,對不對? 此外,這是一個很好的做法,設置每個圖像/ js/css那裏? – jpmonette
這就是其中一個原因。如果您沒有在節點服務器上使用任何緩存機制(這對於正確使用這些緩存機制並不重要),那麼對資產的每個請求都將傳送到您的服務器,然後您將傳送到S3服務器。您支付從S3傳輸到節點的字節,然後再爲節點傳輸到客戶端。另一個重要原因是客戶端可用性:您是否準備好處理諸如「ETag」,「If-None-Match」和相關頭文件等內容?這些通常由'static'爲你處理,而S3也負責處理它們。請記住爲S3對象設置「Cache-Control」標頭。 – josh3736
謝謝@ josh3736! – jpmonette
如果你真的需要做到這一點,從請求庫使用管道():https://github.com/mikeal/request#streaming
爲什麼不公開存儲桶並直接鏈接到//s3.amazonaws.com/bucketname/filename.ext上的資產? – josh3736
你是什麼意思?我正在使用像/ images/2012 /這樣的網址遷移我的舊網站...我無法更改路徑。 – jpmonette
我已經添加了一個解釋我的意思的答案。爲什麼你不能改變路徑? – josh3736