Веб-сервер Apache


Заглянув в каталог /usr/ports/www, можно найти несколько различных «портов» веб-серверов. Здесь есть dhttpd, thttpd, bozohttpd, XS-HTTPD и многие другие веб-серверы, каждый из которых обладает своими особенностями. Например, tclhttpd — это веб-сервер, полностью реализованный на языке Tcl. Если вам нужен специализированный веб-сервер, вполне вероятно, что вы найдете его здесь. Мы сосредоточимся на наиболее популярном веб-сервере Apache.

Операционная система FreeBSD включает несколько «портов» различных версий Apache, но большая их часть — это устаревшие версии. Если у вас имеется приложение, которому требуется Apache версии 1.3 с определенным набором модулей, FreeBSD предоставит его. Однако для вновь создаваемого веб-сервера лучше выбрать последнюю доступную версию. На момент написания этих строк последней была версия Apache 2.2. Сервер Apache обладает очень широкими функциональными возможностями, такими как поддержка LDAP и баз данных SQL, однако мы сосредоточимся только на основных его функциях. Apache 2.2 легко устанавливается как из «порта» (/usr/ports/www/apache22), так и из пакета.

Конфигурационные файлы Apache

Основные конфигурационные файлы Apache 2.2 расположены в /usr/local/etc/apache22. И хотя за эти годы конфигурация Apache претерпела значительные изменения, в нынешнем виде она представляет неплохой компромисс между сложностью и модульностью. Ключевыми конфигурационными файлами являются httpd.conf, magic и mime.types.

mime.types

Файл mime.types содержит список всех стандартных типов файлов и их идентифицирующие характеристики. Когда веб-сервер отправляет файл клиенту, он должен идентифицировать тип файла, чтобы тот мог выполнить соответствующие действия. Вам наверняка не захочется, чтобы веб-броузер интерпретировал потоковое видео как HTML! Соответствия, хранимые в mime.types, предоставляют серверу Apache информацию, необходимую для правильного указания этих типов. Файл mime.types содержит практически все возможные типы файлов. Поэтому, даже если в документации к какой-либо программе говорится о необходимости добавить какую-либо информацию в файл mime.types, прежде чем вносить какие-либо изменения, убедитесь, что эта информация действительно отсутствует. Скорее всего, вам никогда не придется редактировать этот файл.

magic

Поскольку файл mime.types не может учитывать все возможные типы файлов, модуль mime_magic, встроенный в Apache, применяет файл magic для идентификации неизвестных файлов. На протяжении своей карьеры системного администратора я неоднократно собирался что-то изменить в файле magic и каждый раз оказывался неправ.

httpd.conf

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

Подкаталоги Includes, extra и envvars.d обеспечивают дополнительную функциональность сервера Apache, позволяя отделить базовую функциональность сервера от часто изменяющихся дополнений. Например, раскомментировав соответствующую строку в файле httpd.conf, можно активировать любую функцию из каталога extra. Мы узнаем, как это делается и как использовать эту архитектуру для повышения уровня безопасности.

Базовая конфигурация Apache

Сервер Apache поддерживает множество различных особенностей в своей сложной конфигурации, тем не менее настройка и запуск сервера выполняются достаточно просто. Прежде всего следует определить параметр apache_22_enable="YES" в файле /etc/rc.conf. После этого настройка вашего первого веб-сайта заключается в том, чтобы внести небольшое число изменений в файл httpd.conf’.

Путь к корневому каталогу сервера

Параметр ServerRoot определяет каталог, который содержит все файлы веб-сайта и серверных программ. Когда в файле httpd.conf указывается ссылка на файл, Apache автоматически присоединяет к ней спереди значение параметра ServerRoot, при условии, что строка пути к файлу не начинается с символа слэша (/).

ServerRoot "/usr/local"

Например, ссылка на каталог libexec/apache22, с учетом значения по умолчанию параметра ServerRoot в действительности указывает на каталог /usr/local/libexec/apache22. С другой стороны, элемент /var/log/httpd.log останется без изменений. Я не рекомендую изменять значение этого параметра просто потому, что большая часть конфигурации по умолчанию сервера Apache опирается на значение параметра ServerRoot, равное /usr/local.

Listen

Параметр Listen определяет, к каким TCP-портам или IP-адресам будет привязан Apache. По умолчанию используется порт 80 (стандартный порт для HTTP) на всех IP-адресах, имеющихся на локальной машине:

Listen 80

Можно указать отдельные IP-адреса:

Listen 192.168.8.44

Объединив эти две возможности, можно указать серверу прослушивать нестандартный порт на единственном IP-адресе:

Listen 192.168.8.44:8080

Добавляя дополнительные инструкции Listen, можно обеспечить доступность Apache на любом количестве портов или IP-адресов системы.

Пользователь и группа

Эти параметры задают непривилегированного пользователя и группу, под которыми запускается Apache. В системе FreeBSD предусмотрены пользователь www и группа www. Это специальные учетные записи без привилегий, предназначенные для веб-сервера. Хотя иногда встречаются рекомендации запускать Apache от имени root, не поступайте так ни по каким причинам. Если злоумышленник взломает ваш веб-сервер, в качестве дополнительной награды он получит права root в вашей системе!

User www
Group www

Почтовый адрес администратора

Веб-сервер должен знать адрес электронной почты системного администратора. Apache автоматически вставляет этот адрес в различные сообщения об ошибках.

