HTTP-сервер Apache — веб-сервер, который является весьма гибким в настройке и расширяемым за счет возможности подключения внешних модулей, разрабатываемых по технологии открытого кода в большом количестве. Модули ядра при этом выпускает только Apache Software Foundation.
Веб-сервер поддерживает несколько режимов работы со скриптами:
- скрипт выполняется с помощью встроенного интерпретатора соответствующего языка программирования (mod_php/mod_perl/mod_wsgi для Python);
- для обработки скрипта запускается интерпретатор CGI/FastCGI (mod_cgid/mod_fcgid).
Настройка веб-сервера производится с помощью директив конфигурационных файлов. Список всех доступных директив ядра указан на на официальном сайте Apache.
Веб-сервер Apache имеет три условных уровня конфигурации:
- Конфигурация сервера
Red-Hat/CentOS/Fedora/etc/httpd/conf/httpd.conf
Debian/Ubuntu/etc/apache2/apache2.conf
- Конфигурация виртуального хоста
Red-Hat/CentOS/Fedora/etc/httpd/conf.d/filename.conf
Debian/Ubuntu/etc/apache2/conf.d/filename.conf
- Конфигурация уровня директории —
.htaccess
.
Большинство модулей имеет собственные параметры, при этом почти все параметры ядра также могут быть изменены через конфигурационные файлы, вплоть до управления моделью мультипроцессовости (MPM, Multi Proccess Model).
Основные реализации MPM
Prefork
Apache MPM prefork заранее создает определенное количество процессов, каждый из которых обрабатывает только 1 поток (thread) на одно соединение. Под каждый из процессов заранее резервируется место в оперативной памяти.
Рекомендовано для работы с модулями, например – mod_php.
Плюсы: быстродействие, изолированность процессов.
Минусы: при большом количестве запросов они будут вынуждены ожидать, когда веб-сервер освободится для их обработки; увеличение числа процессов значительно влияет на потребление оперативной памяти.
Более подробно о prefork можно узнать из официальной документации.
Worker
Apache MPM worker использует многопоточную систему, при которой несколько процессов запускают по несколько потоков, ожидающих входящие запросы.
Плюсы: обработка большого количества одновременных запросов при небольшом потреблении оперативной памяти в сравнении с prefork.
Минусы: проблемы в одном процессе могут затронуть другие соединения; keep-alive соединение связывается с потоком, а не с запросом, что может привести к длительному выполнению потока, пока соединение не будет окончательно разорвано.
Более подробно о worker можно узнать из официальной документации.
Установка веб-сервера
Веб-сервер можно устанавливать с помощью встроенного менеджера пакетов ОС или скомпилировать из исходников.
Первый способ является предпочтительным с точки зрения простоты администрирования, удобства отслеживания обновлений.
Компиляция из исходников является более гибкой, позволяет выбирать произвольные настройки на этапе конфигурации, например, указывать метод работы MPM, отличный от стандартного для данной ОС. Однако следствием этого при недостаточном опыте могут стать ошибки в работе ПО или его совместимости с другими приложениями на сервере. Кроме того, потребуется вручную добавлять информацию о собранном ПО в настройки системы, чтобы она воспринимала его как сервис.
CentOS
- Установку веб-сервера Apache выполняем командой:
$ yum install httpd -y
- После установки запускаем веб-сервер:
$ systemctl start httpd.service
- Добавляем запуск веб-сервера при загрузке ОС:
$ systemctl enable httpd.service
Debian/Ubuntu
- Для установки веб-сервера Apache выполняем команды:
$ apt-get update $ apt-get install apache2
Настройка
Чтобы указать веб-серверу, с каких портов ожидать запросы, используется директива Listen
, синтаксис
Listen IP:порт
Можно указывать несколько IP-адресов и портов, при это параметр IP является необязательным.
Примеры:
Listen 80 Listen 202.187.1.10:8080
Можно разграничить доступ к сайтам или же задать различные настройки для разных сайтов с помощью блочных директив VirtualHost.
Чтобы виртуальные хосты различались по именам, необходимо задать директиву NameVirtualHost
, её синтаксис аналогичен Listen
NameVirtualHost IP:порт
Вместо IP может быть указано «*» для того, чтобы обрабатывались запросы, поступающие по любым IP-адресам.
Настройка VirtualHost
На примере ниже для одного сайта у нас будет использовать встроенный интерпретатор веб-сервера, а для другого модуль mod_fcgi:
NameVirtualHost *:80 ServerAdmin username@site1.com DocumentRoot /var/www/site1.ru ServerName site1.ru ServerAlias www.site1.ru ErrorLog logs/site1.ru-error_log CustomLog logs/site1.ru-access_log common ServerAdmin webmaster@localhost DocumentRoot /var/www/site2.ru ServerName site2.ru ServerAlias www.site2.ru IPCCommTimeout 7200 FcgidConnectTimeout 320 MaxRequestLen 25728640 FcgidMaxRequestsPerProcess 0 FcgidBusyTimeout 3600 FcgidOutputBufferSize 0
Примеры настроек VirtualHost доступны в официальной документации.
Проверка корректности конфигурации
Чтобы избежать ошибок в работе веб-сервера после внесения изменений, необходимо проверить корректность конфигурации с помощью команды:
$ apachectl -t
Применение изменений
После внесения любых изменений в конфигурационный файл для их применения перезагружаем веб-сервер:
Debian/Ubuntu
$ service apache2 restart
или
$ /etc/init.d/apache2 restart
Red-Hat/CentOS/Fedora
service httpd restart
или
/etc/init.d/ httpd restart
Работа с модулями
По умолчанию, модули расположены в /etc/[httpd|apache2]/modules/
. Директивы конфигурации для модулей по умолчанию находятся в httpd.conf
, параметры конфигурации для дополнительных модулей, как правило, размещены в *.conf
файлов в каталоге conf.d
.
Просмотр установленных модулей
Просмотр установленных модулей выполняется с помощью команд:
Debian/Ubuntu
$ apache2ctl -t -D DUMP_MODULES
$ apache2ctl -M
CentOS/RedHat
$ apachectl -t -D DUMP_MODULES
$ httpd -M $ apachectl -M
Установка модулей на примерах
Установку модулей рекомендуется производить из официальных репозиториев с помощью менеджера пакетов ОС.
При этом некоторые модули могут быть установлены только из исходников от разработчиков.
Список модулей ядра доступен для ознакомления в официальной документации.
Ниже доступны примеры команд установки модулей:
CentOS/RedHat
$ yum install mod_perl
$ yum install mod_wsgi
Debian/Ubuntu
$ apt-get install libapache2-modsecurity
$ apt install libapache2-mod-fcgid
Активация
Для активации модулей используется команда a2enmod
(apache2 enable mod):
$ a2enmod mod-security $ a2enmod cgi fcgid actions $ a2enmod rewrite
Подключение произвольного модуля
Для каждого неофициального модуля существует собственная инструкция по сборке от его разработчиков.
После того, как модуль скомпилирован, его необходимо подключить к веб-серверу вручную с помощью директивы в файле конфигурации:
LoadModule <имя_модуля> <путь к исходному файлу>
Подробно подключение произвольного модуля описано в официальной документации.
Диагностика и решение проблем
Если при запуске веб-сервера возникает ошибка, первостепенно требуется проверить корректность конфигурации.
При наблюдении синтаксической ошибки, исправляем её и перезапускаем веб-сервер. Если проблема сохранилась, выполняем команду для чтения подробного описания ошибки:
# systemctl status httpd.service
или
# journalctl -xe
Диагностика ошибки «Address already in use: AH00072: make_sock: could not bind to address»
Данная ошибка означает, что веб-сервер пытается запуститься на порту, который уже используется. В тексте ошибки будет присутствовать адрес и порт, например:
(98)Address already in use: AH00072: make_sock: could not bind to address 1.2.3.4:80
- Проверяем, какой из текущих процессов использует порт 80:
# netstat -tap --numeric-ports |grep :80
- Если порт используется другим сервисом, например, Nginx, и это нормально, значит, Apache является backend-ом и должен слушать другой порт. Ищем, в каком конфигурационном файле допущена ошибка:
# grep -rl ":80" /etc/httpd/
- Находим файл, изменяем значение и перезагружаем веб-сервер.
- Если на порту "завис" процесс Apache, прерываем его работу его с помощью команды
kill
и перезапускаем веб-сервер.