Всем привет. Мне поставили очередную задачу — перенести сайты которые хоcтятся на Windows 2008 на Windows 2012R2. Сложности оказались в том что, каждый сайт крутится на отдельном пуле приложений, от отдельного пользователя, пароль которых не известен. Сайтов довольно много и почти у всех разные настройки (isapi фильтры и т.п.). Если переносить при помощи WebDeploy, то не будут сохранены как минимум пользователи.
Ниже я расскажу как можно смигрировать сайты с IIS7 на IIS8.5 максимально прозрачно для клиентов.
Сперва нужно поставить все модули IIS и программы относящиеся к работе IIS (например asp upload, asp jpeg и т.д.).
Поехали — выгрузим пулы приложений и сайты при помощи команд, предварительно создав папку migration на диске C:\
%windir%\system32\inetsrv\appcmd list apppool /config /xml > c:\migration\apppools.xml
%windir%\system32\inetsrv\appcmd list site /config /xml > c:\migration\sites.xml
Далее нужно скопировать в эту папку файл applicationHost.config который лежит в папке C:\Windows\System32\inetsrv\config
После этого заходим на новый сервер и копируем папку migration со старого сервера на новый на диск C.
Далее нужно отредактировать фалы appools.xml и sites.xml. Я решил что лучше переносить сайты по одному, что бы было меньше путаницы и легче в случае чего было откатиться, хоть это и заняло очень много времени, ни кто из клиентов в итоге не заметил перенос.
В общем в appools.xml ищем все разделы связанные с пулом приложений сайта, и оставляем только их, остальные разделы удаляем. Должно быть что то вроде:
<?xml version="1.0" encoding="UTF-8"?>
<appcmd>
<APPPOOL APPPOOL.NAME="test.mytechnote.ru v2.0 (Classic)" PipelineMode="Classic" RuntimeVersion="v2.0" state="Started">
<add name="test.mytechnote.ru v2.0 (Classic)" autoStart="true" enable32BitAppOnWin64="true" managedRuntimeVersion="v2.0" managedPipelineMode="Classic">
<processModel identityType="SpecificUser" userName="domain\testsanglybru_web" password="123123" />
<recycling>
<periodicRestart>
<schedule>
</schedule>
</periodicRestart>
</recycling>
<failure />
<cpu />
</add>
</APPPOOL>
<APPPOOL APPPOOL.NAME="test.mytechnote.ru v4.0 (Classic)" PipelineMode="Classic" RuntimeVersion="v4.0" state="Started">
<add name="test.mytechnote.ru v2.0 (Integrated)" autoStart="true" enable32BitAppOnWin64="true" managedRuntimeVersion="v2.0" managedPipelineMode="Integrated">
<processModel identityType="SpecificUser" userName="exch.zone\testsanglybru_web" password="As12345^" />
<recycling>
<periodicRestart>
<schedule>
</schedule>
</periodicRestart>
</recycling>
<failure />
<cpu />
</add>
</APPPOOL>
</appcmd>
Аналогично делаем в sites.xml:
<?xml version="1.0" encoding="UTF-8"?>
<appcmd>
<SITE SITE.NAME="test.mytechnote.ru" SITE.ID="132" bindings="http/192.168.1.101:80:test.mytechnote.ru,http/192.168.1.101:80:www2.test.mytechnote.ru" state="Stopped">
<site name="test.mytechnote.ru" id="132" serverAutoStart="false">
<bindings>
<binding protocol="http" bindingInformation="192.168.1.101:80:test.mytechnote.ru" />
<binding protocol="http" bindingInformation="192.168.1.101:80:www2.test.mytechnote.ru" />
</bindings>
<limits />
<logFile directory="D:\iis\test.mytechnote.ru\logs" enabled="true" />
<traceFailedRequestsLogging />
<applicationDefaults />
<virtualDirectoryDefaults />
<ftpServer>
<connections />
<security>
<dataChannelSecurity />
<commandFiltering>
</commandFiltering>
<ssl />
<sslClientCertificates />
<authentication>
<anonymousAuthentication />
<basicAuthentication />
<clientCertAuthentication />
<customAuthentication>
<providers>
</providers>
</customAuthentication>
</authentication>
</security>
<customFeatures>
<providers>
</providers>
</customFeatures>
<messages />
<fileHandling />
<firewallSupport />
<userIsolation>
<activeDirectory />
</userIsolation>
<directoryBrowse />
<logFile />
</ftpServer>
<application path="/" applicationPool="test.mytechnote.ru v4.0 (Classic)">
<virtualDirectoryDefaults />
<virtualDirectory path="/" physicalPath="D:\HostingSpaces\Glybin\test.mytechnote.ru\wwwroot" />
</application>
<application path="/test" applicationPool="test.mytechnote.ru v4.0 (Integrated)">
<virtualDirectoryDefaults />
<virtualDirectory path="/" physicalPath="D:\iis\test.mytechnote.ru" />
</application>
</site>
</SITE>
</appcmd>
После этого импортируем пул приложений и сайт в новый IIS:
%windir%\system32\inetsrv\appcmd add apppool /in < c:\migration\apppools.xml
%windir%\system32\inetsrv\appcmd add site /in < c:\migration\sites.xml
Ошибок быть не должно, если появились ошибки проверьте правильность ваших xml файлов.
Далее нужно отредактировать файл C:\Windows\System32\inetsrv\config\applicationHost.config, не забыв при этом сделать его бэкап.
В него, в самый конец перед закрывающим тегом </configuration> нужно добавить секции Location касающиеся переносимого сайта. Берем их из файла applicationHost.config со старого сервера (из папки migration).
Пример этих секций:
<location path="test.mytechnote.ru">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" userName="domain\testsanglybru_web" password="[enc:AesProvider:j81Zp74EwpfGryPqjoIIiCtxMDe/bm4VOFiYr9ojQSV8OM10NNbJECi7zD62KDcGWLzRJNGkzihpACVhb5GZ4qESxEkVkyPDVwwUdqXkTnL4u2ZUEyJcizrz5MaY5RGw:enc]" />
<windowsAuthentication enabled="false" />
<basicAuthentication enabled="false" />
</authentication>
</security>
<asp enableParentPaths="false" />
<handlers>
<add name="ASPClassic (*.htr)" path="*.htr" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\system32\inetsrv\asp.dll" resourceType="File" />
<add name="ASPClassic (*.cdx)" path="*.cdx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\system32\inetsrv\asp.dll" resourceType="File" />
<add name="ASPClassic (*.asa)" path="*.asa" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\system32\inetsrv\asp.dll" resourceType="File" />
</handlers>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-Powered-By" value="ASP.NET" />
</customHeaders>
</httpProtocol>
<modules>
</modules>
</system.webServer>
</location>
<location path="Default FTP Site/glybin">
<system.ftpServer>
<security>
<authorization>
<remove users="*" roles="" permissions="Read" />
<add accessType="Allow" users="glybin" permissions="Read, Write" />
</authorization>
</security>
</system.ftpServer>
</location>
<location path="test.mytechnote.ru/test">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" userName="domain\testsanglybru_web" password="[enc:AesProvider:r5xxe/2LEJGXA2TT8Gz/nxiswNFHzcCn3riax9+CT5iOECEVTscfFemAC9OdOuP0bnXV5WaRwX4HyxNDbGlw+rOXPtQrk6W+Z5sQPnZdWeeY8f/06IJCiUF6TyszIaQ0:enc]" />
<windowsAuthentication enabled="true" />
<basicAuthentication enabled="false" />
</authentication>
</security>
<asp enableParentPaths="false" />
<handlers>
<remove name="ASPClassic (*.htr)" />
<remove name="SecurityCertificate" />
<remove name="ASPClassic (*.cdx)" />
<remove name="ASPClassic" />
<remove name="ASPClassic (*.asa)" />
</handlers>
</system.webServer>
</location>
В них так же нужно поменять в стоках где указан зашифрованный пароль на открытый, посмотреть открытый пароль можно в файле appools.xml, в моем случае нужно изменить строчки
<anonymousAuthentication enabled="true" userName="domain\testsanglybru_web" password="[enc:AesProvider:r5xxe/2LEJGXA2TT8Gz/nxiswNFHzcCn3riax9+CT5iOECEVTscfFemAC9OdOuP0bnXV5WaRwX4HyxNDbGlw+rOXPtQrk6W+Z5sQPnZdWeeY8f/06IJCiUF6TyszIaQ0:enc]" />
на
<anonymousAuthentication enabled="true" userName="domain\testsanglybru_web" password="123123" />
На этом правка конфигов закончена. Теперь нужно скопировать файлы сайта на новый сервер, структура папок должна быть сохранена (то есть если сайт лежал на старом сервере в папке D:\sites то и на новом он должен лежать там же).
После того как файлы скопируются заходим в менджер IIS, переходим в наш сайт и проверяем настройки, нужно позаходить в разные подпункты и удостовериться, что IIS не на что не ругается.
Далее прописываем на своем компьютере в файл hosts новый адрес сервера. Отрываем сайт в браузере. Я специально написал, что открыть сайт в браузере нужно до того как изменим биндинги в настройках сайта, что бы удостовериться, что мы зашли на правильный сервер. В общем должен открыться дефолтный сайт.
После этого нужно зайти в настройки нашего сайта и поменять биндинги.
Опять переходим в браузер на нашем компьютере и обновляем сайт, должен открыться наш сайт на новом сервере. Проверяем что бы все работало (удобно для этого пользоваться Chrome с включенным режимом разработчика). Если все работает то меняем записи на DNS серверах, все готово. После того как DNSы обновяться можно останавливать сайт на старом сервере.
И еще я упоминал asp upload, у них в примерах используется добавление headerа — Content-Length. В новой версии IIS он не поддерживается, его нужно изменить на Content-Size везде где он встречается, если кто нибудь использует asp upload.

