Веб-сервер Apache

Веб-сервер почти такой же старый, как сам Интернет.

Время чтения: 10 мин

Настройка Apache

Скопировано

Веб-сервер Apache был разработан в 1995 году Apache Software Foundation как замена NCSA HTTPd. В Unix-подобных операционных системах, как правило, Apache поставляется вместе с дистрибутивом как служба httpd. На Windows Apache необходимо установить и запустить в качестве службы (инструкция).

Существует несколько заранее подготовленных программных пакетов в виде приложений с графическим интерфейсом пользователя, в которых уже установлены и настроены для совместной работы веб-сервер Apache, база данных и интерпретатор для скриптового языка. Наиболее популярными являются пакеты AMP (аббревиатура от Apache + MySQL/MariaDB + Perl/PHP/Python). Благодаря простоте установки и настройки, поддержке разных операционных систем наиболее популярным пакетом является XAMPP.

Структура файлов конфигурации

Скопировано

Работу Apache можно настраивать с помощью файлов конфигурации. Файлы конфигурации могут быть расположены в разных местах в зависимости от типа установки веб-сервера. Есть страница из официальной документации, которая описывает стандартные пути установки из дистрибутива для разных операционных систем. Если вы установили Apache, собрав из исходного кода, таким путём на Unix-подобных системах будет /usr/local/apache2/conf. Конфигурацию по умолчанию обычно можно найти в файле с именем httpd.conf.

Файл конфигурации содержит простые директивы, по одной на строку. Если настройки не помещаются на одной строчке, можно использовать символ \, как это применяется при работе со скриптами в терминале. Если в значении аргумента есть пробелы, он помещается в кавычки. Регистр букв при указании директив важен. Для аргументов регистр, как правило, тоже имеет значение. Для однострочных комментариев используется символ #. Аргументы, в которых записываются нужные значения параметров настройки, отделяются пробелами.

Сложные директивы указываются внутри угловых скобок, по аналогии с тегами в HTML. Внутри тега с помощью простых или сложных директив задаётся поведение веб-сервера.

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

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

        
          
          Include /path/to/conf/example.conf
          Include /path/to/conf/example.conf

        
        
          
        
      

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

В файлах конфигурации можно задавать переменные с помощью директивы Define. Использовать переменные можно с помощью конструкции ${VAR}. Как и в терминале, в файлах конфигурации Apache можно создавать переменные окружения. Для этого используется директива SetEnv.

Для указания директории, к которой веб-сервер должен перенаправить HTTP-запросы от клиента, используется следующий список директив:

  • <Directory directory-path> — устанавливаются правила поведения веб-сервера для файлов и поддиректорий внутри пути directory-path.
  • <DirectoryMatch regex> — то же самое, что и Directory, но применяется ко всем путям, которые удовлетворяют регулярному выражению regex.
  • <Files filename> — устанавливаются правила поведения веб-сервера для файлов с именем filename.
  • <FilesMatch regex> — то же самое, что и Files, но применяется ко всем файлам, имена которых удовлетворяют регулярному выражению regex.
  • <Location URL-path|URL> — устанавливаются правила поведения веб-сервера для определённых абсолютных и относительных ссылок URL-path|URL.
  • <LocationMatch regex> — то же самое, что и Location, но применяется ко всем ссылкам, которые удовлетворяют регулярному выражению regex.
  • <VirtualHost addr[:port] [addr[:port]] ...> — устанавливаются правила поведения веб-сервера для определённых имён хостов или IP-адресов.

Примеры сложных директив

Скопировано
<Directory "/usr/local/httpd/htdocs">
  AllowOverride None
</Directory>

Для директории /usr/ директива AllowOverride с аргументом None будет означать, что локальную конфигурацию в файле .htaccess нужно проигнорировать.

<Location "/status">
  SetHandler server-status
  Require all granted
</Location>

