База знаний

Часто задаваемые вопросы, на которые мы уже ответили

Веб-сервер Apache

HTTP-сервер Apache — веб-сервер, который является весьма гибким в настройке и расширяемым за счет возможности подключения внешних модулей, разрабатываемых по технологии открытого кода в большом количестве. Модули ядра при этом выпускает только Apache Software Foundation.

Веб-сервер поддерживает несколько режимов работы со скриптами:

  • скрипт выполняется с помощью встроенного интерпретатора соответствующего языка программирования (mod_php/mod_perl/mod_wsgi для Python);
  • для обработки скрипта запускается интерпретатор CGI/FastCGI (mod_cgid/mod_fcgid).

Настройка веб-сервера производится с помощью директив конфигурационных файлов. Список всех доступных директив ядра указан на на официальном сайте Apache.

Веб-сервер Apache имеет три условных уровня конфигурации:

  1. Конфигурация сервера
    Red-Hat/CentOS/Fedora
    /etc/httpd/conf/httpd.conf
    Debian/Ubuntu
    /etc/apache2/apache2.conf
  2. Конфигурация виртуального хоста
    Red-Hat/CentOS/Fedora
    /etc/httpd/conf.d/filename.conf
    Debian/Ubuntu
    /etc/apache2/conf.d/filename.conf
  3. Конфигурация уровня директории — .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 и перезапускаем веб-сервер.
Была ли эта инструкция полезной?