简短版本:如何"按需"制作签名URL,以使用Python模拟Nginx的X-Accel-Redirect行为(即保护下载)与Amazon CloudFront/S3.
我有一个Django服务器,并运行Nginx前端.我一直受到了对它的请求的打击,最近不得不将其安装为Tornado WSGI应用程序,以防止它在FastCGI模式下崩溃.
现在我遇到了一个问题,我的服务器陷入困境(因为它的大部分带宽正在用完),因为有太多的媒体请求,我一直在寻找CDN,我相信Amazon CloudFront/S3对我来说是合适的解决方案.
我一直在使用Nginx的X-Accel-Redirect标头来保护文件免受未经授权的下载,但我没有使用CloudFront/S3的能力 - 但是它们确实提供了签名的URL.到目前为止,我不是Python专家,并且肯定不知道如何正确创建签名URL,所以我希望有人可以获得如何"按需"制作这些URL的链接,或者愿意解释如何在这里,我们将不胜感激.
而且,这是正确的解决方案吗?我不太熟悉CDN,是否有更适合这种情况的CDN?
我有一个页面引用了几个外部托管的javascript文件 - 即Google上的jQuery和使用YUI Loader的YUI.
问题是当我通过HTTPS访问页面时,浏览器会抱怨混合不安全的内容,因为外部javascript文件是使用http而不是https访问的.
处理这个问题的好方法是什么,用HTTPS访问外部jQuery和YUI Loader对象?
在我的骨干应用程序中,我需要为每个所需文件提供一个后备,如果提供它们的CDN失败.
我试过require.onError像这样覆盖:
require.onError = function (err) {
if (err.requireType === 'timeout') {
var url = err.requireModules;
if (!!~url.indexOf("jquery/"))
console.warn("CDN timed out, falling back to local jQuery.js")
require(["libs/jquery"]);
return;
if (!!~url.indexOf("jqueryui/"))
console.warn("CDN timed out, falling back to local jQueryUI.js")
require(["libs/jqueryui"]);
return;
if (!!~url.indexOf("underscore"))
console.warn("CDN timed out, falling back to local underscore.js")
require(["libs/underscore"]);
return;
if (!!~url.indexOf("backbone"))
console.warn("CDN timed out, falling back to local backbone.js")
require(["libs/backbone"]);
return;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是这将异步加载回退文件.我需要按顺序加载这些文件,就像我使用order!插件的原始require语句一样.
使用被覆盖的onError:当CDN无法加载时,后备加载开始,但不等待.这提出了一个问题,因为脚本是根据它们的依赖性来加载的.以下是我原来的require陈述,取决于CDN:
require([
"order!http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js",
"order!http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js",
"order!http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js", …Run Code Online (Sandbox Code Playgroud) 使用Sass(SCSS)/ Compass,是否可以从外部托管文件中将一些CSS/SCSS导入到您的代码中?
我在CDN上托管一个jQuery插件,并希望将CSS保持在同一位置,所以我不会丢失它.但是,我也希望能够将CSS拉入我的代码并让它在我的主CSS中编译,而不是在我的HTML中添加额外的CSS文件.这可能吗?
我正在尝试在Bootstrap上使用CDN来提高我网站的性能.但是,当直接引用CSS时,它可以工作,而使用CDN则不然.
我将如何解决这个问题 - 我的代码是附加的.?
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<html>
<div class="navbar">
<div class="navbar-inner">
<a class="brand" href="#">Matt's Homepage</a>
<ul class="nav">
<li class="active"><a href="#">Home</a></li>
<li><a href="http://www.mattydb.com">Website</a></li>
<li><a href="http://www.twitter.com/akkatracker">Twitter</a></li>
</ul>
</div>
</div>
<div class="btn"><a href="http://www.mattydb.com">Click Here to Visit my Blog</a>
</div>
</html>
Run Code Online (Sandbox Code Playgroud) 我在2个网站上有2个不同的图像:
如果我有2个起源创建一个Amazon的Cloudfront分布:www.siteA.com和www.siteB.com,然后我呼吁uniqueDistributionID.cloudfront.net/avatar.png,然后avatar.png将被退回?中的一个siteA还是一个siteB?
为什么不呢?
试图了解Cloudfront发行版中冲突的可能性.
conflict cdn content-delivery-network name-conflict amazon-cloudfront
我有一个只有主页通过简单的HTTP协议提供的网站.所有其他页面只能通过HTTP over SSL(https://)访问.
我正在使用CDN作为主页,并对它非常满意.
但对我来说,由于安全警告,使用CDN for https页面似乎是不可能的,尤其是在IE中.我在CDN托管的文件可通过简单的HTTP协议访问.
我该怎么办?这个问题怎么解决?
我注意到,就在去年左右,许多主要网站对其网页结构的方式也做了同样的改变.每个人都将他们的Javascript文件从与页面本身(或其子域)相同的域托管到托管在不同命名的域上.
现在,有一种众所周知的技术可以跨多个域传播页面组件以并行化下载. 雅虎推荐它和许多其他人一样.例如,www.example.com是您托管HTML的地方,然后您将图像放在images.example.com和scripts.example.com上的javascripts上.这解决了这样一个事实,即大多数浏览器限制每台服务器的同时连接数,以便成为优秀的网民.
以上不是我所说的.
我所说的是专门在一个完全不同的域上托管Javascripts.让我具体一点.就在去年左右,我注意到了:
youtube.com已将其.JS文件移至ytimg.com
cnn.com已将其.JS文件移至cdn.turner.com
weather.com已将其.JS文件移至j.imwx.com
现在,我了解像Akamai这样专门为大型网站外包的内容交付网络.(特纳的特殊领域中的名称"cdn"在这里提醒我们这个概念的重要性).
但请注意,通过这些示例,每个站点都有自己专门为此目的注册的域,而不是内容交付网络或其他基础架构提供商的域.实际上,如果您尝试从大多数这些脚本域中加载主页,它们通常会重定向回公司的主域.如果您反向查找所涉及的IP,它们有时会出现在CDN公司的服务器上,有时则不然.
以前在两家不同的安全公司工作过,我已经变得偏执了恶意的Javascripts.
因此,我遵循白名单网站的做法,我将允许Javascript(以及其他活动内容,如Java)运行.因此,为了使像cnn.com这样的网站正常工作,我必须手动将cnn.com放入列表中.这是后面的痛苦,但我更喜欢它.
当人们使用诸如scripts.cnn.com之类的东西进行并行化时,通过适当的通配符可以很好地工作.当人们使用CDN公司域名下的子域名时,我可以在前面允许CDN公司的主域名使用通配符,并且一举杀死许多鸟类(例如*.edgesuite.net和*.akamai.com).
现在我发现(截至2008年)这还不够.现在我必须在我想要列入白名单的页面的源代码中查找,并找出该站点用于存储其Javascripts的"秘密"域(或域).在某些情况下,我发现我必须允许三个不同的域来使网站工作.
编辑:好的,因为"onebyone"指出,它确实似乎与CDN内容的传递有关.所以让我根据他的研究略微修改这个问题......
为什么weather.com使用j.imwx.com而不是twc.vo.llnwd.net?
为什么youtube.com使用s.ytimg.com而不是static.cache.l.google.com?
这背后有一个推理.
我正在使用ASP.NET MVC 4捆绑和缩小Microsoft.AspNet.Web.Optimization命名空间中的功能(例如@Styles.Render("~/content/static/css")).
我想将它与Windows Azure CDN结合使用.
我考虑编写自定义,BundleTransform但内容尚未优化.
我还研究了在运行时解析和上传优化的流,但这对我来说就像是一个黑客,我真的不喜欢它:
@StylesCdn.Render(Url.AbsoluteContent(
Styles.Url("~/content/static/css").ToString()
));
public static IHtmlString Render(string absolutePath)
{
// get the version hash
string versionHash = HttpUtility.ParseQueryString(
new Uri(absolutePath).Query
).Get("v");
// only parse and upload to CDN if version hash is different
if (versionHash != _versionHash)
{
_versionHash = versionHash;
WebClient client = new WebClient();
Stream stream = client.OpenRead(absolutePath);
UploadStreamToAzureCdn(stream);
}
var styleSheetLink = String.Format(
"<link href=\"{0}://{1}/{2}/{3}?v={4}\" rel=\"stylesheet\" type=\"text/css\" />",
cdnEndpointProtocol, cdnEndpointUrl, cdnContainer, cdnCssFileName, versionHash …Run Code Online (Sandbox Code Playgroud) cdn azure asp.net-mvc-4 bundling-and-minification asp.net-optimization
这是StackOverflow上经常讨论的问题,这意味着什么:
<script src="//cdn.example.com/somewhere/something.js"></script>
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,如果您通过HTTPS访问它,您将自动获得HTTPS,而不是那个可怕的"此页面上的不安全元素"警告.
但为什么要使用协议相对的URL呢?为什么不直接在CDN URL中使用HTTPS?毕竟,如果您决定通过HTTPS加载某些部分,HTTP页面没有理由抱怨.
(这更适用于CDN;几乎所有CDN都具有HTTPS功能.而您自己的服务器可能不一定具有HTTPS.)
cdn ×10
html ×2
https ×2
javascript ×2
azure ×1
compass-sass ×1
conflict ×1
css ×1
http ×1
jquery ×1
provisioning ×1
python ×1
relative-url ×1
requirejs ×1
sass ×1
ssl ×1
webserver ×1
whitelist ×1
yui ×1