Директива SetHandler позволяет обрабатывать запросы, используя специальные обработчики (хендлеры). В примере при обращении к пути сайта /status веб-сервер выдаёт отчёт о своём состоянии. Аргументы all granted для директивы Require указывают, что веб-сервер должен обработать любые запросы для всех пользователей, независимо от того, авторизованы они или нет. Можно разрешить доступ только определённым IP-адресам, которые начинаются с 10., 172.20. или 192.168.2. так:

        
          
          Require ip 10 172.20 192.168.2
          Require ip 10 172.20 192.168.2

        
        
          
        
      

Директива Require используется для установления каких-то требований. Если требования не соблюдены, то запросы от клиента отклоняются веб-сервером. Можно использовать вложенные директивы так:

<Directory "/www/docs">
  <RequireAll>
    Require group alpha beta
    Require not group reject
  </RequireAll>
</Directory>

В этом примере все пользователи из групп alpha и beta имеют доступ к папке /www/docs, а пользователи из группы reject — нет.

Можно и сложнее. Пример так называемого контейнера авторизации:

<Directory "/www/mydocs">
  <RequireAll>
    <RequireAny>
      Require user superadmin
      <RequireAll>
        Require group admins
        <RequireAny>
          Require group sales
        </RequireAny>
      </RequireAll>
    </RequireAny>
    <RequireNone>
      Require group temps
    </RequireNone>
  </RequireAll>
</Directory>

Широко распространено использование виртуальных хостов, то есть отдельных IP-адресов или имён хостов, для обработки запросов пользователей. Можно указать для виртуального хоста доменное имя сайта (ServerName); директорию, в которую будут перенаправляться запросы пользователей (DocumentRoot); можно настроить отчёты об ошибках (ErrorLog) или успешных актах передачи файлов пользователям (TransferLog):

<VirtualHost 10.1.2.3:80>
  DocumentRoot "/www/docs/host.example.com"
  ServerName host.example.com
  ErrorLog "logs/host.example.com-error_log"
  TransferLog "logs/host.example.com-access_log"
</VirtualHost>

Веб-сервер Apache позволяет использовать модули для обработки HTTP-запросов клиентов. Например, для обработки HTTP-запросов интерпретатором PHP для файлов с расширением *.php нужно подключить и настроить отдельный модуль mod_fcgi:

<FilesMatch "\.php$">
  SetHandler  "proxy:unix:/path/to/app.sock|fcgi://localhost/"
</FilesMatch>

Предварительно модуль необходимо подключить и проверить, подключился ли он корректно. Для этого нужно использовать директиву:

<IfModule mod_fastcgi.c>
  AddHandler php7.fcgi .php
  Action php7.fcgi /php7.fcgi
  Alias /php7.fcgi /usr/lib/cgi-bin/php7.fcgi
  Authorization -idle-timeout 3600
  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory>
</IfModule>

В примере происходит следующее:

  • AddHandler добавляет обработчик php7.fcgi для файлов с расширением .php;
  • Action активирует тип обработки php7.fcgi запросов для обработчика /php7.fcgi;
  • Alias устанавливает соответствие между ссылками и локальными директориями на компьютере, где запущен сервер;
  • Authorization определяет период времени, по истечении которого понадобится новая авторизация клиента.

Управление конфигурацией

Скопировано

Запустить Apache можно напрямую, используя исполняемый файл, или в качестве службы в операционной системе.

Проверить конфигурацию на соответствие синтаксису можно с помощью ключа -t:

        
          
          httpd -t
          httpd -t

        
        
          
        
      

Ключ -s выводит в консоль информацию о текущей конфигурации веб-сервера для виртуального хоста:

        
          
          httpd -s
          httpd -s

        
        
          
        
      

Ключ -k позволяет управлять веб-сервером с помощью сигналов Unix-подобных систем (подробнее в статье «Многозадачность и управление процессами)».

        
          
          httpd -k <signal>
          httpd -k <signal>

        
        
          
        
      