ServerAdmin webmaster@blackhelicopters.org

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

Имя сервера

Это имя веб-сайта. Оно должно представлять собой реальное имя хоста и иметь соответствующую запись в DNS. В противном случае запустить Apache не удастся. Однако во время тестирования вместо записи DNS можно применять запись в /etc/hosts. Здесь также можно указать IP-адрес.

ServerName www.absolutefreebsd.com

Путь к корневому каталогу документов

Корневой каталог документов — это место, предназначенное для размещения HTML-файлов, из которых фактически состоит веб-сайт. Сайт по умолчанию содержит простое сообщение о том, что веб-сервер работает. Это, конечно, хорошо, но такое сообщение не привлечет много посетителей. Если в этот каталог поместить свои документы HTML, при следующем же обновлении коллекция «портов» заметит изменения и сообщит об этом. В идеале следует выбрать другой каталог для своих документов. Я предпочитаю размещать свои веб-сайты в каталоге /var/www, так как это позволяет сохранять содержимое каталога /usr неизменным.

DocumentRoot "/var/www/mywebsitename"

Протоколы сервера Apache

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

Основные протоколы

Самый простой протокол — это протокол ошибок. Если у вас на одном и том же сервере работает несколько веб-сайтов, рекомендую включить имя сайта в имя файла протокола с ошибками:

ErrorLog /var/log/httpd-имя_сайта-error.log

Наибольший интерес для большинства веб-администраторов представляет протокол со списком запрашиваемых файлов. Для протоколирования обращений к сайту необходимо определить формат протокола и объявить местоположение файла протокола в этом формате. Сервер Apache 2.2 включает три формата:

  • Формат common подразумевает протоколирование IP-адреса клиента, времени запроса и имени запрашиваемого файла.
  • Формат combined включает все то же самое, что и формат common, а также сайт, с которого клиент перешел на данный сайт, и информацию о веб-броузерах клиентов.
  • Формат combinedio включает все то же самое, что и формат combined, а также фактическое число байтов, переданных по сети. В это число включаются заголовки и прочая метаинформация, передаваемая вместе с документом.

Выбрав один из вышеуказанных (или определив свой) форматов протокола, его можно указать в инструкции CustomLog:

CustomLog /var/log/httpd-имя_сайта-access.log combinedio

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

Ротация протоколов

Есть хорошее эмпирическое правило, согласно которому каждые 10 000 запросов увеличивают файл протокола на 1 Мбайт. Эта величина может показаться несущественной для маленького сайта, но даже маленький веб-сайт может получить огромное число запросов в течение нескольких месяцев. Мой (совершенно убогий) личный веб-сайт получает примерно 60 000 запросов в год.* Нагруженный сайт может получать значительное число запросов в минуту. Если не производить ротацию протоколов, вскоре окажется невозможным отыскать в них нужную информацию.

Сервер Apache реализует работу с протоколами не так изящно, как большинство других серверных программ, главным образом потому, что основная цель Apache — обслуживать тысячи и тысячи пользователей одновременно. Если для ротации файлов протоколов вы просто воспользуетесь услугами newsyslog(8), как это делается в случае других программ, Apache начнет повреждать свои собственные протоколы. Тем не менее, Apache поддерживает работу с программами ротации протоколов. Я рекомендую обслуживать протоколы с помощью программы rotatelogs(8), которая входит в состав Apache. Для этого в операторах определения протоколов вместо имени файла следует указать вызов rotatelogs(8) через конвейер (pipeed call). Например:

ErrorLog "|/usr/local/sbin/rotatelogs /var/log/httpd-имя_сайта-error-log 86400"

Вместо имени файла здесь присутствует вызов программы rotatelogs(8), которой передается базовое имя файла. Завершающее число — это количество секунд между ротациями файла протокола. 86 400 секунд — это одни сутки.

Подобным образом можно применять программу rotatelogs(8) для протокола обращений, не забыв при этом указать формат протокола в конце строки определения. Чтобы избежать лишнего ввода с клавиатуры, можно использовать путь из параметра ServerRoot.

CustomLog "|sbin/rotatelogs /var/log/httpd-имя_сайта-access-log 86400" combined

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

Ротацию протоколов можно производить и на основе их размеров, что может вызвать выполнение через разные интервалы времени, но сделает вашу жизнь проще. Ниже показано, как выполнять ротацию протокола ошибок через каждые 5 Мбайт:

ErrorLog "|sbin/rotatelogs /var/log/httpd-имя_сайта-error-log 5M"

По умолчанию rotatelogs(8) присваивает каждому файлу протокола имя, включающее время начала протокола, исчисляемое в секундах от начала эпохи.* Хотя вы и сами без труда переведете эпохальное время в более понятное человеку представление с помощью команды date(1), но можете и заставить rotatelogs сразу использовать дружелюбный формат значений даты и времени в именах файлов протоколов. Так можно обеспечить включение времени создания файла в имя файла протокола:

ErrorLog " |sbin/rotatelogs /var/log/httpd-имя_сайта-error-log.%Y-%m-%d-%H_%M_%S 86400"

Если ваши особые требования к протоколированию не может удовлетворить rotatelogs(8), обратите внимание на cronlog (/usr/ports/sysutils/cronlog) или httplog (/usr/ports/sysutils/httplog). Правда, мне это никогда не требовалось.

Комментарии запрещены.