Windows 2012 R2 + IIS + MS SQL + PHP установка, настройка, подводные камни

Спешу поделиться опытом установки и настройки указанных в названии монстров!



К сожалению, такая связка не столь популярна, чтобы найти что-то стоящее по этой теме в поисковиках. Но мне удалось отрывками и кусками все-же поймать свой Дзен.

В данном примере я буду использовать свои преимущества студента. Поэтому ПО от Microsoft я буду брать максимально свежее по программе Dreamspark.

Итак, составим задачу.
1. Установить MS SQL Server 2014;
2. Установить роль «Веб-сервер (IIS)» версии 8;
3. Установить PHP 5.4.24;
4. И, конечно же, заставить все это работать в связке на Windows 2012 R2 (установку и подготовку сервера я рассматривать, конечно, не буду).

В наличии имеется домен: test.local

Установка и настройка MS SQL Server 2014
Усложнить данный этап я решил лишь тем, что сервер с БД у нас будет выделенным. Т.к. в большинстве случаев именно тогда возникает необходимость «прикрутить» IIS+PHP, когда база уже чем-то «набита» и более того, находится удаленно.

Имя сервера: sql.test.local

Установка проходит крайне примитивно, нажимая «Далее». У меня были установлены все компоненты экземпляра, за исключением «Репликации SQL Server». Указаны стандартные пути.
Выбран свой, именованный экземпляр «bd».



Стандартные учетные записи служб.



