Product SiteDocumentation Site

11.2. Web сервер (HTTP)

The Falcot Corp administrators decided to use the Apache HTTP server, included in Debian Bookworm at version 2.4.59.

11.2.1. Установка Apache

Установка пакета apache2 это всё, что нужно. Он содержит все модули, включая Multi-Processing Modules (MPM), влияющие на то, как Apache обрабатывает параллельную обработку многих запросов, которые раньше предоставлялись отдельными пакетами apache2-mpm-*. Это также потянет apache2-utils, содержащий утилиты командной строки, которые мы исследуем позже.
Используемый MPM существенно влияет на способ обработки параллельных запросов Apache. C worker MPM, он использует threads (лёгкие потоки), тогда как с prefork MPM он использует пул процессов, созданный заранее. С event MPM он также использует потоки, но неактивные соединения (особенно те, которые остаются открытыми фичей HTTP keep-alive) передаются обратно в выделенный поток управления.
The Falcot administrators also install libapache2-mod-php so as to include the PHP 8.2 support in Apache. This causes the default event MPM to be disabled, and prefork to be used instead. To use the event MPM one can use php-fpm.
Apache — модульный сервер, и многие функции реализуются внешними модулями, которые основная программа загружает во время своей инициализации. Конфигурация по умолчанию включает только наиболее распространенные модули, но для включения новых модулей достаточно просто запустить a2enmod module; чтобы отключить модуль, используйте команду a2dismod module. Эти программы фактически создают (или удаляют) символические ссылки /etc/apache2/mods-enabled/, указывая на реальные файлы (хранящиеся в /etc/apache2/mods-available/).
В конфигурации по умолчанию веб-сервер прослушивает порт 80 (как указано в /etc/apache2/ports.conf), и обслуживает страницы из каталога /var/www/html/ (как настроено в /etc/apache2/sites-enabled/000-default.conf).

11.2.2. Добавление поддержки SSL

Apache 2.4 включает модуль SSL (mod_ssl) требующийся для безопасного HTTP (HTTPS) «из коробки». Его просто нужно включить с помощью a2enmod ssl, затем необходимые директивы следует добавить в файлы конфигурации. Пример конфигурации представлен в /etc/apache2/sites-available/default-ssl.conf.
Если вы хотите создавать доверенные сертификаты, вы можете следоватьРаздел 10.2.1, «Создание бесплатных доверенных сертификатов», а затем настроить следующие переменные:
SSLCertificateFile      /etc/letsencrypt/live/DOMAIN/fullchain.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/DOMAIN/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/DOMAIN/chain.pem
SSLCACertificateFile    /etc/ssl/certs/ca-certificates.crt
Необходимо соблюдать особую осторожность, если вы хотите использовать SSL-соединения с Perfect Forward Secrecy (в этих соединениях используются эфемерные сеансовые ключи, гарантирующие, что компрометация секретного ключа сервера не приведёт к компрометации старого зашифрованного трафика, который мог быть сохранён во время прослушивания сети). В частности, обратите внимание на рекомендации Mozilla:
As an alternative to the standard SSL module, there is an extension module called mod_gnutls, which is shipped with the libapache2-mod-gnutls package and enabled with the a2enmod gnutls command. Unfortunately the version packaged for Debian had serious issues and even security implications and is therefor not part of Debian Stable since the Bullseye release.

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

Виртуальный хост — это дополнительный идентификатор веб-сервера.
Apache рассматривает два разных типа виртуальных хостов: те, которые основаны на IP-адресе (или порте), и те, которые основаны на имени домена веб-сервера. Первый метод требует выделения отдельного IP-адреса (или порта) для каждого сайта, тогда как второй может работать с одним IP-адресом (и портом), а сайты различаются по имени хоста, отправленному HTTP-клиентом (который работает только в версии 1.1 протокола HTTP — к счастью, эта версия достаточно старая, и все клиенты уже используют её).
(Растущая) нехватка адресов IPv4 обычно благоприятствует второму методу; однако это усложняется, если виртуальные хосты также должны предоставлять HTTPS, поскольку протокол SSL не всегда обеспечивает виртуальный хостинг на основе имени; расширение SNI (Server Name Indication), позволяющее такую комбинацию, обрабатывается не всеми браузерами. Когда несколько сайтов HTTPS должны работать на одном сервере, они обычно различаются либо запуском на другом порту, либо на другом IP-адресе (в этом может помочь IPv6).
Конфигурация по умолчанию для Apache 2 включает виртуальные хосты на основе имён. Кроме того, виртуальный хост по умолчанию определен в файле /etc/apache2/sites-enabled/000-default.conf; этот виртуальный хост используется, если не найден хост, соответствующий запросу, отправленному клиентом.
Каждый дополнительный виртуальный хост затем описывается файлом, хранящимся в /etc/apache2/sites-available/. Чтобы настроить сайт для домена falcot.org достаточно просто создать следующий файл, а затем включить виртуальный хост с помощью команды a2ensite www.falcot.org.

Пример 11.13. The /etc/apache2/sites-available/www.falcot.org.conf file

<VirtualHost *:80>
ServerName   www.falcot.org
ServerAlias  falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
Сервер Apache, настроенный до сих пор, использует одни и те же файлы журналов для всех виртуальных хостов (хотя это можно изменить, добавив CustomLog директивы в определениях виртуальных хостов). Поэтому имеет смысл настроить формат этого файла журнала, включив в него имя виртуального хоста. Это можно сделать, создав /etc/apache2/conf-available/customlog.conf файл, который определяет новый формат для всех файлов журналов (с директивой LogFormat) и включив его с помощью a2enconf customlog. CustomLog строку также необходимо удалить (или закомментировать) из файла /etc/apache2/sites-available/000-default.conf.

