深入了解 Windows Azure

使用 Node.js 媒体代理对视频 Blob 进行地理保护

Bruno Terkaly
Ricardo Villalobos

下载代码示例

Bruno Terkaly, Ricardo VillalobosWindows Azure 提供其云存储系统的三个有用选项:表、 blob,队列和队列,所有由备份冗余和有弹性的全球基础设施。我们一家在表在我们最后一列 (msdn.microsoft.com/magazine/dn166928) ; 现在我们会侧重 blob,特别是关于如何解决在使用它们时可能会出现的某些安全问题。

Blob 用来存储二进制数据,和 Windows Azure 为您提供了两种类型可供选择:页面 blob,其中用于进行随机数据的访问和可达 1 TB ; 和块blob,而经过优化的上传和流媒体的目的,并且可以包含最多 200 GB 的数据。Blob 被用作 Windows Azure,包括操作系统格式化磁盘和视频资产中的很多服务的基础。就性能而言,每个 blob 的吞吐量目标是达 60 MB/s。图 1显示了如何结构化、 分区和访问 blob 存储。


图 1 Windows Azure Blob 存储概念

Blob 暴露在外界通过 HTTP 和 HTTPS 协议,并且可以是公共或私人。当 blob 被标记为私有时,基于策略共享访问签名 (URL) 用于为一特定的时间内授予访问特定的 blob,或任何指定的容器内的 blob。一旦为特定 blob 的 URL 已知的然而,防止对它的访问的唯一方法是通过修改、 过期或删除相应的安全策略。

这种情况的一些使用情况,例如限制访问视频资产时的 blob 的 URL 需要公开共享流媒体的目的是一个挑战。两个常见级别往往是保护的必需的:地理位置的访问,限制的国家或地区哪里可以播放视频 ; 和推荐人访问,这将限制的域或哪里可以嵌入视频的 Web 站点。这是特别重要的是为获得数字权利以广播事件 (如奥运会或足球世界杯) 在特定国家的媒体公司以及创建基于位置的广告营销机构。

在这篇文章,我们将为你展示如何在 Windows Azure,提供了对这些安全要求的解决方案中创建反向代理服务器,如中所示图 2


图 2 为视频资产使用反向代理服务器提供土力工程处保护

我们的解决方案,我们会使用 Node.js,强大的服务器端基于 JavaScript 的平台我们在上一个专栏中讨论了 (在看到"真实世界的情况为 Node.js 在 Windows Azure" msdn.microsoft.com/magazine/jj991974)。使用 Node.js 的原因很简单:它需要极少的内存和 CPU 使用同时支持数以千计的每个服务器的连接。并由我们应用部署到 Windows Azure,我们可以根据需要扩展,基于的交通和需求。这里是我们会遵循的基本流程:

  1. 捕获原始请求可嵌入一个视频从 Web 服务器所生成的远程客户端。
  2. 确定的推荐人页和验证域授权要嵌入视频。
  3. 标识请求源自于该国,并验证它授权。
  4. 如果满足所有条件,则流到客户端的视频。
  5. 如果不是所有条件都满足,流视频显示一条错误消息。

我们将使用以下的云资源来使我们的工作的解决方案:

  • Windows Azure 媒体服务生成的视频的资产,在代码中使用。
  • Windows Azure 表来存储授权的国家和引用的列表。
  • MongoDB (mongodb.org) IP 地理位置数据库的宿主。
  • Windows Azure 网站主办 Node.js 反向代理服务器和示例 Web 页。

承载 Windows Azure 中的视频内容

在开始之前,您需要上传和对用于测试目的的云在一些视频内容进行编码。您可以通过登录到 Windows Azure 门户轻易做到这 manage.windows­azure.com ,然后单击媒体服务。(对媒体服务的详细信息,请参阅我们的 2012 年 6 月文章,"民主化视频内容与 Windows Azure 媒体服务,"在 msdn.microsoft.com/magazine/jj133821.)如果你没有一个订阅,您可以请求在试用帐号 bit.ly/YCNEd3。对于本示例,我们上传和编码三个视频,如中所示图 3


在该示例中使用的图 3 视频资产

关联的每个视频的发布 URL 链接允许他们将演奏和嵌入在其他网页中。我们的代理服务器将使用这些链接可将媒体内容传输到世界各地的观众后验证的位置和发出请求的页。

存储在 Windows Azure 表存储中的验证信息

下一步是在验证过程将帮助的 Windows Azure 存储中创建几个表。正如我们解释在我们以前的专栏中,这些表严格基于键-值对,但是他们服务我们为这一项目的目的。图 4 描述表的结构。

图 4 存储表结构的视频内容

proxycountries

