Устанавливаем веб-сервер на базе Apache в Linux Debian/Ubuntu Server

Web-сервером можно назвать любой компьютер, который способен откликаться и обрабатывать сетевые запросы по протоколу HTTP. Для этого на нём должен быть установлен и запущен HTTP-сервер.HTTP-сервер Apache является индустриальным стандартом для применения во многих областях для решения задач, связанных с развертыванием и эксплуатаций web-приложений. Он опробован в сотнях тысяч проектах и имеет хорошую совместимость со многими популярными прикладными системами и сетевыми операционными системами, предоставляющими высоконадёжные интернет-сервисы. Хотя HTTP-сервер Apache не является лидером по скорости работы и оптимальности потребления вычислительных ресурсов, взамен нам предлагаются достаточно ценные эксплуатационные качества, такие как простота настройки, гибкость, надёжность и низкий порог вхождения при освоении. Практически можно говорить о том, что мы имеем возможность работать по принципу «одни раз настроил – и забыл». Таким образом, если Вам не известны другие альтернативы или Вы не хотите тратить время на внедрение каких бы то ни было других более экзотических HTTP-серверов, например, с возможно более высокой скоростью работы, но с кучей подводных камней, о существовании которых известно только очень узкому кругу «фанатиков», то Ваш несомненный выбор – это HTTP-сервер Apache. Работая с этим и продуктом, Вы никогда не останетесь один на один с проблемами, так как имеется много хорошей документации и большое сообщество специалистов, давно работающих с этим проверенным временем решением.

Следующим важными элементами web-сервера, на котором работают качественные web-приложения, являются система управления базами данных MySQL и «движок» для исполнения серверных скриптов - PHP. Данный комплект стал настолько распространённым, что для краткости ему присвоили акроним LAMP-сервер по первым буквам входящим в состав стека программных продуктов – Linux, Apache, MySQL, PHP.

Мы рассмотрим установку web-сервера на примере дистрибутива Debian/Ubuntu операционной системы Linux. В различных версиях платформы имеются свои правила совместимости между версиями компонент и версиями внешних приложений, запущенных поверх. На момент написания статьи имелись следующие сочетания версий совместимости между отдельными элементами ПО:

·         Debian 8 Jessie: Apache 2.4.10, PHP 5.6.7, MySQL 5.5.43

·         Debian 7 Squeeze: Apache 2.2.22, PHP 5.4.39, MySQL 5.5.43

·         Ubuntu Server 14.04 LTS: Apache 2.4.7, PHP 5.5.9, MySQL 5.5.43

·         Ubuntu 12.04 LTS: Apache 2.2.22, PHP 5.3.10, MySQL 5.5.43

 

Для взаимодействия Ваших программ с выше указанными выпусками не всегда следует правило «чем более поздний, тем лучше». Дело в том, что версии релизов Ubuntu 14.04 и Debian 8, содержащие Apache 2.4, не совместимы с некоторыми движками систем управления контентом и серверами приложений, как в например, сервер приложений 1С:Предприятие. Последний совместим с версией Apache только до версии 2.2 включительно. Поэтому возьмите за правило перед установкой или обновлением версий компонент сервера проводить сверку на предмет совместимости их версий между собой и планируемых к установке веб-приложений.

При работе в контейнере OpenVZ версию MySQL из  дистрибутивов версий Linux Ubuntu Server 12.04/14.04 следует заменить на на версию версию от MySQL Community (разработчики) или один из форков, например, MariaDB.

Оптимальным решением в плане совместимости мы примем использование в основе платформы дистрибутив Linux на базе Debian 7. Он содержит набор компонент, имеющий наибольшую степень совместимости с существующими прикладными web-приложениями.

 

Все приведённые ниже команды должны выполняться от имени суперпользователя и предворяться командой-префиксом sudo.

Установка и настройка Apache.

 

Делается это одной простой командой, по которой происходит скачивание и установка соответствующего пакета из репозитория:

 

apt-get install apache2

 

Чтобы проверить установку и факт запуска http-сервера, обращаемся по IP-адресу локального хоста и должны увидеть стандартную страницу заглушку:

 

В версии Apache 2.4страница выглядит несколько иначе, но смысл её появления идентичен.

 

