欢迎加入QQ群(423730487)!4月9日在上海有一场线下活动,盆盆还有微软Azure Stack产品组专家会和大家一起分享技术,届时会在QQ群里直播哈。

添加盆盆的微信(markpah),我会把您拉到微信群。


为什么要学习Azure Stack?因为这是学习Azure的最佳工具。


例如Azure里的经典PaaS服务WebApp,是一款广大人民群众喜闻乐见的服务,很多客户用来搭建自己的数字化营销方案。PaaS服务让我们不再困扰于日常的运维,极大地降低了成本。


但是Azure的WebApp背后是什么原理?它是怎么运作的?我们不得而知。而Azure Stack则能帮助我们“管窥”其背后的原理,至少基本架构和原理是差不多的。


不过本文不会涉及到Azure WebApp的部署,您可以参考以下的文档:

https://azurestack.eu/2016/02/enable-paas-web-apps-in-azure-stack-tp1-part-i/


以下是Azure WebApp虚拟机角色的作用:

  • Web Worker– 特殊版本的IIS Web服务器,用来处理来自客户端的Web请求

  • Front End– IIS Web服务器,接受来自客户端的请求,并把请求转交给Web Worker,以及把Web Worker的响应回送给客户端

  • Publisher– 给FTP客户端提供内容发布,还有类似GIT等机制(目前并不支持)

  • Database– Azure Stack WebApp的配置数据

  • File Server - 存放租户的网站内容 

  • Controller–  创建和管理其它WebApp的角色

  • Management- REST API 服务器


我们可以在WebApp的Resource Provider管理页面里看到这些虚拟机角色。

wKiom1byASvh0CLJAAKhG3rEmRc323.jpg


租户网站进程


如果未作特别说明,本文特指免费(共享)模式的租户网站,名称为MarkWebFreeDemo


可以通过Process Monitor来监控租户网站的进程行为。


我们可以看到DWASSVC这个进程启动了租户网站进程w3wp。DWASSVC进程里运行着Dynamic WAS Service,这是Azure Stack WebApp用来替代Windows自带的WAS服务,专门为高并发的网站托管服务。

wKioL1byAsTBvIpRAALB_T7zIhE466.jpg


查看其堆栈信息,可以发现其调用RsFilterApi.dll里的CreateSandboxProcessW函数创建沙盒进程,这样租户网站虽然可以运行在同一个Web Worker虚拟机上,但是彼此之间是隔离的。同样RsFilterApi.dll是WebApp里特有的,也不是Windows里自带的,不知道和Windows Docker之间存在什么关系?

wKioL1byAxyDqJhMAAH262F2yOQ334.jpg


然后可以看到租户网站进程w3wp尝试访问\\10.0.2.101\WebSites上的共享。这里的\\10.0.2.101就是File Server这个虚拟机角色,用来存放租户网站的内容。

wKioL1byAzHiKdAOAAYlqS_QkQ4174.jpg


在Web Worker虚拟机上有个D:\DWASFiles\Sites文件夹,DWASSVC进程用来管理租户网站的配置信息,我们的租户网站MarkWebFreeDemo则在其下有一个子文件夹,里面保存着该租户网站的相关信息,其下有一个名为“VirtualDirectory0”的符号链接,指向File Server的共享文件夹路径,其中保存着该租户网站的内容。

wKiom1byDI6gLjxQAAUkS94AlOM695.jpg


FTP上传租户网站内容


比较奇怪的是,和前任Windows Azure Pack(确切来说并不算"前任")相比,Azure Stack的WebApp多出一个FTP的虚拟机角色,用来提供FTP服务。


由于前面所述的Blog以及官方文档里没有提供FTP的配置方法,所以可以按照以下步骤进行。首先打开WebApp资源组(本例是WebSitesSQL),找到FTP0-1P所绑定的公网IP地址,本例是192.168.133.23。

wKioL1byD4mi_1EoAAV2bBuD7gE746.jpg


然后在DNS服务器里新增一个A记录,ftp.web.azurestack.local为192.168.133.23。


接下来即可在租户网站页面上设置FTP服务器的访问凭据。

wKiom1byDyii1DiXAAO3-DIHuzA845.jpg


然后就可以借助FTP客户端,例如FlashFXP等,即可访问到该FTP服务器,而有趣的是,所看到的FTP文件夹,并不在该FTP服务器上,而是在File Server的租户网站内容文件夹里!


可以做一个简单的实验,通过FlashFXP上传一个index.html到文件服务器上,然后重启租户网站,即可看到内容。

wKioL1byD9az8SnhAACGYnbP7sQ832.jpg


免费(共享)租户网站资源配额


在共享模式租户网站里,由于所有租户的网站都运行在相同的Web Worker虚拟机上,所以会默认加以CPU和内存限制,可以用Process Explorer查看其Job Object信息。例如我们可以看到其中该网站默认使用最多1024MB的虚拟内存。 

wKioL1byEC6xa7JyAAGMeDcZYtU634.jpg


我们可以在Azure Stack的Portal上,打开WebApp的Resource Provider配置页面,依次进入SKUs、所需的租户网站模式、Features,可以看到Site Memory Limit默认是1024MB,这和前面的Job Objects一致。现在将其改为1500MB,并保存。

wKiom1byD7bx1g-eAAMdLn12RAo452.jpg



仔细查看SQL Server虚拟机角色,发现该配置数据写在runtime.SitePolicy的MemoryLimitinMB。

wKiom1byEI3Btes1AASz2bA9SJU363.jpg


重启租户网站,现在可以看到网站的内存限制变成了1500MB。

wKioL1byET6QKnYvAAGMjptIOh4335.jpg


顺便说一下,利用Windows的Job Object来限制一组进程的资源配额,Windows Docker也是采用类似方法,而开源的Linux Docker,则采用类似的CGroup技术。