PartitionKey:国家缩写

RowKey:"真实"或者"false"(访问)

proxyreferrers

PartitionKey:视频所在的域

RowKey:"真实"或者"false"(访问)

proxyvideos

PartitionKey:视频资产的友好名称

RowKey:编码格式

URL:发布视频资产在媒体服务的 URL

proxyrejects

PartitionKey:"错误"或者"拒绝"

RowKey:错误或拒绝的类别

说明:错误或拒绝的详细信息

您可以在使用其中一个可用的免费工具下载的 Windows Azure 存储中创建这些表。我们特别喜欢 Azure 存储资源管理器从 Neudesic,可从在 CodePlex 下载 bit.ly/H3rOC。基本的功能,你会需要的 proxycountries 和 proxyreferrers 的表中插入至少一个实体,与 PartitionKey ="未定义"和 RowKey ="true"。这允许您测试您 Node.js 媒体代理服务器本地。在上个月的文章中,我们讨论了选择正确的分区和行键以获得最佳查询性能的重要性。

准备地理定位数据库

有几个公司提供的数据库和地理定位目的服务。MaxMind 就是其中之一,并因为公司提供了一个 GeoLite 版本,可以使用创作共用许可下,我们决定将它列入我们的项目。可以从下载的 CSV 文件 bit.ly/W5Z7qA。此数据库使我们能够识别视频请求来自哪里,这个国家的基础的 IP 地址。

我们下一个决定参与主办此数据库在云计算中的位置。因为我们会需要 (本身不支持的 Windows Azure 表存储) 此表执行范围的搜索,我们选择使用 MongoDB,开放源码面向文档 (JSON) 数据库引擎开发并支持 10gen。MongoDB 支持多个索引和复杂的查询,这是我们的解决方案的理想选择。好消息是有几个公司提供此数据库作为一种服务,其中包括 MongoLab,在 Windows Azure 存储区中可用。您还可以注册的帐户 mongolab.com,选择 Windows Azure 作为您的宿主提供商。请确保选择同一个数据中心创建的 Windows Azure 存储表的位置。

当创建了 MongoDB 数据库时,您可以访问它使用类似于下面的 URL:

 

mongodb://{username}:{password}!@{server_name}.mongolab.com:{port_number}/{database_name}

MaxMind CSV 文件导入您的数据库,只需下载 MongoDB 工具从 mongodb.org/downloads。 一旦你已经在您的计算机上安装它们,请运行以下命令:

mongoimport -h {servername}.mongolab.com:{port_number} -d {database_name} -c {collection_name} -u {username} -p {password} --file {MaxMind CSV file} --type csv --headerline

现在你可以针对地理定位数据库运行查询。

审查的源代码

如果您还没有,请下载的这篇文章的源代码 archive.msdn.microsoft.com/mag201305AzureInsidr。 该代码由三个不同的文件组成:server.js、 config.json 和 package.json。

代码的主要部分是在 server.js,在那里你会看到几个模块中的第一个行定义 (他们会自动下载并安装以后从 npmjs.org):

  1. 请求:简化了发送和流到外部网站请求的过程。
  2. azure:提供对 Windows Azure 存储,包括表的访问。
  3. url:便于解析的 URL 字符串。
  4. mongodb:提供对 MongoDB 数据库的访问。
  5. nconf:简化了设置和检索应用程序设置的过程。

此外,在后面这种格式的代码的第一部分中设置几个变量:

var port = process.env.PORT || nconf.get("PORT_NUMBER");

这允许它们的值来检索从 (一次部署到云环境) 的 Windows Azure 网站配置参数,或从当地的 config.json 文件 (如果该参数不能在 Windows Azure 环境中找到)。 最后,为 Windows Azure 表创建一个客户端、 定义中的后续请求的默认代理程序和下面的初始化代码中所示的错误日志记录对象的占位符为 null,实例化:

// Create Windows Azure Storage Table clientconsole.log('Connecting to Windows Azure Table Service'); var tableService = azure.createTableService(storageServiceName,   storageKey, storageServiceUrl); // Create custom agent for requests; number of sockets can be tweaked var agent = new http.Agent();agent.maxSockets = 1000; // Placeholder for errorEntity objectvar errorEntity = null;

一旦已执行的初始化过程,它是与它对应的回调函数在 Node.js,创建一个 HTTP 服务器的时间。 在高级别的伪代码的基本瀑布结构 — — 来自 Node.js—looks 这样的异步的、 基于事件的性质:

Create HTTP Server (request, response) {callback to}   Find the page where the video is hosted, using the http-referer header value   Find the origin IP address by using the x-forwarded-for header value   Split the request URL to find the video-friendly name and encoding     {callback to}       Query the proxyreferrers table for validation         {callback to}           Query the MongoDB database to find the request country             {callback to}               Query the proxycountries table for validation                 {callback to}                   Stream the video using the request function

