Всем привет. Мне поставили очередную задачу - перенести сайты которые хо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.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.
Если вам помогла статья, вы можете >>отблагодарить автора<<