今天的文章里,我会介绍Microsoft Web Deploy—一个采用全面的发布和部署机制的免费服务器技术。Web Deploy不仅仅让你发布文件—还可以部署数据库结构/数据,运行变更的数据库脚本,设置安全访问控制列表等等。所有这些部署步骤都可以用Visual Studio自动完成。
本篇文章将提供一个循序渐进的教程,教你如何在一台Web服务期上安装和启用Web Deploy。接着我们演示如何使用Visual Studio通过Web Deploy直接(将文件)发布到服务器上,以及如何使用Visual Studio创建自动部署你的应用程序的安装包。
Web Deploy—为什么你会喜欢它
部署一个Web应用程序或站点包含好几个步骤。您通常需要:
1. 拷贝文件和文件夹;
2. 提供数据库结构,或许还要生成一些数据库数据;
3. 在文件和文件夹上设置相应的读写和安全访问控制列表;
4. 安装和配置SSL认证;
5. 部署其它杂七杂八的依赖项(事件日志,GAC库,COM对象等等)。
手工执行上面的步骤又累又慢又危险(因为手工部署总是容易出错)。使用自动化流程,可以让你在一台服务器上快速维护和部署应用程序,减少出错的几率,并极大加快你在应用程序上的改动放到作业服务器上的周期。
Microsoft Web Deploy
Web Deploy是由我的团队创建,用来改进Web部署的免费技术。它是运行在一台服务器上的部署服务,可以让你在本地或远程将程序部署到它上面。Web Deploy内置了在IIS里创建虚拟目录和应用程序、拷贝文件和文件夹、生成数据库(SQL Server和MySQL)、设置文件系统ACL的支持等等。(它甚至还内置了类似于设置注册表,注册COM组件等功能)。除了这些内置的部署功能,它还支持基于.NET的提供程序API,允许你创建和嵌入你自己的部署步骤—这样你可以按自己的方式自定义它。
Web Deploy的绑定协议是HTTPS—也就是说Web Deploy可以穿过防火墙(使部署程序到远程宿主服务器上简便、安全)。Web Deploy还同时支持管理员账号和非管理员账号的部署方案。非管理方案下,允许管理员在服务器上配置好Web Deploy,然后委托一部分部署工作给在作业服务器上没有管理员权限的程序员。这实现了一个非常安全并有弹性的部署方式。在本系列的下一篇文章里,我会讲到启用委托部署场景的配置步骤。
在Windows Server 2008上安装Web Deploy
在安装Visual Studio 2010(或Visual Web Developer 2010 Express)时,默认情况下会将Web Deploy安装到你的开发机上。它会在VS里提供创建Web部署安装包,还有将它们发布到启用了Web Deploy服务的远程机上要用到的东西。
下面是在一台运行IIS 7.x的Windows Server 2008或Windows Server 2008 R2作业服务器安装Web Deploy的步骤:
1. 在作业服务器上下载并运行Microsoft Web Platform Installer。
2. 在Web Platform Installer上点击“Web平台”,接着点击“Web服务器”下面的“自定义”链接。选择“Web部署工具1.1”还有“管理服务”功能。
3. 点击“安装”按钮。就会下载和安装Web部署安装包,并启用Windows内置的IIS管理服务功能。
在Windows Server 2008启用部署功能
现在我们已经装好了Web Deploy—下一步就是启用它。
Web Deploy支持管理员和非管理员部署(即委托部署)。在本文中,我将演示使用一个在服务器上有管理员权限的帐号启用部署。本系列的下一篇文章,我会涉及委托部署的启用方法。
1) 启用Web Deploy的第一步是打开IIS管理器(开始->运行->inetmgr.exe)。接着在主界面上双击“Management Service Delegation”图标:
双击“Management Service Delegation”图标后,会打开类似下图的页面。在动作面板上,点击“Edit Feature Settings …”链接,打开“Edit Feature Settings”对话框—选中“Allow administrators to bypass rules”选项。这允许有服务器上管理员帐号的用户跳过Web管理服务的委托设置,而是使用管理员的权限进行操作:
然后回到IIS管理器的主界面,并双击“管理服务”图标:
双击“管理服务”图标后会打开下面的页面。选中“Enable Remote Connections”复选框来启用远程部署。另外你也可以选择填写正在运行的管理服务的IP和端口号—还有允许那些客户端IP可以连接进来。你可以通过调整这些设置来限制访问部署服务的人员。
在“操作”页签点击“启动”连接就会在服务期上启动Web管理服务:
现在这台服务器已经使用管理员账号的Web Deploy安装了部署服务。
重要事项:一个需要关注的事情是你的服务器上是否启用了防火墙,或你的服务器在集群中的位置。管理服务默认使用HTTPS协议运行在8172这个端口。这个端口可能默认被你主机的设置关闭了。这样的话,要么你需要在防火墙/或宿主上打开它—要么选择一个允许的端口号。要测试管理服务是否可用,只需要打开浏览器并访问类似https://yourservername:8172/MsDeploy.axd 的链接就可以—如果你被要求提供用户名/密码,那说明它没有被防火墙阻挡。如果是超时则说明防火墙禁用了端口。
在非Windows Server 2008的操作系统上启用Web Deploy
上面的步骤演示了如何在Windows Server 2008或Windows Server 2008 R2操作系统上启用Web Deploy服务。IIS 7管理服务内置于这些操作系统里,Web Deploy可以直接用它。
如果你要在Windows 7,Windows Vista或者Windows Server 2003上尝试上面的步骤时,你会发现上面没有IIS管理服务(和在IIS管理器里的图标)。而你需要稍微改变一下上面的步骤来启用Web Deploy服务。
在Windows 7,Windows Vista和Windows Server 2003上启用Web Deploy
你可以使用下面的步骤,在Windows 7,Windows Vista和Windows Server 2003上启用Wed Deploy发布服务:
1) 打开一个管理员权限命令行窗口(即你需要右击并通过“以管理员身份运行”启动)。
2) 输入“net start msdepsvc”来启动“Web部署代理服务”:
3) 为了确认发布服务是否在运行,更换目录到“c:"Program Files"IIS"Microsoft Web Deploy”,然后输入命令“msdeploy –verb:dump –source:appHostConfig,computername=localhost”:
这会导致本地的msdeploy客户端连接到你刚刚启动的发布服务上,并打印出你Web服务器上ApplicationHost.Config文件的当前状态:
如果有很多东西显示出来,你就会知道所有的东西工作正常,而且你刚刚启用了Wed Deploy。使用这种方法不能启用“受托访问”(就是允许非管理员发布内容—我下篇文章会详细介绍到)—但是会允许有管理员权限的账号在这台机器上进行部署。
在Visual Studio里使用“发布Web”对话框
现在我们有启动了Web Deploy的Web服务器,让我们试着在Visual Studio IDE上发布一些东西。
VS 2010包含了一个可以让你快速部署一个Web应用程序到远程服务器上的新“发布Web”功能。你可以在任何一个ASP.NET Web应用程序项目上通过右击(Web窗体和MVC),然后选择“发布”命令使用它:
接下来会打开“发布Web”对话框,用来让你配置发布设置。你可以使用这个对话框,通过FTP/FTPS, Web Deploy和FrontPage服务器扩展,将ASP.NET应用程序发布到远程机上。
我们在下拉框里选择“Web部署”选项,然后输入我们Web部署服务器的发布信息:
请注意你只需要输入这些设置一次—然后你就可以使用顶端的“保存/重命名/删除”按钮将它们保存为一个“发布配置文件”。发布配置文件允许你保存多个部署/发布选项,并可以在你要用的服务器之间快速切换。
下面是你可用选项的一些说明:
服务 URL: |
这是Web部署管理服务的URL地址。如果你用的是 Windows Server 2008,那URL的默认格式是https://mysite:8172/MsDeploy.axd 。请注意协议是“https://”,而且端口号必须与你在上面启用IIS管理服务的端口号一致。 如果你在往Windows Server 2003, Windows 7或者Windows Vista的机器上部署,那么URL的默认格式是http://server-name (不是https—因为使用内置Windows身份验证发送的安全凭据是加密的)。你也不需要为Windows Server 2003, Windows 7或者Windows Vista的机器指定端口号。 |
网站/应用程序: |
允许您指定远程服务器上要安装应用程序网站的名称(和可选的应用程序的名称)。你可以把你的项目发布为一个站点,这样你必须指定类似www.mysite.com的东西作为站点名,或者是“默认Web站点”,如果你只想发布到根目录上的话。 注意:指定的站点名必须与在IIS管理器里的站点名一致。因此如果你将www.scottgu.com站点在IIS注册时,用的是显示名称“ScottGu’s Site”或者“scottgu.com”的话,你必须确保在发布设置里指定的也是显示名称(即你要指定“ScottGu’s Site”,而不是www.scottgu.com)。如果你设置错误,你会收到一个远程代理“无法连接”的错误。 要么你可以使用类似“www.mysite.com/myapplication”或“ScottGu Site/myapplication”的值发布到一个子应用程序上,如果应用程序的/myapplication虚拟目录尚不存在,那么Web Deploy服务会先为你创建一个,然后将你的项目发布上去。 你也可以勾选“标记为目标上的IIS应用程序”来指明你要将这个子路经设置为虚拟目录(默认值)或是一个应用程序。 |
凭据: |
如果你要向不属于你Windows域的远程机上部署,你需要在发布对话框里指明你的用户名/密码。用户名/密码要么映射到远程机的Windows账号,要么映射为IIS用户名(这样可以使用更有弹性的授权选项—我的下一篇文章会涉及)。 注意:除非你在远程机上安装了签过名的SSL认证,否则请勾选“允许不受信任的证书”复选框。默认情况下Web Deploy会安装一个唯一(而且没有签过名)的证书—如果你不勾选这个复选框,那么你就不能登录,因为VS不信任一个未签名的证书。 |
其它: |
还有一个复选框,允许你指明“保留目标上的多余文件”与否。如果你不选它,那么在你发布的站点/应用程序的现有文件里,不在你的VS项目里的文件会被删除掉。 |
一旦你填好了发布设置,你可以点击“发布”按钮,连接到远程Web部署服务来将你的程序部署到指定的位置。Visual Studio的“输出”窗口会显示类似下面的输出,来解释部署步骤中执行的操作。
上面的项目是一个包含几个文件和文件夹的基本Web工程。Web Deploy会负责将所有的文件和相应的访问列表拷贝到远程服务器上(比如说:将"app_data文件夹设置为读/写)。本系列的下一篇文章里,我将介绍如何将部署数据库的操作包含在Web Deploy过程中—还有如何自动更换web.config的文件设置(例如连接字符串)。
我们已经将站点发布到远程机上。右键单击项目工程,再选一次“发布”命令就可以再发布一次—再次打开发布对话框(默认情况下使用上一次发布的相同设置)。另外,你也可以在VS 2010里启用“Web一键式发布”工具栏—它允许你在已存的发布配置文件之间快速切换,点击右边的“发布”按钮就可以将项目工程发布到目标服务器上(不需要打开对话框):
请注意Web Deploy足够聪明,它会对比你本地项目和远程服务器(的文件)—并只拷贝需要的文件。所以如果你只是对一个大项目做一点改动,并重新发布的话—只有修改过的文件会被拷贝过去。不会重新拷贝没有被修改的文件。这就让重新部署/更新一个站点快很多—特别是那些有很多静态内容和大图片的项目。
默认情况下,Web Deploy将文件拷贝到Web Deploy服务之前会压缩文件—减少传输大小和加快部署。
在VS 2010里创建发布包
VS 2010还支持一个打包选项,用来让你打包你的ASP.NET Web应用程序(还有像web.config,数据库,ACL等它的依赖项)到一个Web Deploy支持的zip格式的安装包里。接着你把安装包交给一个可以使用IIS管理器部署它的人手上,或者通过一个命令行/PowerShell脚本将它安装到一个使用Web Deploy的远程服务器上。
你创建的安装包可以选择公开那些可复写的应用程序设置(例如目录路径,数据库链接字符串等)。当使用IIS管理器时,安装向导会提示管理员输入可变更得设置项—这样你可以在不用写任何代码的前提下提供干净的自定义体验。当使用命令行或者PowerShell脚本部署程序到远程服务器时,这些设置可以当作命令行参数输入。
要在VS 2010里创建一个Web部署包,只要在解决方案资源管理器里右击你的ASP.NET Web项目,并选择“生成部署包”菜单:
之后VS 2010就会创建一个Web Deploy兼容的部署包。在项目的“属性”对话框,你可以配置安装包在磁盘里的位置(选择“打包/发布Web”标签)。在“输出”窗口的生成内容里会显示生成Web Deploy部署包的磁盘路径(这样找起来很容易):
生成的部署包是一个.zip文件,包含了一个Wed Deploy清单,让你方便地通过IIS管理器或命令行将它部署远程服务器上。
用IIS管理器安装部署包
一旦你创建了.zip的部署包,你就可以用IIS管理器安装它。在IIS管理器里,点击在“操作”面板上的“导入服务器包或站点包…”链接(Web Deploy安装后才有):
这会打开一个对话框让你选择.zip部署包。当你在IIS管理器做这些的时候,它会对管理员显示在安装包里自动化的部署步骤:
跟着向导走,它就会自动地将程序维护到你的服务器上。
使用命令行部署安装包
另外,你也可以使用一个命令行窗口将包部署到远程服务器上。
打开命令行窗口(管理员权限),更换目录到部署包.zip文件所在的磁盘目录。除了.zip安装包,你可以看到VS在那个目录里还添加了一起其他文件:
ProjectName.deploy.cmd文件为你提供将包部署到远程服务器上的预置脚本。
ProjectName.SetParameters.xml文件包含了一些可设置的部署参数(例如站点名称,链接字符串的路径等)。你可以使用Visual Studio的项目属性面板来设置生成到该文件的参数的默认值。管理员们可以在之后编辑/修改它们(避免将它们通过命令行参数输入)。请打开这个文件并确保默认值是否正确。特别要确保将要部署的站点名/应用程序名是正确的。
要将包安装到远程Web Deploy服务器上,执行下面的命令:
ProjectName.deploy.cmd /y /M:https://WebDeployUrl:8172/MsDeploy.axd /u:username /p:password –allowUntrusted /A:basic
下面是参数的一些说明:
/y |
指明Web Deploy应该将程序部署到远程服务器上。 另外除了/y选项,你也可通过/t来执行一个试验安装,它会模拟部署过程来帮助你确认所有的东西是否准备好了(而不是实际安装)。 |
/M: parameter |
指明部署包的那台服务器的发布端点。它需要匹配你设置的发布服务URL(要和“发布Web”对话框里的“Service URL”参数一致)。如果是发布到一台 Windows Server 2008或者2008 R2服务器上,应该是一个“https”的URL。 |
-allowUntrusted |
如果远程Web Deploy的SSL认证没有签过名(默认情况就不是),需要这个选项。 |
/A:basic |
如果远程服务器没有使用Windows身份验证来识别用户,需要这个选项(指明你将用基于http的SSL身份验证)。 |
执行命令后,它会将包部署到远程服务器上, 执行所有的部署步骤(比如维护数据库,设置文件ACL之类的东西),并在安装过程中将状态返回到命令行窗口。
从一个生成服务器或持续集成服务器上自动部署
除了由程序员/管理员显式启动部署过程,你还可以让它作为一个持续集成过程或者生成服务器的一部分自动执行。自动创建一个Web Deploy .zip包所需的命令可以作为MSbuild的任务。用它们,要么你可以在生成过程中创建一个部署包,要么再加上自动部署程序的过程。
我将在后续的一篇博客里讲到启用自动生成的场景。
在一个Web农场里部署
Web Deploy还可以与Microsoft Web Farm Framework一起使用在Web农场里实现自动部署。你可以在Web Farm Framework集群的主服务器上安装和配置Web Deploy—集群里的辅助服务器接着可以监视并复制所有你发布的程序。这样就允许你在一个Web农场里任意多的机器上以自动化的方式执行部署站点和程序相同的步骤。
请参阅我的前一篇关于Microsoft Web Farm Framework的文章来了解启用的过程。
总结
Web Deploy提供了一个将ASP.NET Web程序部署到远程服务器上强大并有弹性的自动化方式。Web Deploy不仅允许你发布文件—还可以维护数据库结构/数据,执行数据库变更脚本,设置安全ACL以及更多。
你可以在Visual Studio里直接部署到启用Web Deploy的远程服务器上,或者创建可以用管理工具或命令行安装的部署包。你还可以将打包和部署作为一个生成服务器或者持续集成流程的一部分,来实现不间断的交付模式。
下一篇文章里我会提到使用Web Deploy实现授权方案,我还会在博客文章里讲到在部署过程中修改/定制web.config文件,在Web Deploy过程中部署数据库,以及将所有这些整合到一个自动化的生成过程的步骤。
希望这能对您有所帮助。