我正在建立一个照片网站,用户可以上传照片并稍后使用它查看。这些照片不是公开的和私人的。我正在S3中存储照片和缩略图。目前我所遵循的实现是,当用户访问页面时,我提供缩略图的签名网址并从S3加载(尽管我也在考虑使用来自cloudfront的签名网址)。
现在的问题是:
请帮助我采取我应该采取的方法,我希望页面加载时间快,并且还有安全问题。我还想知道,即使对于不同的签名网址,云端服务也会比浏览器缓存(我已经在某处读取)更快。 在答案中随意描述。
答案 0 :(得分:1)
我认为对你想要的东西没有一个完美的答案。一些随机的想法/权衡:
1)切换到HTTPS。这样你可以忽略人们嗅探URL。但是HTTPS项目无法在浏览器中缓存很长时间。
2)如果您要发出签名的网址,请不要设置expires =“time + 10m”,而是“时间+ 20m并且舍入到最接近的10m”。这样,URL将保持不变至少10米,浏览器可以缓存它们。 (确保还在S3中的文件上设置expires:headers,以便浏览器知道它们可以被缓存。)
3)您可以代理所有网址。让浏览器从您的服务器请求照片,然后编写Web代理以将请求代理到S3中的照片。在此过程中,您可以检查用户身份验证,为S3生成签名URL,甚至在本地缓存照片。)这对您来说似乎“效率低下”,但它允许浏览器根据需要缓存您的URL。这对您的用户来说也很方便,因为他们可以为照片网址添加书签,而且它始终有效。即使他们移动到另一台计算机,他们也会点击你的服务器,可以让他们在显示照片之前登录。
确保使用像Python Twisted或Node.js这样的“公平”服务器。这样,您可以同时代理数千张照片,而无需在服务器上使用大量内存/ CPU。 (您将使用大量带宽,因为所有数据都通过您的服务器。但您可以通过运行多个服务器轻松“扩展”。)
4)Cloudfront是一个缓存。第一次从CF服务器请求资源时,速度会慢一些(几百毫秒)。但是不要指望第二个请求被缓存!每个CF位置有大约20个不同的服务器,每次你都会随机点击一个。因此,请求10次照片可能会产生10次缓存未命中,并且您仍有50%的机会在下次请求时获得缓存命中。 CF仅适用于要求数百次的流行内容。 CF对外国用户有一定用处,因为私有CF-to-S3连接可能比普通互联网更好。
我不确定您将如何让CF为您进行安全检查。但是如果你通过S3 auth(不是默认值),那么你可以使用“mod 10分钟”技巧来制作可以缓存10分钟的URL。
CF不可能“比浏览器缓存更快”。但如果您不使用浏览器缓存,CF可能比S3快,但主要是在国外。
看看其他人做了什么(我认为smugmug使用S3。)