七、部署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}
接下来的一章节我们介绍卸载/回滚安装。