是否可以在Azure Web角色上重新启动IIS而无需重新启动该过程?

时间:2012-03-16 09:49:18

标签: iis azure

我有一个在Azure网络角色上运行的网站,我可以通过修改web.config强制重启应用程序但是如果我想重新启动IIS,我被告知我不应该通过远程桌面手动执行此操作而是我应该重新启动Azure托管进程。

article seems to agree有此意见。

我的问题是重新启动进程可能需要将近10-15分钟才能重新启动。有没有更快的方法来实现这一目标?

我目前正在使用windows.azure.com用户界面进行所有部署和管理。

4 个答案:

答案 0 :(得分:7)

这里有几点要指出。当您的角色启动时,它会使用名为IISConfigurator的东西以编程方式调用IIS并创建服务定义中定义的应用程序,vdirs,应用程序池等。这是在启动时完成的。

请记住,托管您网站的w3wp.exe进程与您可能用于运行代码的RoleEntryPoint完全分开。因此,您不能只调用RoleEntryPoint.RequestRecycle()并期望IIS将重新启动(它不会)。

如果必须重新启动IIS,可以尝试的一种解决方案是以编程方式执行此操作。以下是我在Windows Azure上重新启动IIS的3行解决方案:

var mgr = new ServerManager();
var azurePools = mgr.ApplicationPools.Where(p => Guid.TryParse(p.Name));
azurePools.ToList().ForEach(p => p.Recycle());

我使用的知识是,应用程序池是Windows Azure中的GUID,可以将它们过滤到我感兴趣的那些。

现在,您只需要一种方法在每个实例上按需提升的条件运行该代码。这是许多解决方案的常见问题。也许让每个实例轮询一个文件或表,以便在需要重新启动IIS时运行该代码。

答案 1 :(得分:2)

为什么需要重启实例?您是否在生产部署中遇到内存泄漏或其他问题?在生产环境中,重新启动实例的唯一真正安全的方法是通过Azure管理门户或Azure管理REST API。

如果您正在使用开发/测试部署,则可以使用Set-RoleInstanceStatus PowerShell Cmdlet进行RDP并使您的实例脱机。此时,您可以自由运行IISReset,重新启动WWW发布服务,修改web.config,将新dll复制到bin文件夹等等。我们使用dev / test实例进行这些操作,而不是问题,但我们从不通过RDP修改我们的生产实例,除非我们需要解决紧急问题。

答案 2 :(得分:2)

如果您将应用程序部署为App Service“YourName”,如

Azure App Service

使用网址http://yourname.azurewebsites.net 你应该可以连接到http://yourname.scm.azurewebsites.net 使用与Azure管理相同的凭据。 在此网址中,您可以找到相应应用服务的Kudu

如果您在菜单工具>支持中选择,然后选择分析>指标 那么你应该可以点击“重启w3wp”。

Kudu UI

我测试的3个应用程序的应用程序再次运行的时间并不出乎意料地长。

如果您只需要“观察”w3wp,那么您可以查看https://youname.scm.azurewebsites.net/ProcessExplorer/

答案 3 :(得分:0)

你可以尝试远程桌面到实例并以那种方式回收IIS