Выбран «Смешанный режим». Установлен пароль MSsql2014 для учетной записи «sa», а так-же добавлен текущий пользователь системы. (Нажать кнопку «Добавить текущего пользователя».



Таким образом. Мы закончили установку MS SQL Server 2014.
Теперь вы можете создать тестовую базу с помощью, идущего в комплекте с установкой, Microsoft SQL Server Management Studio. В данном примере имя БД «test». (Некоторые данные на скрине, такие как Сервер, Соединение, Владелец были умышленно затерты на скрине, т.к. подлинные скрины с тестового полигона были утеряны).



Теперь мы сразу настроим возможность подключения к текущему экземпляру «извне» (в данном примере с локальной сети).
Для этого нам необходимо открыть оснастку Sql Server Configuration Manager. Перейти в раздел Сетевая конфигурация SQL Server — Протоколы для BD и открыть свойства TCP/IP. Перейти на вкладку IP-адреса и самое важное, что здесь необходимо сделать, это: указать порт 1433 (в данном примере используемый порт по умолчанию) для требуемого IP адреса (в данном примере адрес сервера с MS SQL 192.168.2.27) и установить соединение по этому IP активным. IPv6 и другие адреса — вы можете включить или отключить, по своей необходимости. (Важное отмечено на скриншоте).



После применения настроек вы получите соответствующее уведомление.
После этого нам необходимо выбрать Службы SQL Server. И перезапустить SQL Server (BD).



Остался финальный этап. Создать соответствующее правило в Брандмауэре. А именно разрешить входящие соединения по порту 1433. Для более детального ознакомления с этим процессом можно обратиться за оригинальным руководством на msdn.

В моем же случае брандмауэр просто выключен. (Подобную практику ни в коем случае не рекомендую, как руководство к действию).



Итак, сервер MS SQL, у нас установлен и настроен для внешних подключений.

Далее устанавливаем штатными средствами роль Веб-сервера (IIS).

В компонентах дополнительно ставим галку напротив: функции .NET Framework 3.5, который включает в себя версию .NET 2.0 (он нам потребуется для установки Диспетчера PHP, чуть ниже).

В компонентах самого IIS — достаточно оставить все по умолчанию.

А вот дальше, наверное, самое главное. Мы качаем и устанавливаем Web-платформу от Microsooft.
Этот чудесный инструмент поможет нам решить многие проблемы.

Установка примитивная, поэтому не буду ее детально описывать.

После запуска веб-платформы вам будут доступны для установки очень много компонентов. Веб-платформа автоматически выбирает язык, основываясь на установленном в системе. Поэтому у меня русские названия продуктов. Если у вас Windows установлен с другой локализацией — названия продуктов могут отличаться!

Направляемся в продукты и выбираем то, что нам необходимо:

PHP 5.4.9 (на момент написания статьи к установке была допустима версия PHP 5.6.0, а так-же версия PHP 5.5.11 но к сожалению, как я не танцевал — заставить их работать на php-cgi так и не удалось. Возможной причиной тому — отсутствие драйверов в списке).
Вместе с этим продуктом автоматически поставляются еще 2:
Диспетчер PhP для IIS — крайне полезный и удобный в обращении. (именно для него и требуется компонент .NET Framework 3.5\2.0).
Драйверы Microsoft 3.0 для PhP версии 5.4 для SQL Server в IIS (как раз те самые драйвера, которых нет в наличии веб-платформы для версий 5.5.11 и 5.6.0



На этом первичная установка готова. Как оказалось — все легко и без проблем.

Теперь можно открыть диспетчер PHP в IIS и выбрать там функцию «Проверить phpinfo()». Действительно, очень удобно! Тут же вам будут даны рекомендации по оптимальной конфигурации PHP, кроме того, вы можете установить или удалить расширения PHP.



После просмотра phpinfo, убедившись, что все работает отлично, можно создать тестовый скрипт, который проверит наше подключение к БД.
Спасибо «неизвестному солдату» из песочницы. Именно из его статьи я позаимствовал этот скрипт.

<?php

$serverName = "SQL\BD"; // Пишем имя компьютера с БД и имя экземпляра. если instance и port стандартные, то можно не указывать
$connectionInfo = array("UID" => "sa", "PWD" => "MSsql2014", "Database"=>"test"); //В принципе итак все понятно, UID - имя пользователя. PWD - Пароль и наша созданная тестовая база данных
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn )
{
echo "Connection established.\n";
}
else
{
echo "Connection could not be established.\n";
die( print_r( sqlsrv_errors(), true));
}


/* Close the connection. */
sqlsrv_close( $conn);
?>


Если все прошло успешно и вы ничего не пропустили, то результатом выполнения у вас будет надпись:

Connection established.

В противном случае, вы увидите:

Connection could not be established. И ошибки, полученные в результате обработки.

Надеюсь, ничего не забыл. И буду рад, если эта статья кому-то пригодится!

Использованные источники
Web Platform от Microsoft
Немного MSDNа
Статья из песочницы
Поделиться публикацией

Комментарии 22

    +2
    Мсье знает толк…
      +2
      именованный инстанс потому что так захотелось или чтобы продемонстрировать настройку именно для именованого (тогда стоило бы указать разницу при настройке и для дефолтного)?
      зачем полное отключение фаервола? может стоило рассказать как его настроить для такой связки?
        0
        dreik, по сути, статья\обучающий материал был написан, основываясь на потребностях в текущих реалиях. Именно для статьи — делал тестовый полигон, т.к. в боевом варианте уже все было настроено и отлажено. Поэтому и при установке сделал именованный инстанс.
        Полное отключение фаервола — как знак того, что Брандмауэр влияет на дальнейшую настройку, а главное работу. А детальное описание настроек фаервола — уже тема безопасности, которую я тут не планировал рассматривать.
        Можно еще сверху много материала написать и по настройке фаервола и по PHP в среде IIS — но это уже будет совсем другая история :)
        0
        Мне кажется было бы разумно оставить майкрософтовое майкрософтовому, а остальное — *никсовому.
        То есть MSSQL разумно было бы крутить на Windows, остальное на «родной» среде. Вот как в эту связку nginx поставить? Только не надо спешить говорить, что он не нужен.
          +1
          Задачи для реализации возникают различные. Описанная схема выше — не исключение :)
          Но я не совсем понял, что значить «в эту связку»? Nginx рядом с IIS ??? Или вас интересует как Nginx ставить на Windows? На эту тему натыкался на статью habrahabr.ru/post/150972/ В ней, комрад ставил Nginx на Windows 8. Думаю, что по аналогии, его статья\инструкция, вполне применима и на Windows 2012
            +1
            Поймите правильно, я не хочу разводить флейм на тему ОС. Речь о стеке технологий. Всё было бы очевидно, если бы целевой платформой являлся ASP.NET. Для такого может и пригодился бы nginx на Windows. Но речь о php.
            Давайте окинем взглядом с чем мы сталкиваемся.
            1. Необходимость покупки лицензий или более дорогой хостинг.
            2. Собирание грабель, когда надо добавить какое-то расширение PECL и прочие нюансы работы php в среде Windows.

            Зачем эти сложности, когда есть та же Ubuntu, огромное количество мануалов, доступных через гугл на тему конфигурирования, всё бесплатно и безопасно?
              0
              Я думаю, если-бы вы не хотели «начинать»- то и не начали-бы :) В этом истина.
              Все остальное похоже НЕ на конструктив, а на попытку холивара :)
              Пардон, но в вашем последнем сообщении — нет и доли того, что имело-бы смысл обсуждать под этой статьей.
              «очевидные» стеки технологий или о том как «было-бы лучше», а так-же о минусах и плюсах данного решения обсуждать, а уж тем-более критиковать (как это делаете вы) — неуместно. Т.к. статья носит обучающий характер Конкретного! решения. И уж если подобное решение реализуемо — значит это кому-то нужно.
              В своих лабороторных\боевых кулуарах — вы имеет право сделать ТАК, как вам угодно ;)
                0
                Жаль вы не прокомментировали мои 2 пункта, но ок, давайте тогда с другого конца зайду.
                Ваша боевая среда и девелоперское окружение идентичны?
                Если нет, тогда в чём целесообразность обучению такой экзотике?
                  0
                  Жаль, что вы невнимательно прочитали даже начало статьи и совсем не читали другие комментарии ;)
                    0
                    Знаете, я действительно имею один существенный недостаток — поспешность. Каюсь.
                    Но я перечитал начало статьи. Перечитал комментарии, благо их тут мало. И ответов не увидел.
                    Так всё-таки вы ответите на мои вопросы?
                      0
                      Если вы даже перечитав не нашли ответ на вопрос: используется-ли данная схема где-то — то вы прочитали невнимательно.
                      Все остальные вопросы и ответы — можно расценивать, как бессмыслицу. Поэтому давайте закончим ;) Ушел*
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              В связке веб-сервер + БД + интерпретатор языка по данной теме «родным» является веб-сервер + интерпретатор. Если в конкретном ПО, то я говорю о nginx + Apache/mod_php или php-fpm.
              Если Windows считать «родной» средой для этих технологий, то почему апдейты на php выходят для неё с задержкой и почему возникают проблемы, когда надо поставить какое-нибудь расширение PECL типа libevent (https://www.google.ru/search?q=php+windows+libevent)?
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Вы задали мне вопрос — я ответил, но вы вдруг меняете тему, ничего не ответив по существу, а потом ещё добавляете какие-то фантазии про линуксоидов. Вот и я думаю — какое это имеет отношение к теме?
                  • НЛО прилетело и опубликовало эту надпись здесь
            0
            А возможно ли было использование PHP-FPM и расширения PDO для работы c MSSQL?
              0
              Я полагаю, что возможно. Не совсем понял вопрос о «Диспетчере PHP» т.к. он существует все-же не для связки PHP+MSSQL, а для удобной работы IIS+PHP.
              А вот что касательно экстеншинов, то даже в дефолтовом варианте развертки — pdo_sqlsrv имеется и подгружать его отдельно не нужно. В работе не тестировался. Поэтому можно вполне пробовать.
              0
              Было бы интересно посмотреть на PowerShell скрипт для развертывания всего этого) Ведь как минимум у IIS есть куча консольных команд, у WebPi то же. У Сиквела не ковырял, но думаю то же можно в скрипт обернуть.
                0
                Кому интересно провел тесты производительности на VM от ажуры тачка Standard_A2 (2 ядра, 3,5 ГБ памяти) winserver2012 php 5.5.17 и
                хостингом тайм веба за 150р, и своей локальной машиной.

                www.php-benchmark-script.com/

                Windows azure winserver 2012 2Ггц ядро — 10.093 sec.
                PHP version : 5.5.17
                Platform : WINNT
                --------------------------------------
                test_math                 : 2.117 sec.
                test_stringmanipulation   : 4.591 sec.
                test_loops                : 1.949 sec.
                test_ifelse               : 1.436 sec.
                --------------------------------------
                Total time:               :10.093 sec.
                


                Таймвеб тариф 150р в мес:
                Тачка не известна — 3.069 sec.!
                PHP version : 5.5.17
                Platform : Linux
                --------------------------------------
                test_math                 : 0.989 sec.
                test_stringmanipulation   : 1.006 sec.
                test_loops                : 0.587 sec.
                test_ifelse               : 0.487 sec.
                --------------------------------------
                Total time:               : 3.069 sec.
                


                Локальная тачка i5 3570К 3.4 — 3.838 sec. (разгон до 3.7Ггц)
                PHP version : 5.5.17
                Platform : WINNT
                --------------------------------------
                test_math                 : 0.838 sec.
                test_stringmanipulation   : 1.984 sec.
                test_loops                : 0.622 sec.
                test_ifelse               : 0.394 sec.
                --------------------------------------
                Total time:               : 3.838 sec.
                


                Работа скрипта зависит от частоты процессора напрямую… а во второых… шаредх хостинг на линуксе на таймвебе уделывает по времени мою локальную тачку.
                  0
                  тачка таймвеба стала известна… новые ксеоны которые по 70 000р штука до кризиса
                  0
                  >>> на момент написания статьи к установке была допустима версия PHP 5.6.0, а так-же версия PHP 5.5.11 но к сожалению, как я не танцевал — заставить их работать на php-cgi так и не удалось.

                  php 5.6.24 тоже, cgi — ни в какую.
                  Полез в C:\Program Files (x86)\PHP\v5.6\
                  запустил php-cgi.exe и получил ошибку: Не найдена библиотека msvcr110.dll
                  Поставил библиотеки из SamDrivers пака и всё заработало.

                  P.S. Это для истории ;)

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое