понедельник, 22 февраля 2016 г.

Установка Apache 2.4.18 x64 + PHP 7.0.3 + MySQL 5.7.11 под Windows Server 2008R2 Standard x64

С тех пор как я ставил Apache последний раз под Windows много чего уже поменялось. Уже нет установщика Apache и все делается в ручную. И даже сам дистрибутив качается не с самого сайта Apache, а с других ресурсов. И кроме того тогда Apache был 32-х разрядным. Сейчас он уже x64. Ну что? Поехали!

Будем устанавливать:

  • Apache 2.4.18 x64 (необходимо примерно 44Гб)
  • PHP 7.0.3 x64 (необходимо примерно 57Гб)
  • MySQL 5.7.11 x64 (необходимо примерно 325Гб)

В скобках примерно указано пространство на диске которое необходимо для установки данных продуктов. Для Apache и MySQL оно не включает пространство под сайты, базы данных и логи. Поэтому я размещаю файлы сервисов и данные на разных дисках дабы не мешать все в одну кучу.

1) Сперва создаем структуру каталогов где у нас будут лежать файлы сервера Apache, PHP, MySQL  и всего что еще может понадобиться в будущем для Web сервера. А так же создадим структуру каталогов где у нас будут непосредственно лежать файлы наших сайтов. Я люблю разносить эти две структуры на разные диски. Так как это, для меня лично, удобней для архивирования и безопасности. Вы можете конечно делать по своему, но тогда пути в настройках прописывайте такие как будут у вас.

A0001

1.1) В корне диска D: создаем каталог iServer и в ней папки PHP и Apache.

A0002

1.2)  Прописываем путь к папке PHP в системную переменную PATH. Надеюсь как это сделать не надо объяснять? Если надо то смотрим тут.

1.3) В корне диска E: создаем две папки iSites (тут будут лежать наши сайты) и iLogs (тут будут жить общие логи сервера).
1.4) В папке G:\iSites создаем два подкаталога localhost и testru и далее в каждом из них свои подкаталоги www,log и ssl

A0004[3]

2) Теперь надо скачать бинарники Apache. Все! Приехали! Больше ни каких установщиков нет! Все по взрослому :)

Для того чтобы чтобы скачать идем сюда http://httpd.apache.org/download.cgi и видим примерно это (зависит от даты когда вы будете читать эту мою статью :) ):

A0003

На текущий момент последняя версия Apache 2.4.18. После того как нажмем на указанную ссылку попадаем вот сюда:

A0004

Далее жмем на Apache Lounge и приходим сюда:

A0005

Как видим теперь надо качать не только Apache, но и С++ Redistributable, в нашем случае для x64. Редист надо качать если он у вас в системе не установлен. Если установлен, то качаем только Apache. У меня редиста не было поэтому я качаю и его.

Итого скачано два файла:

A0006

3) Сперва устанавливаем редист. Здесь все просто: запускаем его и ставим.

4) Вытаскиваем (разархивируем) из скачанного архива папку Apache24

A0007

4.1) И все содержимое папки Apache24 (а не саму папку) переносим в каталог D:\iServer\Apache. В результате должно получиться так:

A0008

5) Настраиваем Apache для первоначального запуска редактированием файла D:/iServer/Apache/conf/httpd.conf

5.1) Изменяем значение ServerRoot (строка 37) на "D:/iServer/Apache".

5.2) Изменяем значение DocumentRoot (строка 243) на "E:/iSites/localhost/www"

5.3) Изменяем значение Directory (строка 244) на "E:/iSites"

5.4) Изменяем значение ErrorLog (строка 295) на "E:/iLogs/error.log"

5.5) Изменяем значение CustomLog (строка 324) на "E:/iLogs/access.log" combinedio

5.6) Раскомментируем 130 и 493:
LoadModule logio_module modules/mod_logio.so
Include conf/extra/httpd-vhosts.conf
 

5.7) Раскоментируем и изменяем значение ServerName (строка 219) на localhost:80

5.8) Языковые настройки. Редактируем файлик D:\iServer\Apache\conf\extra\httpd-languages.conf. Комментируем все строки AddLanguage с теми языками, которые нам не нужны. Я оставил только строки:

AddLanguage en .en
AddLanguage ru .ru

Находим строку LanguagePriority и убираем там все языки, которые не нужны. У меня эта строчка выглядит так:

LanguagePriority en ru

Сохраняем файл.

В файле httpd.conf расскомментируем строчку Include conf/extra/httpd-languages.conf.

