您如何通过代码更改来更新实时网站?


21

我知道这是一个非常基本的问题。如果有人能使我幽默并告诉我他们将如何处理,我将不胜感激。

我决定发布此内容,因为我将要安装SynchToy来解决以下问题,并且使用“ Toy”感到有点不专业,但是我想不出更好的方法。

当我处于这种情况下,我发现很多时候,我都缺少一些痛苦而明显的做事方法-这是因为它是公司中唯一的开发人员。

  • 在计算机上工作时开发的ASP.NET Web应用程序
  • 解决方案有2个项目:
    • 网站(文件)
    • WebsiteLib(C#/ dll)
  • 使用Git存储库
  • 部署在GoGrid 2008R2 Web服务器上

部署:

  1. 进行代码更改。
  2. 推送到Git。
  3. 远程桌面到服务器。
  4. 从Git中拉出。
  5. 通过使用Windows资源管理器拖放来覆盖实时文件。

在第5步中,我从网站根目录中删除所有文件。这不是一件好事。这就是为什么我要安装SynchToy ...

更新:感谢所有有用的回复。我无法选择哪个人来标记答案-在使用Web部署之间-看来我有几个有用的建议:

  1. Web Project =将整个站点打包到一个DLL中-对我来说,我无法进行简单的更新-作为50个公司的开发人员,这有时会更简单。
  2. 从SCM直接拉到站点的Web根-我最初并不是这样做,因为我担心我的SCM隐藏目录可能最终被暴露出来,但是这里的答案帮助我克服了这一点(尽管我仍然不喜欢拥有一个还有更多的事情需要担心忘记以确保随着时间的推移仍然是正确的)
  3. 使用Web场并系统地部署到节点-这是零停机的理想解决方案,这实际上是我关心的问题,因为该站点实质上是我公司的实时收入来源-我可能很难说服他们服务器成本却翻了一番。

->最后,重申基本原则,即需要对站点进行一次单击部署,否则可能会出错,这是我从答案中得到的最有用的东西。

更新2:我以为我会回到此位置,并使用已经存在了几个月并且可以正常使用的实际解决方案进行更新(对于我的单个Web服务器解决方案)。

我使用的过程是:

  1. 进行代码更改
  2. 推到Git
  3. 远程桌面到服务器
  4. 从Git拉
  5. 运行以下批处理脚本:

    cd C:\ Users \ Administrator

    %systemroot%\ system32 \ inetsrv \ appcmd.exe停止站点“ /site.name:默认网站”

    robocopy文档\代码\ da \ 1 \ work \ Tree \ LendingTreeWebSite1 c:\ inetpub \ wwwroot / E / XF connectionsconfig Web.config

    %systemroot%\ system32 \ inetsrv \ appcmd.exe起始站点“ /site.name:默认网站”

如您所见,这使站点瘫痪,使用robocopy智能复制已更改的文件,然后恢复站点。它通常在不到2秒的时间内运行。由于此站点上的峰值流量约为每秒2个请求,因此每个站点更新缺少4个请求是可以接受的。

Sine我对Git更加精通,我发现上面的前四个步骤是“手动过程”也是可以接受的,尽管我确信如果愿意的话,我可以将整个过程滚动一次。

AppCmd.exe的文档在此处。Robocopy的文档在这里


6
更适合服务器故障。
Karl Bielefeldt

您应该考虑使用SSH而不是使用远程桌面登录到服务器,这样可以根据需要编写部署脚本。
Malfist 2011年

5
我认为这个问题可以留在这里。在我看来,部署网站似乎比sysadmin更像是开发人员关心的问题,尽管我认为这可能因公司而异。到目前为止,所有答案都以开发人员为中心。
亚当李尔

1
@Malfist-一个ssh到底如何进入Windows服务器?
Wyatt Barnett

@Wyatt通过在远程计算机上运行SSH服务器,(几乎)与在Linux机器上相同。
亚当李尔

Answers:


3

您应该检查VS 2010的Web部署。如果GoGrid支持,则Web部署程序包是一个很好的解决方案。

http://weblogs.asp.net/scottgu/archive/2010/07/29/vs-2010-web-deployment.aspx


使用Web部署时,您会丢失修复程序的选项,不是吗?我知道很多人都不想在正式程序之外做些什么,但是我喜欢紧急情况下的选择...
Aaron Anodide 2011年

你这样做,好点。我知道在我的公司,我们不希望人们这样做,因为我们无法跟踪更改。对于个人网站,我真的很喜欢这种选择。
Nate

3

在我以前的雇主处,要部署代码更改,我们将设置负载均衡器停止服务到一台网络服务器。第一个Web服务器上的会话可能需要20分钟才能过期。我们将通过解压缩部署zip文件来更新该Web服务器上的代码,然后通过点击第一个Web服务器的直接IP地址来检查一切是否正常。当我们确信它可以正常工作时,我们将负载平衡器设置为击中现在更新的Web服务器,并等待会话在另一台服务器上到期,然后更新该服务器(依此类推,直到所有服务器都被更新)。在他们检查完之后,我们将负载平衡器设置回去做它的工作。当我们在高峰季节负载期间将多达10台Web服务器连接到负载均衡器时,情况变得很复杂(因此,由于无法关闭实时网站,一次一台更新它们可能要花几个小时-客户必须能够到网站)。

在ASP.NET中,如果将任何名为“文件”的文件拖放App_Offline.htm到网站的根目录中,则该网站将卸载,然后您可以更新DLLS(及其他内容)。IIS将提供一个标题为“脱机应用程序”的页面。删除,重命名或删除文件后,Web应用程序将重新启动,IIS将为该网站提供网页。这是从VS内部发布网站时Visual Studio所做的。


2

通常,我要做的是将所有内容保存在SVN存储库中。完成一些更改后,我在开发站点上提交,然后在生产中结帐。保持所有内容同步,快速简便。如果结账太麻烦了,您可以使用WebDAV设置Apache,它将为您完成。


您是否担心诸如.svn目录之类的东西出现在您的实时网站上?
亚伦·奥诺德

并非如此,通常将apache设置为拒绝访问这些文件夹。
Malfist 2011年

IIS默认也拒绝.svn(或.git或.hg)。
Wyatt Barnett

如果恶意用户访问目录,则他/她将以清除状态访问所有代码。
oleksii 2011年

5
如果恶意用户可以访问您的文件系统,则您还有更多需要担心的事情。
Malfist 2011年

2

对于我的每个Web应用程序,我都有一个带有三个分支的git存储库设置。实时,测试版,功能。Live当然是现场站点。Beta是用于在实施之前修复错误或对功能进行最终测试的网站。然后,就像您说的那样,我进行了简单的git push,实时启用git pull来获取信息。功能用于“下一个版本”增强功能。


几乎所有源代码控制系统都可以使用相同的功能。
deadalnix

2

您正在尝试解决连续交付的问题。最初,您将从手动步骤开始,但是很快您将意识到这些问题。这些是最常见的:

  1. 代码可在您的PC上运行,不适用于生产环境
  2. 新变化打破了旧代码
  3. 增量更改将使部署变得越来越困难,您将获得要附加的新库,要应用的补丁等。

看一下TeamCity(或任何类似工具)。


2

使用自动构建和部署脚本

最好的方法是使用自动生成和部署脚本,例如MsBuild或Nant。

原因是您只需键入1命令即可推出一个网站,然后只需键入1命令即可将其回滚。并且如果您足够详尽,它将包括您的数据库架构迁移。(Migrator.Net)

不使用SVN或GIT进行部署的主要原因之一是环境可以在生产和登台之间进行更改。在您的NANT脚本中,您可以让它专门为目标环境构建.config文件。这样可以省去在生产环境中输入配置设置的麻烦。

它还使整个过程自动化,因此成为一个命令,而任意数量的手动过程都变成一个简单的过程。


1

首先,您应该使用Web项目。您有什么区别?

一个Web项目会将所有C#类文件(包括代码背后文件)组合到一个DLL中(为了安全起见,这是一个可移动的文件,更好)。

其次,您应该发布应用程序,然后仍然可以在远程桌面上,将所有文件拖到publish文件夹中,然后将其设置为覆盖(新文件将替换旧文件)。

发布会将应用程序的所有必要文件放在一个文件夹中。


1

我现在的老板使用人偶进行部署。(这里有更多软件包可以解决相同的问题。)

我以前的老板使用了一个自定义的作业控制系统来处理软件的部署,重新启动等操作。即使有可用的软件,也无法满足您的需求。

我之前拥有的雇主具有自定义脚本,可将数据从Subversion复制到服务器并进行滚动重启。

我之前看过的几个地方都有制作文件来管理部署。他们通常使用这样的策略,例如从负载均衡器中删除一半的Web服务器,等待,停止一半,推出代码,重新启动它们,然后翻转负载均衡器,等待,停止另一半,重新启动它们,然后再将负载均衡器恢复起来

在我工作过的所有地方,推出代码要么是单个命令,要么缺少代码不是单个命令,这被认为是要解决的问题。


1

通常,我们使用网站来解决此问题的方法是Systems Internals附带的称为结点的工具。

使用此工具,我们可以创建从一个目录到另一个目录的链接。服务器上的应用程序根目录包含3个文件夹。红色,蓝色,当前。IIS被配置为始终查看其文件的最新信息。

您可以发出命令junction current,告诉您当前指向的是哪个文件夹。举例来说,它当前指向的是Blue。我们要做的是将Red部署中的文件排队,以进行新部署,并确保所有配置已准备就绪。

一旦我们准备好了,我们可以发出命令junction current red重新指向它。

有两点使这个解决方案如此出色

1)世界上所有时间都将更改排队在文件夹中。不必着急,唯一的停机时间是在应用程序池旋转时。(还有一种方法可以预编译此步骤。)

2)如果您的部署出现问题,您要做的所有回滚操作就是发出命令,而不是尝试还原更改。在我们的例子中的命令是junction current blue

希望我们的处事方式可以为您提供新的解决方案。


0

我已经做了什么,并且不确定是否有这个范围,但是可以。开发人员会将代码检入QA分支,然后由系统工程师将其加载到QA环境中,一旦通过QA,它将被提升到生产分支。在这种情况下,每个站点中至少有2个以负载均衡器的偶数连接到服务器,这两个服务器之一将脱机iis将被停止,站点将被存档,新站点将与iis所需的任何iis更改都将重新启动,然后您将移至下一个服务器。在我们的案例中,所有这些都使用C#编写了脚本,但过去使用vb脚本完成了。希望对您有所帮助。干杯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.