Loading

安全的发布 .NET 应用的改动到产品服务器环境

  当你往生产环境的服务器上布署增量式的变化时,服务器正在运行且一直都是可用的,你有时会看到这样的错误消息“编译错误消息:类型'XXX'同时存在 于……” 有时,你会发现Application_start事件没有启动,虽然你已经装载了类、动态链接库或者web.config配置文件。有时,你会发现静态 变量没有初始化,等等。当你增量式的布署变化到服务器时,有许多奇怪的事情会在网络服务器上发生,这些服务器已经启动并运行了许多周了。因此我想出了简便 的步骤,这些步骤是我们在向在服务器布署增量式的变化时总要做的事情。这些步骤可以确保网站可以被恰当的回收,缓存可以被清理,所有存储在应用层的数据都 被初始化。

  首先,在负载均衡器后面你部署了多个Web服务器。这样,你就可以让其中一台服务器脱离生产环 境,然后对其进行部署和一些脱离生产环境后才能执行的任务,比如重新启动IIS,然后再把这台服务器放回到生产环境。接着你就可以对第二台服务器做同样的 操作,以此类推。这样给客户提供的服务就不会中断。如果你做这一切速度相当快,那么幸运的话客户将不会意识到服务器之间有一些不一致:一些已经是新代码, 一些还是旧代码。只有更改的内容不是很多时,你才可以做到这些。例如,你没有发布完成经过完全修改的UI。这种情况下,一些正好访问已经是最新UI的server1的用户突然看到完全不同的界面,然后刷新下一个页面,它们可能正好访问的是还是旧代码的server2,那么看到的是完全不同于前一次的界面。因此,只有非大量的增加型更改才能这么做。

image

部署的时候,请遵循以下步骤:

  • 把服务器X从负载均衡器组中脱离出来,这样这台服务器就不会有任何服务交互了

  • 停止这台服务器上运行的所有.NET Windows 服务

  • 停止IIS

  • 如果你运行了多个版本的.NET,那么请删除所有.NET版本的临时ASP.NET文件夹。如果你不清楚怎么删除,那么请看这个链接

  • 部署更改的内容

  • 生成你用到的分布式缓冲,比如,Velocity 或者Memcached。

  • 启动IIS

  • 启动这台服务器上的的.NET Windows服务。

  • 点击主要的URL激活这些Web站点。你应当编写一些自动执行的脚本做这些事情。你可以使用tinyget实现点击一些主要的URL,尤其是访问那些需要很长时间才能编译的页面。要实现零代码访问,请阅读我的博文: 始终激活web站点

  • 把这台服务器放回到负载均衡器组里,这样它就可以接收访问了。

以上就是整个操作步骤。此时你应该非常清楚如何部署了,这样也就不会出现意向不到的错误了。你应当把这些步骤打印出来,并把它悬挂在哪些部署人员的桌面上方,这样在部署紧张的时候部署人员就不会忘记该怎么做了。

  手动完成所有这些步骤很冒险。在部署时间紧张的时候,生产环境的部署人员就可能操作失误,从而把服务器搞得一团糟。因此我总是提前编写一个批处理文 件,用它来实现服务器脱离生产环境并为部署代码做一些准备工作,然后再部署完成,服务器激活之后,使用另一个批处理文件把服务器放回到负载均衡交互式轮询 组里。

  通常负载均衡器都被配置为访问web站点的某个网页,如果这个网页返回的是HTTP 200,那么这个服务器就是存活的。如果没有返回HTTP 200,那么负载均衡器就认为这台服务器已经挂死,然后就把这台服务器剔除出轮询组了。例如,假设web站点上存在文件alive.txt,这个文件是负 载均衡器密切关注的文件。如果这个文件被删除,那么这台服务器就会脱离轮询组了。遇到这种情况,你就可以创建批处理文件来完成服务器脱离负载均衡轮询组的 工作,然后等待几秒以确保完成正在运行的请求,接着停止IIS,删除临时性的ASP.NET文件,准备在这台服务器上部署。要做的这些工作如下批处理:

serverout.bat
=====================
Ren alive.txt dead.txt
typeperf "\ASP.NET Applications(__Total__)\Requests Executing" -sc 30
iisreset /stop
rmdir /q /s "C:\WINDOWS\Microsoft.NET\Framework64\v1.1.4322\Temporary ASP.NET Files"
rmdir /q /s "C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files"
md "C:\WINDOWS\Microsoft.NET\Framework64\v1.1.4322\Temporary ASP.NET Files"
md "C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files"
xcacls "C:\WINDOWS\Microsoft.NET\Framework64\v1.1.4322\Temporary ASP.NET Files" 
/E /G MYMACHINE\IIS_WPG:F /Q
xcacls "C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files" 
/E /G MYMACHINE\IIS_WPG:F /Q

 与上面所做的工作类似,你还应该创建一个批处理文件,用它来启动IIS,激活某些网页,然后把这台服务器放回到负载均衡器轮询组里。

serverin.bat
============
SET TINYGET=C:\Program Files (x86)\IIS Resources\TinyGet\tinyget.exe
iisreset /start"%TINYGET%" -srv:localhost -uri:http://localhost/ -status:200
ren dead.txt alive.txt
typeperf "\ASP.NET Applications(__Total__)\Requests Executing" -sc 30

 通常总试图自动地完成这样的管理杂务。因为在紧急部署的时候,要做到始终手工正确地完成这些工作是很困难的。


转载:http://www.oschina.net/translate/safely-deploying-changes-to-production-servers?from=20140309

作者:几点人, LitStone

出处:开源中国

posted @ 2014-03-10 10:05  jesn  阅读(143)  评论(0编辑  收藏  举报