Apacheхранит настройки в файле /etc/apache2/apache2.conf. Указываемые там параметры имеют глобальное значение для поведения веб-сервера и зачастую требуют его перестарта. Для включения или выключения специфичных настроек имеются более удобные инструменты, а хранение самих настроекассоциировано с папкамиmods-enabled и sites-enabled, которые хранят символические ссылки на директории, соответственно, mods-available(для настроек модулей)и sites-available(для настроек виртуальных хостов). Именно в них и следует располагать файлы с настройками.

Распределим права доступа к файлам и папкам сайта. По умолчанию его владельцем является пользователь www-dataиз одноименной группы, представляющей http-сервер Apache. Именно он должен исполнять быть владельцем, иначе, результаты будут непредсказуемые. Но более удобно и безопасно исполнять содержимое сайта от имени прикладного пользователя. Для этого мы используем пакет apache2-mpm-itk:

 

apt-get install apache2-mpm-itk

 

В папке sites-enabled хранится конфигурация сайта по умолчанию. В ней описывается сайт, страница-заглушка которого хранится в папке /var/wwwили/var/www/htmlдля Apache 2.4. Если мы туда добавим ещё описания для других сайтов, то по умолчанию будет выводится первый сайт по порядку следования настроек.

 

Рассмотрим шаги по определению настроек для нового сайта с именем example.com.

Создадим папку для сайта и присвоим ей владельца, от имени которого будет идти обращение к содержимому файлов сайта:

 

mkdir /var/www/example.com
chown andrey:andrey /var/www/example.com

 

Создаем и редактируем файл настроек нашего виртуального хоста:

 
touch /etc/apache2/sites-available/example.com

 

Версия Apache2.4хранит настройки виртуального хоста в файле с расширением .conf, поэтому команда примет соответствующий вид:

 

touch /etc/apache2/sites-available/example.com.conf

 

Содержание файла заполним следующим текстом:

ServerName example.com
ServerAdmin mail@example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com
CustomLog${APACHE_LOG_DIR}/example.com.access.log combined
ErrorLog${APACHE_LOG_DIR}/example.com.error.log
AssignUserID andrey andrey
 
Options -Includes -Indexes -ExecCGI
Разберём назначение элементов файла подробнее. Секция указывает на то, по какому IP-адресу и порту доступен данный хост. Если нужно принимать соединения на всех сетевых интерфейсах, то вместо адреса указывается «звездочка» - *.

Опишем назначение внутренних директив секции .

  • ServerName–полное доменное имя, которое обслуживает наш виртуальный хост. В нашем случае это example.com;
  • ServerAdmin -адрес ящика электронной почты, на который администратор домена сможет прочитывать сообщения об ошибках в работе http-сервера;
  • ServerAlias–псевдоним имени хоста в виде www.example.com, чтобы сайт был доступен по обеим видам адресов как с www, так и без него;
  • DocumentRoot–корневая папка размещения сайта на виртуальном хосте. Например, /var/www/example.com;
  • CustomLog–полный путь к журналу доступа к веб-серверу. Переменная окружения ${APACHE_LOG_DIR}возвращает стандартную папку логов веб-сервера. Таким образом, мы сможем воспользоваться механизмом ротации логов для всех сайтов. Рекомендуется в имени лог-файлов указывать имя хоста для лучшего различения источника информации в каждом конкретном лог-файле. Опция combinedопределяет формат лога, заданный в apache2.conf;
  • ErrorLog–полный путь к журналу ошибок. Аналогичен настройкам журнала доступа, только не нужно указывать формат лога;
  • AssignUserID–Если установлен пакет apache2-mpm-itk, то в данной директиве можно указать имя пользователя и его группу (через пробел), от имени которого будет работать виртуальный хост. В директиве нет необходимости, если пакет apache2-mpm-itk не установлен;

Вложенная секция <Directory /var/www/example.com> включает в себя директивы для корневого каталога виртуального хоста. Директива Options содержит опции, которые имеют обозначения для включения (знак «+») или выключения (знак «-») своего действия напротив каждой конкретной опции. Рассмотрим их назначение:

·         ±Includes – включает/выключает дополнении на стороне сервера SSI (Server Side Includes). Мы выключаем эту опцию из соображений безопасности. Данная опция может включаться, если этого явно требует работа сайта.

·         ±Indexes - включает/выключает доступ к выводу содержимого каталога в окне браузера, если в нем нет индексного файла. Опция выключена в целях безопасности.