5.9) Включаем SSI. В файле httpd.conf находим строки:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

И расскоментируем их.
Находим блок <Directory "E:/iSites"> и в нем строку Options Indexes FollowSymLinks. Приводим ее к виду Options Indexes FollowSymLinks Includes

В каталоге E:\iSites\localhost\www создаем файл ssi.html со следующим содержимым:

SSI тест прошел успешно - ssi.html!

Затем, там же создаем файл ssitest.shtml со следующим содержимым:

<!--#include virtual="/ssi.html" -->

6) Подготавливаем файл hosts для проверки работы виртуальных хостов на нашем web сервере. Файл hosts обычно находится по пути C:\WINDOWS\system32\drivers\etc\ и добавляем в него запись 127.0.0.1 test.ru и сохраняем.

A0015[6]

7) Идем в папку D:\iServer\Apache\conf\extra и редактируем файл httpd-vhosts.conf. Приводим его к вот такому виду:

A0014

8) Подготавливаем тестовые файлы для проверки виртуальных хостов.

8.1) В каталоге E:\iSites\localhost\www создаем файлик index.html со следующим содержимым:
<H1>It is my LocalHost</H1>

8.2) В каталоге E:\iSites\testru\www создаем файлик index.html со следующим содержимым:
<H1>It is my TEST.RU</H1>

9) Устанавливаем сервис Apache. Для этого запускаем командную строку от имени администратора и в каталоге D:\iServer\Apache\bin даем команду:

httpd.exe -k install

A0010

После чего служба будет установлена в системе, но еще не будет запущена. В чем можно убедиться в оснастке служб Windows^

A0011

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

10) Запуск сервис Apache можно сделать прямо из этой же оснастки или же из ApaceMonitor.exe которая находится во каталоге D:\iServer\Apache\bin.

10.1) Запустим ApacheMonitor.exe, после этого в системном трее появится ярлык. Кликаем на нем два раза и видим (если сервис не запущен) это:

A0012

Чтобы запустить жмем Start и, если все правильно сделали, то увидите это:

A0013

ApacheMonitor.exe можно поставить в автозагрузку. Для этого жмем Win+R и далее вводим shell:Startup ну и помещаем туда ApacheMonitor.exe.

11) Проверяем что наш сервер работает. Заходим в браузере по адресам localhost и test.ru. И если все правильно сделали то видите это:

A0015

A0016

11.1) Проверяем работу shtml и русского языка. В броузере вводим адрес http://localhost/ssitest.shtml и видим следующее:

A0021

Ура! Товарищи! Первый этап заработал!

12) Устанавливаем PHP 7.0.3. Для этого скачиваем zip архив от сюда http://windows.php.net/download#php-7.0. На момент этой статьи файл назывался php-7.0.3-Win32-VC14-x64.zip.

2016-02-22_173543

12.1) Разархивируем содержимое архива в каталог D:\iServer\PHP

A0017

12.2) Прикручивать PHP к Apache будем как модуль Apache. Для этого идем в каталог E:\iServer\Apache\conf, и добавляем в файлик httpd.conf в окончание блока инструкций LoadModule две строки:
LoadModule php7_module "D:/iServer/PHP/php7apache2_4.dll"
PHPIniDir "D:/iServer/PHP"

12.3)  Находим в файлике httpd.conf инструкции AddType, в конец этого блока вставляем инструкцию:
AddType application/x-httpd-php .php

12.4) Находим в файле httpd.conf блок инструкций DirectoryIndex. И добавляем в инструкцию DirectoryIndex указание на файл index.php. Чтобы в конечном виде инструкция выглядела так:
DirectoryIndex index.html index.php

12.5) В файле httpd.conf в секцию AddHandler добавляем строку AddHandler application/x-httpd-php .php

12.6) Теперь настала очередь конфигурить файл php.ini. Для этого переименовываем или копируем файл php.ini-production (в каталоге D:\iServer\PHP) в файл php.ini.

12.7) В файле php.ini раскоментируем строку extension_dir = "ext" и необходимые вам расширения

12.8) Находим в файле php.ini строку short_open_tag = Off. И приводим ее к виду short_open_tag = On

12.9) Создаем в каталоге E:\iSites\localhost\www файлик phptest.php и пишем в нем следущий код:
<?
phpinfo();
?>

Сохраняем файлик.

12.10) Останавливаем и снова запускаем Apache через консоль управления Apache. После перезапуска Apache можно открыть окно управления сервисом Apache дважды кликнув по иконке в трее. Должны увидеть следующее окошко:

 A0019

