七、部署Web应用程序

我们部署Web应用程序,主要使用的是命令行工具 Appcmd.exe来配置和查询 Web 服务器上的对象。下面主要针对具体的应用来说明。一个有用的快速查询Appcmd命令的资料可以参考

备份/恢复IIS设置

在开始使用命令来设置 Web 服务器前,我们需要先备份IIS设置,如果我们的备份文件为"MyBackup",首先检查备份文件是否存在,如果不存在则备份文件,备份后在后续安装失败时或卸载安装程序时可以通过恢复IIS设置来回滚我们对Web 服务器的操作。

/* 备份IIS设置
appcmd list backup MyBackup
appcmd add backup MyBackup */
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
list backup MyBackup '
Pop $0
${If} $0 == 1 ; 执行未找到备份
     nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
     add backup MyBackup '
     Pop $0
     ${If} $0 != 0 ; 执行失败
          DetailPrint "备份IIS设置失败"
          Abort
     ${EndIf}
${EndIf}
/* 恢复IIS设置
appcmd restore backup MyBackup */
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
restore backup MyBackup '
Pop $0
${If} $0 != 0 ; 执行失败
     DetailPrint "恢复IIS设置失败"
     Abort
${EndIf}

创建应用程序池

首先检查应用程序池是否存在,不存在则创建应用程序池,设置应用程序池的.NET CLR版本为 4.0,托管管道模式为经典模式,创建成功后设置应用程序池标识。

DetailPrint "--创建应用程序池"
 /* appcmd add apppool /name:$AppPoolIdentity /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Classic"
    appcmd set config /section:applicationPools /[name='$AppPoolIdentity'].processModel.identityType:SpecificUser
  /[name='$AppPoolIdentity'].processModel.userName:string /[name='$AppPoolIdentity'].processModel.password:string */
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
list apppool $AppPool '
Pop $0
${If} $0 == 1 ; 执行未找到应用程序池
     nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
     add apppool /name:$AppPool /managedRuntimeVersion:"v4.0" /managedPipelineMode:"Classic"'
     Pop $0
     ${If} $0 != 0 ; 执行失败
          DetailPrint "创建应用程序池失败"
          Abort
          ${EndIf}
${EndIf}
        
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
set config /section:applicationPools /[name=$\'$AppPool$\'].processModel.identityType:SpecificUser \
        /[name=$\'$AppPool$\'].processModel.userName:$DomainName\$ADAdmin /[name=$\'$AppPool$\'].processModel.password:$ADAdminPwd'
Pop $0
${If} $0 != 0 ; 执行失败
     DetailPrint "设置应用程序池标识失败"
     Abort
${EndIf}

创建应用程序物理路径

Web应用程序部署包(如:Release文件夹)放在NSIS脚本文件所在目录下,有以下类似脚本,编译时会把Release文件夹里的文件压缩进安装程序中,安装时会把文件解压缩到指定的安装目录下,该例子中为"$INSTDIR\ADWebManager\ADWeb",注意里面的每级文件夹都要设置输出路径(如:SetOutPath "$INSTDIR\ADWebManager\ADWeb"),这个文件很多手写不太方便,可以使用HM NIS Edit编辑工作的脚本向导自动生成再拷贝到函数中。

Function CreateDirectory
  SetOutPath "$INSTDIR\ADWebManager\ADWeb"
  SetOverwrite try
  File "Release\404.aspx"
  SetOutPath "$INSTDIR\ADWebManager\ADWeb\ADEntriesManagement"
  File "Release\ADEntriesManagement\ADComputerEdit.aspx"
 ......
FunctionEnd

创建应用程序站点

首先检查应用程序站点是否存在,不存在则创建应用程序站点,站点指向上面部署文件解压缩所在的文件夹($INSTDIR\ADWebManager\ADWeb),绑定https/*:443,创建成功后设置站点的应用程序池。

 

DetailPrint "--创建应用程序站点"
/* appcmd add site /name: string /id: uint /physicalPath: string /bindings: string
   appcmd set site /site.name: string /[path=' string '].applicationPool: string */
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
list site $AppSiteName '
Pop $0
${If} $0 == 1 ; 执行未找到应用程序站点
     nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
     add site /name:$AppSiteName /physicalPath:$INSTDIR\ADWebManager\ADWeb /bindings:https/*:443: '
     Pop $0
     ${If} $0 != 0 ; 执行失败
          DetailPrint "创建应用程序站点失败"
          Abort
     ${EndIf}
${EndIf}
        
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
set site /site.name:$AppSiteName /[path=$\'/$\'].applicationPool:$AppPool '
Pop $0
${If} $0 != 0 ; 执行失败
       DetailPrint "设置站点的应用程序池失败"
       Abort
${EndIf}

 

站点设置

应用程序站点创建完,需要设置站点的数据库连接字符串、身份验证等信息,本例子中是数据库连接是集成Windows身份验证,身份验证需要关闭匿名身份验证,开启Windows身份验证和ASP.NET模拟身份验证,并且设置模拟身份的标识。

/* 数据库连接字符串
appcmd set config /commit:MACHINE /section:connectionStrings /[name=' string '].connectionString: string */
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
set config "$AppSiteName" /section:connectionStrings /[name=$\'ADManagerContext$\'].connectionString:\
        "Data Source=.;Initial Catalog=ADManager;Integrated Security=True" '
Pop $0
${If} $0 != 0 ; 执行失败
     DetailPrint "设置数据库连接字符串失败"
     Abort
${EndIf}
        
/* 模拟身份
appcmd set config /commit:WEBROOT /section:identity /impersonate:true
appcmd set config /commit:WEBROOT /section:identity /userName: string /password: string */
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
set config "$AppSiteName" /section:identity /impersonate:true '
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
set config "$AppSiteName" /section:identity /userName:$DomainName\$ADAdmin /password:$ADAdminPwd '
Pop $0
${If} $0 != 0 ; 执行失败
     DetailPrint "设置身份验证失败"
     Abort
${EndIf}
        
/* Windows身份验证
appcmd set config /section:windowsAuthentication /enabled:true | false
appcmd set config "ADWebManager" -section:system.webServer/security/authentication/windowsAuthentication /enabled:"False" /com
mit:apphost */
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
set config "$AppSiteName" -section:system.webServer/security/authentication/windowsAuthentication /enabled:"True" /commit:apphost  '
Pop $0
${If} $0 != 0 ; 执行失败
     DetailPrint "设置身份验证失败"
     Abort
${EndIf}
        
/* 匿名身份
appcmd set config /section:anonymousAuthentication /enabled:true | false
appcmd set config "ADWebManager" -section:system.webServer/security/authentication/anonymousAuthentication /enabled:"False" /com
mit:apphost */
nsExec::ExecToStack '"$WINDIR\system32\inetsrv\appcmd.exe" \
set config "$AppSiteName" -section:system.webServer/security/authentication/anonymousAuthentication /enabled:"False" /commit:apphost '
Pop $0
${If} $0 != 0 ; 执行失败
     DetailPrint "设置身份验证失败"
     Abort
${EndIf}

接下来的一章节我们介绍卸载/回滚安装

posted @ 2016-05-17 17:50  所以呢  阅读(2154)  评论(0编辑  收藏  举报