·         ±ExecCGI - включает/выключает исполнение CGI-сценариев. Опция выключена в целях безопасности.

Мы затронули далеко не все опции и директивы. Рассматривать их в полном объём не является целью нашего статьи, но вы можете узнать все подробности в материалах официальной документации.

 

Не забываем закрыть открытые секции и , сохранить файл. Теперь у нас есть конфигурация для виртуального хоста.

Для того чтобы включить сайт, делается символическая ссылка на файл конфигурации в каталоге sites-enabled. Выключается сайт удалением соответствующей ссылки. При этом можно использовать как команду ln –s или специальную утилиту, входящую в состав Apache:

a2ensite example.com 
Данная команда включает сайт, соответствующий конфигурационному файлу example.com из папки sites-available. Без расширения .conf файл указывается для версии Apache 2.4 . 
Соответственно, выключение происходит по команде:
a2dissite example.com
Чтобы изменения вступили в силу, после каждого такого действия необходимо выполнить перезапуск Apache:
service apache2 reload
 
Проверим работу виртуального хоста, разместив в его корневой папке тестовый html-файл. Затем обратимся в браузере к домену по имени. При этом первой записью о виртуальном хосте в конфигурации должна быть запись о нашем сайте.
 
Создаём индексный файл:
touch /var/www/examlpe.com/index.html
 
Заносим в него строку вида:
 

OK!

 
При обращении в браузере к нашему хосту examlpe.com мы увидим следующее:
2a.jpg
 
 
 
Установка и настройка PHP.
 
Если Вы планируете использовать Ваш http-сервер только для размещения статического содержимого или сторонних web-приложений типа сервера приложений 1C:Предприятие для доступа к базам данным, то на данном этапе можно сказать, что у нас всё для этого готово и дальнейший материал не актуален. 
Но, если хотите организовать эксплуатацию динамических web-приложений, например, на базе систем управления контентом, то на сервере необходима поддержка скриптового языка серверного программирования PHP.
 
Для установки соответствующего пакета выполним команду:
apt-get install php5
 
В результате устанавливаются интерпретатор PHP и его дополнительные модули для взаимодействия с http-сервером Apache. Гибкость управления модулями PHP обеспечивается аналогично модулям Apache за счет размещения модулей в одной папке, а в другой - хранением символьных ссылок, которые создаются или удаляются по необходимости.
 
В стандартной поставке набора PHP-модулей удовлетворяются функциональные потребности для большинства проектов. Но некоторые CMS могут потребовать наличие дополнительных модулей, которые нужно будет ставить отдельно.
 
Примером такого модуля может служить модуль для работы с графикой на базе графической библиотеки GD2. В этом случае мы выполняем установку соответствующего модуля следующей командой:
apt-get install php5-gd
Так как этот модуль взаимодействует с http-сервером, то для того, чтобы у них возникла между собой взаимная «видимость» необходимо перезапустить Apache следующей командой:
service apache2 reload
Хотя библиотека GD2 обладает высокой скоростью работы и низким потреблением ресурсов, но платой за это является низкое качество получаемых изображений. Альтернативным решением является утилита  imagemagick. В практическом плане имеет смысл установить обе утилиты и на конкретных задачах выбрать наилучший вариант. Если у Вас достаточно ресурсов на сервере, то лучшим вариантом, несомненно, будет использование imagemagick. Следующая команда устанавливает пакеты для самой утилиты и модуль для взаимодействия с PHP:
apt-get install imagemagick php5-imagick
 
На этом этапе мы модем проверить работоспособность PHP и его взаимодействие с Apache. Для этого в корневой папке сайте создадим тестовый скрипт с помощью команды вида:
touch /var/www/examlpe.com/info.php
 
В тексте скрипта напишем:


phpinfo();
?>
Сохраним скрипт и в браузере перейдём по адресу http://example.com/info.php. Если всё установлено правильно, то браузер выдаст стандартную страницу о PHP, его настройках и модулях и т.д.
 
 
 
 
3a.jpg
Установка и настройка MySQL.
 
Сервер баз данных MySQL является третьим компонентом полноценного web-сервера. Ему отводится роль накопления и хранения структурированной информации сайта, часть которой создаётся пользователями в процессе пользования сайтом, а часть является служебной. Она формируется в процессе настройки сайта и в последующем управляет его свойствами и поведением в эксплуатации. Таким образом, база данных играет ключевую роль в работе динамических сайтов, храня в своих структурах большую часть их контента. Если теряем базу, то, по сути, теряем и сам сайт.
 