Обратите внимание что теперь с версией Apache, так же указывается и версия PHP.

12.11) Тестируем работу PHP. Набираем в браузере http://localhost/phptest.php и видим следующую картинку и радуемся жизни. PHP заработал:

A0020

12.12) Еще для теста включим функции PHP для работы с графикой. Редактируем файлик D:\iServer\PHP\php.ini. Находим строку extension=php_gd2.dll и раскоментируем ее. Перезапускаем Apache.

В каталоге G:\iSites\localhost\www создаем файлик gdtest.php и вводим следующий код:

<?
$pic=imagecreate(350,100);
$piccolor=imagecolorallocate($pic, 255,255,255);
$textcolor=imagecolorallocate($pic, 0,0,0);
$linecolor=imagecolorallocate($pic, 0,0,255);
$text="GD test successful - gdtest.php!";
imagerectangle($pic, 1,99, 349,0, $linecolor);
imagestring($pic,5,30,40, $text, $textcolor);
header("content-type: image/png");
imagepng($pic);
imagedestroy($pic);
?>

Вводим в браузере адрес http://localhost/gdtest.php и видим:

A0022

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

13) Теперь настроим rewrite_module, оч полезная штука :). В файле httpd.conf расскомментируем строчку

LoadModule rewrite_module modules/mod_rewrite.so

Далее ищем конструкцию (у меня начало в строке 230)

<Directory />
    AllowOverride none
    Require all denied
</Directory>

И заменяем в ней строку AllowOverride None на строку AllowOverride All
Затем чуть ниже так же будет просто строка AllowOverride None ее надо поменять на AllowOverride All
Это включает обработку ВСЕХ параметров ВСЕХ .htaccess во всех каталогах.

Теперь проверяем работу модуля rewrite. Рестрартуем Apache

В каталоге E:\iSites\localhost\www создаем файлик .htaccess и в него вносим одну строку

Redirect /index.html http://ya.ru

эта строка перенаправляет с файла index.html на сайт ya.ru

В браузере просто набираем localhost и нас должно перебросить на страничку ya.ru

Если сработало, то все настроили правильно. Ну а если нет, то ищем где накосячили.

14) Устанавливаем MySQL. Идем сюда и качаем установщик mysql-installer-community-5.7.11.0.msi. Стоит обратить внимание что хоть файл msi 32 разрядный, но он устанавливает обе версии x32 или x64 в зависимости от платформы. И так, клацаем по нему и понеслась установка…

A0023

A0024

Затем видим это и начинаем выбирать нужные вам компоненты и удалять не нужные…

A0025

Я выбрал следующие компоненты:

A0026

Затем жмем Advanced Options…

И выбираем куда будет установлен MySQL server и где будут лежать его базы:

A0027

Жмем ОК и Next и видим что установщику для работы Workbench нужен редист. Но как он сообщает он сам попробует его установить

A0028

Жмем Execute и видим:

A0029

Ну и ставим редист … и теперь у нас все хорошо

A0030

Жмем Next

A0031

И жемем Execute…

A0032

A0033

A0034

A0035

Настало время сконфигурировать MySQL…

A0036

Далее задаем root пароль и создаем первого пользователя – администратора баз данных.

A0037

A0038

A0039

A0040

A0042

A0043

Ну и жмем Execute…

A0044

A0045

A0046

После нажатия на Finish запуститься Workbench…

A0047

Подключимся с его помощью к MySQL

A0048

A0049

Если мы видим это, то значит сервер установился и работает. Но Apache пока с ним работать не может.

14.1) Чуть чуть донастроим MySQL. По умолчанию он хранит временные файлы на системном диске, что я считаю не есть гуд. Поэтому переносим временные файлы в другое место. Для этого в файле E:\MySQLdb\my.ini в секции [mysqld] добавляем строку tmpdir=E:/MySQLtemp. Естественно каталог E:\MySQLtemp должен уже быть создан. Перезапускаем MySQL сервис и наслаждаемся видом:

A0050

14.2) Проверяем работу MySQL (пока отдельно без привязки к Apache и PHP). Даем из командной строки в директории D:\iServer\MySQL\bin  команду

mysql.exe -h localhost -P 3306 -u root -p

вводим пароль и даем следующую команду

show databases;

И видим:

A0051

