Учебно-методические материалы для студентов кафедры АСОИУ

Установка и настройка веб-сервера Apache

Веб-сервер Apache - это открытое программное обеспечение, используемое на подавляющем большинстве серверов www (по данным http://netcraft.com). Популярность Apache обусловлена его надежностью, гибкостью и высокой производительностью.

Логотип Apache

Цель работы: Получить практические навыки по развертыванию веб-сервера под управлением Apache (версия 2.x), включая установку httpd, основные настройки и конфигурирование виртуальных хостов.

Задания к работе

  1. Установить веб-сервер Apache в основной конфигурации в качестве системного сервиса (runlevel 3 и 5).
  2. Настроить 2-3 именованных виртуальных хоста, доступных с любого компьютера в пределах дисплейного класса, где проводится лабораторная работа.

Указания к работе

Установка Apache

Установка веб-сервера Apache в современных дистрибутивах Linux не представляет особых сложностей и выполняется с помощью системных утилит управления пакетами. Так, например, установку Apache в .deb-based дистрибутивах (Debian, Ubuntu и т.п.) можно выполнить с помощью apt-get:

sudo apt-get install apache2

Проверить установку (на примере .deb-дистрибутива, с отображением связанных пакетов):

aag@stilo.asoiu:~$ dpkg --list apache2*
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Имя Версия Описание
+++-===================-===================-======================================================
ii apache2 2.2.12-1ubuntu2 Apache HTTP Server metapackage
un apache2-common <нет> (описание недоступно)
un apache2-doc <нет> (описание недоступно)
un apache2-mpm <нет> (описание недоступно)
un apache2-mpm-event <нет> (описание недоступно)
un apache2-mpm-itk <нет> (описание недоступно)
ii apache2-mpm-prefork 2.2.12-1ubuntu2 Apache HTTP Server - traditional non-threaded model
un apache2-mpm-worker <нет> (описание недоступно)
un apache2-suexec <нет> (описание недоступно)
un apache2-suexec-cust <нет> (описание недоступно)
ii apache2-utils 2.2.12-1ubuntu2.1 utility programs for webservers
ii apache2.2-bin 2.2.12-1ubuntu2 Apache HTTP Server common binary files
ii apache2.2-common 2.2.12-1ubuntu2 Apache HTTP Server common files
aag@stilo.asoiu:~$

Установка в rpm-based система (RHEL, openSuSE, AltLinux, Fedora Core и т.п.) может быть выполнена с помощью, например, установщика zypper:

aag@stilo.asoiu:~$ sudo zypper install apache2

Проверить установку можно, например, так:

aag@aag:/etc/apache2/sysconfig.d> zypper se apache2
Загрузка данных о репозиториях...
Чтение установленных пакетов...
С | Имя | Заключение | Тип --+-------------------------------+--------------------------------------------------+-----------------------
i | apache2 | Веб-сервер Apache версии 2.2 | пакет | apache2 | Веб-сервер Apache версии 2.2 | пакет с исходным кодом
| apache2-devel | Файлы заголовков Apache 2.2 | пакет | apache2-doc | Пакет с дополнительной документацией. | пакет | apache2-event | Apache 2 event MPM (Multi-Processing Module) | пакет i | apache2-example-pages | Примеры страниц для web-сервера Apache 2 | пакет | apache2-icons-oxygen | Значки Oxygen для Apache 2 | пакет | apache2-itk | Apache 2 "ITK" MPM (Multi-Processing Module) | пакет | apache2-mod_apparmor | AppArmor module for apache2 | пакет | apache2-mod_auth_ntlm_winbind | Enables Apache to authenticate users against M-> | пакет i | apache2-mod_dnssd | Модуль Apache2 для поддержки Zeroconf через DN-> | пакет | apache2-mod_fcgid | Alternative FastCGI module for Apache2 | пакет i | apache2-mod_jk | Connectors between Apache and Tomcat Servlet C-> | пакет | apache2-mod_macro | Define and Use Macros within the Apache Config-> | пакет | apache2-mod_mono | Run ASP.NET Pages on Unix with Apache and Mono | пакет | apache2-mod_perl | Встроенный Perl для Apache | пакет | apache2-mod_perl-devel | Embedded Perl for Apache - Development package | пакет i | apache2-mod_php5 | Модуль PHP5 для веб-сервера Apache 2.0 | пакет | apache2-mod_python | Модуль Python для веб-сервера Apache 2 | пакет | apache2-mod_scgi | Apache module named mod_scgi that implements t-> | пакет | apache2-mod_security2 | ModSecurity Open Source Web Application Firewall | пакет | apache2-mod_tidy | Apache Module using the Tidy Library to Clean -> | пакет | apache2-mod_wsgi | Python WSGI adapter module for Apache | пакет i | apache2-prefork | Apache 2 "prefork" MPM (Multi-Processing Module) | пакет i | apache2-utils | Утилиты Apache 2 | пакет | apache2-worker | Apache 2 worker MPM (Multi-Processing Module) | пакет | perl-Apache2-AuthCookieDBI | AuthCookie module backed by a DBI database | пакет | rubygem-passenger-apache2 | Passenger apache module | пакет 

Подробности установки пакетов для разных дистрибутивов приведены здесь.

В приведенных примерах apache2-mpm-prefork и apache2-mpm-worker — различные сборки apache2, поддерживающие мультипотоковую обработку, реализованную посредством подключаемых модулей MPM (multy-processing modules, модули мультипоточной обработки).

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

В общем случае выбор необходимой конфигурации определятся решаемыми задачами, но модель prefork является более стабильной.

Ниже приведены выборочные данные из реального тестирования:

Apache Bench results for prefork:
-------------------------------------------------------------
...
Server Software: Apache/2.2.4
...
Requests per second:	20.91 [#/sec] (mean)
...
Transaction rate:	20.12 trans/sec
-------------------------------------------------------------
Apache Bench results for worker:
-------------------------------------------------------------
...
Server Software: Apache/2.2.4
...
Requests per second:	40.94 [#/sec] (mean)
...
Transaction rate:	36.72 trans/sec
-------------------------------------------------------------

Запуск Apache

Запуск установленного (и настроенного) web-сервера Apache вручную выполняется такой командой (если используется init.d):

sudo /etc/init.d/apache2 start

либо:

sudo invoke-rc.d apache2 start

Для остановки и перезапуска web-сервера используются, соответственно, следующие команды: sudo /etc/init.d/apache2 stop, sudo /etc/init.d/apache2 restart, sudo invoke-rc.d apache2 stop.

Если в системе используется скрипт service, то для запуска Apache можно выполнить такую команду:

sudo service apache2 start

Автоматический запуск Apache2 в качестве системного сервиса устанавливается такой командой:

sudo chkconfig apache2 -s 35 // устанавливаем запуск на 3 и 5 уровнях

Проверка результов установки:

aag@stilo.asoiu:~$ sudo service apache2 status
* Apache is running (pid 1867).
aag@stilo.asoiu:~$ chkconfig -l apache2
apache2	0:off 1:off 2:on 3:on 4:on 5:on 6:off

Если установка и запуск прошли успешно, то Apache в базовой конфигурации уже можно использовать: в этом можно убедиться, открыв в браузере адрес http://localhost (рис. 1)

Apache on localhost

Рис. 1. Результат установки Apache

Настройка Apache

Редкий случай, когда веб-сервер используется с дефолтными настройками. Обычно, перед запуском его требуется настроить под конкретные задачи. Для этого нужно отредактировать конфигурационный файл httpd.conf, в котором хранятся все настройки.

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

Так, конфигурационные файлы Apache в сборке для OpenSuSE размещены в директории /etc/apache2. Сообщество разработчиков этого дистрибутива Linux проделало большую работу по сортировке директив конфигурации по назначению и функциям и размещения их в различных файлах. Такой подход призван облегчить управление веб-сервером Apache, работающим на различных версиях SuSE Linux. В табл. 1 приведен список файлов настроек, размещенных в каталоге /etc/apache2 OpenSuSE.

Табл. 1 Структура кофигурационных файлов Apache в SuSE/OpenSuSE

ConfigurationDescription
uid.confUserID/GroupID с чьими правами работает веб-сервер
server-tuning.confСистемные параметры (количество процессов, таймауты, объем памяти ...)
sysconfig.d/loadmodule.confСписок загружаемых модулей расширения.
listen.confIP-адреса / порты на которых работает сервер
mod_log_config.confРазмещение и формат журналов
sysconfig.d/global.confГлобальные настройки веб-сервера
mod_status.confСтатус сервера (мониторинг)
mod_info.confДоступ к модулю mod_info.
mod_usertrack.confУмолчания для cookie-based наблюдения за активностью пользователей.
mod_autoindex-defaults.confУмолчания для автоматической генерации списков файлов в каталогах
mod_mime-defaults.confУмолчания для различных типов содержимого (mime-types).
errors.confНастраиваемые сообщения об ошибках.
ssl-global.confОбщая конфигурация для защищенных соединений (SSL).
default-server.confНастройки для "сервера по умолчанию", на который перенаправляются запросы, обращенные не к виртуальным хостам.

Более того, httpd.conf это обычное, но не обязательное название. Например, в Apache2.2 из дистрибутива Ubuntu 9.10 файл настроек называется apache2.conf.

Так или иначе, структура файла httpd.conf достаточна проста и подробно описана в самом файле и его модулях (если таковые используются, как в примере с OpenSuSE). Здесь приведем очень короткий фрагмент оригинального httpd.conf (строки, начинающиеся со знака # («решетка») – комментарии):

# Директивы конфигурации веб-сервера разделены на три основные группы:
# 1. Директивы управления веб-сервером как таковым ("глобальное окружение");
# 2. Директивы, определяющие поведение "главного" сервера, к которому выполняются # все обращения, если отсутствуют виртуальные хосты. Эти директивы определяют значения # по умолчанию для всех виртуальных серверов
# 3. Настройки виртуальных хостов, которые позволяют управлять запросами, входящими
# на различные сетевые адреса, или с различными доменными именами
# ...
Далее следуют прочие описания и непосредственно директивы веб-сервера

Все директивы конфигурации задаются парами вида:

<параметр><разделитель><значение>

Здесь:

<параметр>: Строка, определяющая имя параметра.

<разделитель>: Один или несколько последовательных разделителей (пробелы, символы табуляции).

<значение>: Фактическое значение параметра.

Несколько директив могут быть заключены в контейнеры вида:

<имя_блока />
<список_директив>
</имя_блока>

Примером такого блока является контейнер Directory.

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

Директивы конфигурации Apache

ServerRoot: В этой директиве задается базовый каталог, в котором непосредсвенно установлено программное обеспечение HTTP-сервера.

ServerName: Директива ServerName позволяет задать имя хоста, возвращаемое клиенту. Имя, которое вы указываете здесь, должно быть зарегистрированным доменным именем вашего хоста. Если сервер не имеет зарегистрированного имени, вы можете указать здесь его ip-адрес, по которому вам придется обращаться к нему и что может сильно осложнить переадресацию ресурсов.

DocumentRoot: В этой директиве задается каталог, из которого берутся передаваемые клиентам документы. Можно предоставлять клиентам и файлы, находящиеся в других каталогах, — для этого используются символьные ссылки.

ServerAdmin: Официальный электронный адрес администратора веб-узла.

DirectoryIndex: Эта директива позволяет задать название документа, возвращаемого по запросу, который не содержит в строке URI названия документа. Если вы указываете несколько имен, разделяйте их пробелами. Пример:

DirectoryIndex index.html index.php index.htm default.html

Сервер будет искать перечисленные файлы в соответствующем порядке.

ErrorLog и CustomLog: При помощи этих двух директив задается путь к log-файлам, в которых регистрируются ошибки и попытки доступа к серверу соответственно. В файле, указанном в директиве ErrorLog, сервер сохраняет сообщения диагностики, включая сообщения об ошибках, выдаваемые сценариями CGI. В файле, указанном в директиве CustomLog, сервер сохраняет все запросы клиентов. Если включена опция HostnameLookups, то вместе с запросами регистрируются имена компьютеров.

ErrorDocument: Эта директива позволяет переопределить сообщения об ошибках, сопоставив в соответствие кодам ошибок HTTP-сервера текстовые сообщения и/или адреса URL на том же сервере. Например:

ErrorDocument 404 "Этого файла здесь нет, не было и не будет."

Options: Эта директива перечисляет список опций, применяемых к указанному каталогу. Опции могут иметь значения "None", "All" или любую комбинацию из "Indexes", "Includes", "FollowSymLinks", "ExecCGI" или "MultiViews". Например, такая конфигурация определяет порядок отображения индексной страницы, разрешает серверные включения (SSI) и переход по символьным ссылкам:

Options Indexes Includes FollowSymLinks

AllowOverride: С параметром none блокирует использование файла .htaccess, с параметром all — разрешает перекрывать дефолные настройки директивами из .htaccess.

Order: Директива, вместе с директивами Allow и Deny, определяющая порядок обращения к ресурсам в соответствии с правами доступа. Пример:

Order allow,deny
Allow from all

Пример использования блока директив для настроек корневого каталога:

<Directory />
Options FollowSymLinks ExecCGI
AllowOverride All
</Directory>

См. также Основные директивы Apache, комментарии в файле /etc/apache2/httpd.conf (англ.) и официальную документацию.

Настройка виртуальных хостов

Apache поддерживает возможность размещения нескольких сайтов на одном ip-адресе. Это называется виртуальный хостинг на основе имен , а такие сайты, каждый из которых имеет собственное доменное имя, виртуальными хостами (name based virtual hosts). Для реализации такой возможности, доменные имена виртуальных хостов должны быть зарегистрированы в системе DNS.

Для включения возможности работы с виртуальными хостами первое, что необходимо сделать — изменить директиву NameVirtualHost в файле конфигурации. В случае OpenSuSE потребуется открыть файл /etc/apache2/listen.conf, найти и раскомментировать следующую строку:

# разрешить именованные обращения на 80-й порт любого интерфейса
NameVirtualHost *:80 

После сохранения изменений проверим конфигурацию:

root@stilo.asoiu:/etc/apache2/ # apache2ctl configtest
[Mon Apr 21 09:45:51 2008] [warn] NameVirtualHost *:80 has no VirtualHosts
Syntax OK // синтаксис правильный 

В этом примере при проверке синтаксиса было получено предупреждение о том, что сервер не имеет виртуальных хостов. Рассмотрим процесс создания виртуального хоста на примере OpenSuSE:

1. Переместимся в каталог /etc/apache2/vhosts.d, в котором хранится информация о виртуальных хостах:

root@stilo.asoiu:/etc/apache2/ #cd /etc/apache2/vhosts.d

2. Скопируем файл vhost.template (шаблон виртуального хоста) в новый файл с расширением .conf (обязательно!):

root@stilo.asoiu:/etc/apache2/vhosts.d # cp vhost.template mysite.conf

Теперь в файле mysite.conf можно отредактировать конфигурацию нового виртуального хоста. Пример (с сокращениями) для сайта mysite.local приведен в листинге 1.

Листинг 1. Пример конфигурации

<virtualHost *:80>
ServerAdmin admin@mysite.local
ServerName mysite.local
DocumentRoot /srv/www/vhosts/mysite.local
ErrorLog /var/log/apache2/mysyte_error_log
CustomLog /var/log/apache2/mysite_access_log combined
HostnameLookups Off
UseCanonicalName Off
ServerSignature On
# прочие опции
<directory "/srv/www/vhosts/mysite.local">
Options All # или тот набор опций, который необходим
AllowOverride None # перекрытие опций в файле .htaccess
Order allow, deny # порядок доступа
Allow from all
# прочие опции
</directory>
</virtualHost>

После внесения изменений в конфигурацию выполняем рестарт веб-сервера. Если ошибок не было, то созданный сайт должен стать доступным по адресу http://mysite.local. Еще раз отметим, что имя сайта должно быть зарегистрировано в системе доменных имен. В случае локального сайта, это можно сделать путем редактирования файла /etc/hosts, в который нужно добавить запись вида:
ip-address sitename [sitealias].

Аналогичным образом добавляем прочие виртуальные хосты, не забывая после изменения конфигурации перезагружать веб-сервер.

Контрольные вопросы

  1. В каком случае сервер может вернуть сообщение "Server is busy"?
  2. Что произойдет с веб-сервером , если в конфигурации допущена ошибка?
  3. Как заставить Apache работать на порту, отличающемся от принятого по умолчанию?
  4. Как настроить Apache для работы с "ip-based" виртуальными хостами? (для самостоятельного изучения)
  5. Можно ли заставить Apache работать на нескольких портах? (для самостоятельного изучения)

CC-BY-CA Анатольев А.Г., 31.01.2012