Можно использовать сигналы из списка:

start — запустить;
stop — немедленно остановить;
graceful-stop — остановить веб-сервер после завершения обработки текущих запросов клиентов;
restart — перезапустить с новой конфигурацией, без завершения обработки текущих запросов клиентов;
graceful — перезапустить с новой конфигурацией, дождавшись завершения обработки текущих запросов клиентов;
reopen — открыть лог-файлы заново.

Можно получить конфигурационный файл с помощью сервиса Mozilla SSL Configuration Generator. Попробуйте сгенерировать разные конфигурации, это поможет разобраться с конкретными настройками детальнее.

Шпаргалка по Apache

Скопировано

Подключение файлов конфигурации

Скопировано
        
          
          Include /etc/apache/virtual-hosts/*.conf
          Include /etc/apache/virtual-hosts/*.conf

        
        
          
        
      

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

Своё сообщение о 404 ошибке

Скопировано
        
          
          ErrorDocument 404 /404.html
          ErrorDocument 404 /404.html

        
        
          
        
      

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

Создание виртуального каталога (mod_alias)

Скопировано
        
          
          Alias /common /web/common
          Alias /common /web/common

        
        
          
        
      

Эта настройка позволяет перенаправить запросы клиента к определённому каталогу сайта к директории на компьютере, на котором работает веб-сервер. В примере настройка работает так: клиент обращается к сайту по адресу https://example.com/common и получает содержимое директории /web/common.

Создание постоянного редиректа (mod_alias)

Скопировано
        
          
          Redirect permanent /old http://example.com/new
          Redirect permanent /old http://example.com/new

        
        
          
        
      

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

Разрешение доступа только с определённого IP-адреса

Скопировано
        
          
          Order Deny,AllowDeny from allAllow from 127.0.0.1
          Order Deny,Allow
Deny from all
Allow from 127.0.0.1

        
        
          
        
      

Эта возможность чаще всего имеет смысл для отладки сайта. Клиентам доступа к сайту не будет кроме компьютеров разработчиков. С другой стороны, настройка может использоваться и для обеспечения дополнительного уровня защиты. Можно заходить на сайт только через VPN, IP-адрес которого прописан в настройках.

Включение механизма редиректов

Скопировано
        
          
          RewriteEngine OnRedirect /news/123 to /news.cfm?id=123RewriteRule ^/news/([0-9]+)$ /news.cfm?id=$1 [PT,L]Redirect www.example.com to example.comRewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
          RewriteEngine On

Redirect /news/123 to /news.cfm?id=123

RewriteRule ^/news/([0-9]+)$ /news.cfm?id=$1 [PT,L]

Redirect www.example.com to example.com

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]

        
        
          
        
      

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

На практике

Скопировано

Игорь Коровченко советует

Скопировано

Управление и мониторинг

Скопировано

С помощью сигналов в Unix-подобных операционных системах веб-сервером можно управлять, как это описано в статье «Веб-сервер Nginx». Управление веб-сервером Apache осуществляется так:

  • sudo systemctl status httpd — получить информацию о запущенном сервере;
  • sudo systemctl stop httpd — остановить сервер;
  • sudo systemctl start httpd — запустить сервер;
  • sudo systemctl reload httpd — перезапустить сервер, дождавшись завершения обработки всех текущих запросов;
  • sudo systemctl restart httpd — перезапустить сервер, не дожидаясь окончания обработки текущих запросов.

В Windows управление веб-сервером зависит от того, как он был запущен. Apache может использоваться как консольное приложение. В этом случае запуск, установка и перезапуск Apache можно осуществить с помощью команд:

        
          
          httpd.exehttpd.exe -k shutdownhttpd.exe -k restart
          httpd.exe
httpd.exe -k shutdown
httpd.exe -k restart

        
        
          
        
      

Больше настроек можно посмотреть в официальной документации.