15) Прикручиваем MySQL к Apache, хотя вернее сказать к PHP, ну а он уже прикручен к Apache. Вот такой паровозик получается. Итак редактируем файлик D:\iServer\PHP\php.ini. Находим в нем строчки
extension=php_mysqli.dll
extension=php_pdo_mysql.dll

и раскомментируем их. Затем находим строку mysqli.default_port = и приводим ее к виду mysqli.default_port = 3306. Далее находим строку mysqli.default_host = и приводим ее к виду mysqli.default_host = localhost

Перезапускаем Apache.

В каталоге E:\iSites\localhost\www создаем файлик mysqltest.php и вводим туда следующий код:

<?
try {  
  $DBH = new PDO("mysql:host=localhost", "root", "ВАШ ПАРОЛЬ"); 

foreach($DBH->query('SELECT CURDATE()') as $row) { 
echo "<tr>"; 
echo "<td>" . $row['CURDATE()'] . "</td>"; 
echo "</tr>"; 

    $DBH = null;

 

catch(PDOException $e) { 
    echo $e->getMessage(); 
}
?>

В браузере вводим адрес http://localhost/mysqltest.php и если все сделали правильно, то видим текущую дату. Это значит что PHP может работать с MySQL.

Подведем небольшой итог. Сейчас у нас работает по Windows Server 2008R2 x64 Apache 2.4 x64 + PHP 7.0.3 x64 + MySQL 5.7.11 x64. Все это дело заняло на диске D: достаточно места:

A0052

A0053

Сравните с тем свободным местом на диске D: что было в начале.

Поэтому заранее планируйте пространство на ваших дисках.

Хотя данные сервисов (сайты, логи и базы) пока еще почти ни чего не занимают, но со временем они имеют свойство разрастаться. Поэтому лучше их держать на отдельном диске, так же как и сервисы, дабы ни то ни другое не забивало системный диск.

16) Теперь остается только сделать чтобы сервис Apache  работал не под системной учеткой, а под обычным пользователем. По умолчанию, при установке, сервис Apache запускается под пользователем SYSTEM, который имеет в системе максимальные права. Это не есть гуд. Сейчас будем исправлять эту ситуацию.

16.1) Создаем и настраиваем учетную запись под которой будем запускать Apache.

  • создаем учетную запись iUser и назначаем ей пароль срок действия которого ни когда не истекает
  • проверяем чтобы она входила только в группу пользователи
  • запрещаем для пользователя iUser локальный вход и выставляем право работать в режиме операционной системы и вход в качестве службы через оснастку gpedit.msc

A0054

  • Даем учетной записи iUser право на запись в каталоги необходимые для работы Apache:
    E:\iLogs – общие логи Apache
    В каталоги лог файлов сайтов. В нашем случае: E:\iSites\localhost\log и E:\iSites\testru\log
  • В будущем если понадобятся разрешения на запись в какую либо папку или файл вашего сайта, то эти разрешения необходимо добавить. Но на большинство файлов вашего сайта не должно быть разрешения на запись. И тем более на файл .htacess
  • Перезапускаем службу Apache2.2
  • Ну и проверяем работу зайдя по адресу http://localhost

Если сделали все правильно, то все должно работать.

17) И так у нас все работает хорошо локально. А что если попробовать подключиться к нашему веб серверу по сети? И вот тут сюрпрайз :) Ни кто не сможет подключиться, так как на Windows Server 2003R2, по умолчанию, этот порт закрыт файрволом. Поэтому надо создать правило разрешающие входящее подсоединение к 80 порту.

18) Запрещаем выдавать Apache свою версию и версию PHP. Эта информация может позволить точно узнать уязвима ваша версия Apache и PHP или нет. Лучше это отключить, так как любой, даже самый простой сканер вам покажет эти данные:

2016-02-23_141832

Кстати, тут так же видно что Location у нас http://ya.ru. Это как раз сработал наш mod_rewrite – еще одна защита.

18.1) Чтобы запретить Apache показывать свою версию и версию PHP делаем следующее:

  • В файле раскоментируем строку Include conf/extra/httpd-default.conf
  • В файле D:\iServer\Apache\conf\extra\httpd-default.conf ищем параметр ServerTokens и меняем его значение с Full на Prod и перезапускаем Apache.

И теперь у нас Apache показывает только это:

2016-02-23_142620

Согласитесь это уже приятней :) ?

Для полного счастья осталось только рассказать как прикрутить к Apache SSL сертификаты для виртуальных сайтов. Но об этом в другой статье. Хотя я уже про это писал тут. Но времена меняются и сейчас все чуть по другому, но суть от этого не поменялась.