Как и для других компонент сервера, ставим пакет компонента и для дополнительного модуля взаимодействия между PHP и MySQL:
 apt-get install mysql-server php5-mysql
При установке пакета для MySQL будет запрашиваться пароль для суперпользователя с именем root (не путать с суперпользователем системы Linux).
4a.jpg
Для управления MySQL-сервером и его содержимым существует утилита phpMyAdmin, которая по определённому адресу предоставляет web-интерфейс в окне браузера. Установим её командой:
apt-get install phpmyadmin
 
Инсталлятор данной утилиты предлагает варианты автоматической настройки для нескольких http-серверов: Apache и Lighttpd. В специальном диалоге выбираем нужный вариант:
 
5a.jpg
 

В результате наша web-утилита управления сервером баз данных становится доступной по адресу http://example.com/phpmyadmin. При обращении к ней запрашиваются учетные данные. В нашем случае – это пользователь root и его пароль (других пока нет). Мы всё это указывали при установке MySQL.

При использовании Ubuntu 14.04 возможно наличие проблемы с использованием расширения mcrypt, несмотря на то, что в зависимостях PHP соответствующий модуль имеется.

 

6a.jpg

Убеждаемся, что в etc/php5/mods-available требуемый файл имеется (значит, модуль установлен), а вот в файле /etc/php5/apache2/conf.d ссылка на данный модуль отсутствует. Значит, по какой-то причине модуль не подключился. Такое поведение замечено в дистрибутивах с Apache 2.4, как это имеет место в Debian 8.

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

ln -s /etc/php5/mods-available/mcrypt.ini /etc/php5/apache2/conf.d/20-mcrypt.ini

7a.jpg

 

На данном этапе больше никаких внешних настроек наш сервер MySQL не требует. Вопрос с кодировкой символов внутри базы также имеет решение по умолчанию – это UTF-8 и для этого ничего специально предпринимать не нужно.

Остался одни вопрос, связанный с безопасностью работы с базами данных на нашем сервере, так как все обращения сейчас будут происходить от имени суперпользователя root. А это не является безопасным. Решим проблему созданием дополнительных пользователей и наделением их достаточными правами для управления собственными базами.

 

Запустим в браузере утилиту phpMyAdmin и перейдём на вкладку Привилегии (Пользователи). Кликнем по ссылке Добавить нового пользователя.

 

 

 

 

 

8a.jpg

 

После заполнения формы прокрутим книзу страницу, чтобы установить опцию Предоставить полные привилегии на базы данных подпадающие под шаблон (имя пользователя\_%).

 

 

 

9a.jpg

 

Данная установка автоматизирует присвоение полных прав пользователям, при условии, что имя базы отвечает некоему шаблону, например, ivanov_base1 или petrov_base2 означает, что пользователь с именем ivanov обладает всеми правами над базой ivanov_base1, пользователь petrov над базой petrov_base2 и т.д. . Такая схема также позволяет быстро находить «хозяина» базы данных. Остальные параметры не нуждаются в изменении на данном этапе.

Чтобы проверить работоспособность нашего MySQL-сервера, создадим новую базу данных в phpMyAdmin по ссылке Базы данных -> Новая база данных.

 

 

 

 

 

 

10a.jpg

Кодировка базы задаётся при создании. Многие прикладные системы в интернете сегодня по умолчанию используют UTF-8 (utf8_general_ci). Однако старые версии всё ещё могут пользоваться национальными версиями кодировок. Поэтому, если дамп из базы, созданной в кодировке UTF-8 «ляжет» на базу системы, которая до этого была создана в кодировке Windows-1252, то вместо русских букв мы увидим на страницах сайта вот такой «мусор».

11a.jpg

 

 

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

12a.jpg

 

Если мы сделали всё правильно, то у нас пользователь, имя которого упомянуто в имени базы данных, получает полные привилегии на «свою» базу данных (аналогичные пользователю root), в то время как мы никаких специальных усилий не прилагали для этого.

Теперь на данном этапе мы имеем полностью готовый к эксплуатации web-сервер, который пригоден в качестве основы для практически любой современной прикладной web-системы будь то система управления контентом или любая другая прикладная система специального назначения, построенная по принципу custom-разработки.