Пример 11.14. Файл /etc/apache2/conf-available/customlog.conf

# Новый формат log включает имя (виртуального) хоста
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost

# Теперь давайте использовать этот "vhost" формат по умолчанию
CustomLog /var/log/apache2/access.log vhost

11.2.4. Общие директивы

В этом разделе кратко рассматриваются некоторые часто используемые директивы конфигурации Apache.
Основной файл конфигурации обычно включает в себя несколько блоков Directory; они позволяют указать различное поведение сервера в зависимости от местоположения обслуживаемого файла. Такой блок обычно включает в себя директивы Options и AllowOverride.

Пример 11.15. Блок каталогов

<Directory /srv/www>
Options Includes FollowSymlinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
</Directory>
Директива DirectoryIndex содержит список файлов, которые следует попробовать, если запрос клиента соответствует каталогу. Первый существующий файл в списке используется и отправляется в качестве ответа.
Директива Options за ним следует список опций для включения. Значение None отключает все опции; соответственно, All включает их все, кроме MultiViews. Доступные варианты включают в себя:
  • ExecCGI указывает, что сценарии CGI могут выполняться.
  • FollowSymlinks сообщает серверу, что по символическим ссылкам можно переходить и что ответ должен содержать содержимое цели таких ссылок.
  • SymlinksIfOwnerMatch также сообщает серверу следовать по символическим ссылкам, но только тогда, когда ссылка и её цель имеют одного и того же владельца.
  • Includes включает Server Side Includes (SSI вкратце). Это директивы, встроенные в HTML-страницы и выполняемые «на лету» для каждого запроса.
  • IncludesNOEXEC разрешает Server Side Includes (SSI), но отключает команду exec и ограничивает директиву include для text/markup файлов.
  • Indexes сообщает серверу перечислить содержимое каталога, если HTTP-запрос, отправленный клиентом, указывает на каталог без индексного файла (т. е. когда ни один файл не упоминается в директиве DirectoryIndex существует в этом каталоге).
  • MultiViews обеспечивает согласование контента; это может использоваться сервером для возврата веб-страницы, соответствующей предпочтительному языку, настроенному в браузере.
Директива AllowOverride перечисляет все параметры, которые можно включить или отключить с помощью файла .htaccess. Обычно эта опция используется для ограничения ExecCGI, так что администратор выбирает, каким пользователям разрешено запускать программы под учётной записью веб-сервера (пользователь www-data).

11.2.4.1. Требование аутентификации

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

Пример 11.16. .htaccess файл, требующий аутентификации

Require valid-user
AuthName "Private directory"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-private
Файл /etc/apache2/authfiles/htpasswd-private содержит список пользователей и паролей; обычно им управляют с помощью команды htpasswd. Например, следующая команда используется для добавления пользователя или изменения его пароля:
# htpasswd /etc/apache2/authfiles/htpasswd-private user
New password:
Re-type new password:
Adding password for user user

11.2.4.2. Ограничение доступа

Директива Require контролирует ограничения доступа к каталогу (и его подкаталогам рекурсивно).
Это можно использовать для ограничения доступа по многим критериям; мы остановимся на описании ограничения доступа по IP-адресу клиента, но ограничение можно сделать гораздо мощнее, особенно когда несколько директив Require объединены в блок RequireAll.

Пример 11.17. Разрешить только из локальной сети

Require ip 192.168.0.0/16

11.2.5. Анализаторы журналов

Анализатор журналов часто устанавливается на веб-сервере; поскольку первый дает администраторам точное представление о моделях использования второго.
Администраторы Falcot Corp выбрали AWStats (Advanced Web Statistics) для анализа файлов журналов Apache.
Первым шагом настройки является настройка файла /etc/awstats/awstats.conf. Администраторы Falcot оставляют его неизменным, за исключением следующих параметров:
LogFile="/var/log/apache2/access.log"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
SiteDomain="www.falcot.com"
HostAliases="falcot.com REGEX[^.*\.falcot\.com$]"
DNSLookup=1
LoadPlugin="tooltips"
Все эти параметры документируются комментариями в файле шаблона. В частности, параметры LogFile и LogFormat описывают расположение и формат файла журнала, а также содержащуюся в нём информацию; SiteDomain и HostAliases перечисляют различные имена, под которыми известен основной веб-сайт.
Для сайтов с высоким трафиком обычно не следует задавать для DNSLookup значение 1; для небольших сайтов, таких как описанный выше сайт Falcot, этот параметр позволяет получать более читаемые отчёты, включающие полные имена компьютеров вместо сырых IP-адресов.
AWStats также будет включен для других виртуальных хостов; каждому виртуальному хосту нужен свой собственный файл конфигурации, например /etc/awstats/awstats.www.falcot.org.conf.

Пример 11.18. Файл конфигурации AWStats для виртуального хоста

Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
AWStats использует множество значков, хранящихся в каталоге /usr/share/awstats/icon/. Чтобы эти значки были доступны на веб-сайте, необходимо адаптировать конфигурацию Apache, включив в неё следующую директиву (проверьте /usr/share/doc/awstats/examples/apache.conf для более подробного примера):
Алиас awstats-icon/ /usr/share/awstats/icon/
After a few minutes (and once the script has been run a few times), the results are available online: