Вы здесь

Перенос сайтов с IIS7 на IIS8.5


Всем привет. Мне поставили очередную задачу - перенести сайты которые хо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.

1 0

Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.


Если вам помогла статья, вы можете >>отблагодарить автора<<