你会发现详细信息中包含的源代码,但我们想要突出显示的几个方面:

  • 来源 IP 地址被转换成整数编号使用由 MaxMind 定义的公式 (bit.ly/15xuuJE)。 这个号码然后在下面的查询使用 MongoDB 数据库中查找相应的国家:
{ convstart: { $lte: ipValue }, convend: { $gte: ipValue } }

IpValue 与 convstart (小于或等于) 和 MaxMind 表中提供的 convend (大于或等于) 列之间定义的范围进行比较。 如果找不到值,该国将设置为"未定义"。

  • 主要流过程中请求命令里面函数 streamVideo,看起来像这样:
request({options},{callback_function}).pipe(resp);

由于该请求模块,简化了此过程,数据发送回客户端,在收到时,用管道直接输送回客户端。 这将我们反向代理变成一个快速、 高效的应用程序。 (在选择的选项的完整代码中找到) 保持头是极其重要的通过保持连接的客户端/服务器连接打开跨多个请求到服务器提高服务器性能。

测试本地的反向代理服务器

您可以从 nodejs.org 下载,Node.js 安装程序的本地测试应用程序。 打开一个命令提示符窗口中复制的源文件的文件夹,然后执行命令"故宫安装,"将安装所需的模块。 下一步,里面的 config.json 文件,包括 Windows Azure 表存储信息、 MongoDB 的连接字符串和包含错误消息的视频的位置设置不同的选项。 您现在可以开始解决方案相同的命令提示符窗口中键入"节点 server.js"。

将反向代理部署到 Windows Azure 网站

要部署到 Windows Azure 的反向代理,在管理门户中创建新的 Web 站点和启用 Git 部署­发言,让您在签入代码从任何 Git 资源库 (包括本地的)。 你会发现具体说明如何实现这在 bit.ly/KCQo9V。 源代码文件已经包括 package.json,Windows Azure 中定义的所需的模块和引擎版本的解决方案,以工作。 一旦创建了该 Web 站点,您可以部署直接从命令提示符窗口中通过导航到文件所在的文件夹并执行以下命令:

> git init > git add .
> git commit –m "Initial commit" > git push {git URL from Windows Azure portal} master

您提供所需的凭据后,该代码将被部署到 Windows Azure。

我们在 rvvideo.azurewebsites 创建一个 Web 站点。 您可以在其中看到一个示例页,其中包括最受欢迎的 HTML5 兼容 JW 球员,指向我们反向代理服务器的网 (图 5)。 如果你位于在美国,你将能够观看视频 ; 否则,您将收到的视频不是可用在您的国家或地区有关的警告。 指向 localhost 服务器,以促进本地调试在 Web 站点上也有一个选项卡。

Sample Web Site Pointing to the Node.js Proxy Server
图 5 示例网站指向的 Node.js 代理服务器

总结

在此示例中,我们已经表明如何合并多个云组件,以将额外的地理定位安全层添加到 Windows Azure blob 存储中存储的视频。 拦截、 路由和操纵的 HTTP 请求是在 Node.js 闪耀的使用案例之一。 我们也已经表明它是多么的简单交互,与 Windows Azure 服务如表存储,以及第三-­方提供商 MongoLab 如 Windows Azure 存储区中的。 最后,通过我们的解决方案部署到 Windows Azure 网站,我们可以扩展其基于需求和交通的能力。

Bruno Terkaly 是微软开发者福音传教士。他深入的知识来自于多年的经验在字段中,编写代码使用多种平台、 语言、 框架、 Sdk、 库和 Api。他花时间编写代码,写博客,给现场演示上构建基于云计算的应用程序,具体地使用 Windows Azure 平台。您可以阅读他的博客在 blogs.msdn.com/b/brunoterkaly

Ricardo Villalobos 是具有超过 15 年的经验设计和创建应用程序的公司在供应链管理行业经验丰富的软件设计师。他从达拉斯大学工商管理持有不同的技术认证,以及硕士学位,为微软工作作为一个云建筑师在 Windows Azure CSV 孵化组。您可以阅读他的博客在 blog.ricardovillalobos.com

布鲁诺和里卡多 · 联合目前在逃的行业会议。 他们鼓励读者的 Windows Azure 内幕交易与他们联系的可用性。 可以在达成布鲁诺 bterkaly@microsoft.com 和里卡多 · 可以达成 Ricardo.Villalobos@microsoft.com

衷心感谢以下技术专家对本文的审阅:大卫 · 马科贡 (Microsoft)