Шелест Лариса Николаевна

Факультет: Вычислительной техники и информатики
Специальность: Программное обеспечение автоматизированных систем
Тема выпускной работы: "Исследование методов разбиения графов большой размерности со многими ограничениями при параллельной работе" (система ParMetis, hMetis, METIS).
Научный руководитель: ст. пр. Костин В.И.
E-mail: lorashelest@mail.ru


биография :: реферат :: библиотека :: ссылки :: отчет о поиске :: задание :: портал магистров ДонНТУ

индивидуальное задание

В качестве индивидуального задания были написаны методические указания по курсу "Информационные и телекоммуникационные технологии. Администрирование Web-сервера Apache."Авторы: Шелест Л.Н., Костин В.И.

введение

Apache - это наиболее популярный Web-сервер (на основе HTTP-протокола). Более половины всех Web-узлов в мире созданы с использованием сервера Apache. Его можно получить совершенно бесплатно, при этом он гибок и удобен в настройке и конфигурировании, а также и очень надежен.

Сервер Apache берет своё начало от сервера httpd, созданного Робом Макколом (Rob McCool) в Национальном центре по применению суперкомпьютеров (National Center for Supercomputing Applications - NCSA) и в 1995 году был самым популярным Web-сервером. Однако после ухода Маккола из NCSA развитие программы замерло. Его поддержкой и развитием занялась небольшая группа Web-администраторов и образовала ядро организации, которая сейчас широко известна как Apache group. По своей сути Web-сервер Apache является конечным результатом грандиозного совместного труда группы программистов самой высокой квалификации.

Среди основных достоинств Apache можно выделить следующие:

  1. Бесплатная технология + открытый исходный код.
  2. Работает с PHP, Perl и другими скриптовыми языками.
  3. Работает со многими ОС: Linux, Unix, Mac OS X, Windows, OS/2.
  4. Высокие возможности конфигурирования, модульность (модули на языках Си или Perl).

Web-сервер Apache обладает следующими особенностями:
  1. Поддержка протокола HTTP 1.1 (параллельный запуск запросов (не передаются HTTP-заголовки в каждом запросе).
  2. Простая, но мощная структура файла-конфигурации httpd.conf (содержит обычный текст, который можно разбить на несколько файлов).
  3. Поддержка CGI (производится с помощью модулей mod_cgi и mod_cgid и соответствует стандарту CGI 1.1, настройка дополнительных переменных среды, наличие возможности отладки).
  4. Поддержка FASTCGI (для более быстрой работы CGI, осуществляется на основе модуля mod_fcgi).
  5. Поддержка виртуальных узлов (один из первых Web-серверов, в котором есть поддержка виртуальных узлов на основе IP-адресов и имён).
  6. Поддержка HTTP-аутентификации (стандартной и современной, основанной на алгоритме massage-digest).
  7. Интеграция с Perl. Perl стал фактически стандартом для программирования сценариев CGI (на основе модуля mod_perl, который загружается в память).
  8. Поддержка PHP (на основе модуля mod_php).
  9. Поддержка Java сервлетов. Сервлеты Java и серверные приложения Java (JSP) часто применяются при создании динамических Web-узлов. Для запуска используется среда Tomcat и Apache.
  10. Интегрированный proxy-сервер.
  11. Широкие возможности для мониторинга и регистрации состояния сервера. Для этого можно применять Web-броузер.
  12. Поддержка SSI - включения со стороны сервера.
  13. Поддержка SSL-протокола защищённых сокетов (на основе OpenSSL и модуля mod_ssl).

В Web-сервере реализован новый подход к переносимости: если раньше переписывался исходный код для каждой платформы, то сейчас разработан интерфейс Apache Portable Run_Time (APR) - единый интерфейс на С для специфических функций любой платформы, поэтому основной код может быть написан один раз.

Настройка сервера осуществляется с помощью текстового файла httpd.conf (при сборке по умолчанию - /usr/local/apache2/conf/httpd.conf), состоящего из директив. Имя файла можно изменить при запуске сервера ключом "-f". Директива Include позволяет вставлять содержимое дополнительных файлов (можно указывать шаблон имени или имя каталога). Для вступления в действие изменений файла настройки необходимо перезапустить сервер. Некоторые директивы могут ссылаться на дополнительные файлы с другим синтаксисом. Каждая директива располагается на отдельной строке. Продолжение на следующую строку делается с помощью символа '\' в конце строки. Комментарии начинаются с символа '#'. Пробелы в начале строки игнорируются.

Сервер состоит из множества модулей, которые могут выбираться при сборке или загружаться динамически. Модуль Core отключить нельзя. Каждая директива определяет поведение одного из модулей и имеет смысл только, если этот модуль включен при сборке или с помощью динамической загрузки. Директивы могут выполняться в зависимости от наличия модуля (секция IfModule) или установки параметра при запуске сервера (секция IfDefine).

Секция IfDefine включает директивы, применяемые только если при запуске сервера была установлена (не установлена) соответствующая переменная (ключ -D):

<IfDefine [!]имя-переменной>
...
</IfDefine>


Секция IfModule включает директивы, применяемые только при наличии (отсутствии) указанного модуля:

<IfModule [!]имя-модуля>
...
</IfModule>


Директивы могут иметь следующие области действия (секции могут быть вложенными, каждая директива имеет набор допустимых контекстов - буквы SVDFLA указываются при описании директив):

весь сервер (S)
секция VirtualHost (V)
секции Directory и DirectoryMatch (D)
секции Files и FilesMatch (F)
секции Location и LocationMatch (L)
дополнительный файл настройки размещается в составляющем содержимое сайта каталоге, директивы из него действуют на этот каталог и его подкаталоги (A)

Дополнительные файлы настройки читаются при каждом запросе из каталога и его надкаталогов (сверху вниз, следующий имеет больший приоритет). Обычно имеют имя файла ".htaccess". Директива AccessFileName (SV) позволяет задать другое имя файла или имена (через пробел).

Директива AllowOverride (D, кроме DirectoryMatch) позволяет определить типы директив, допустимых в дополнительном файле настройки (директива также должна быть вообще допустима в контексте A):

All (по умолчанию)
None (дополнительные файлы даже не читаются, что сильно ускоряет работу сервера)
тип [ тип ... ]
AuthConfig (директивы авторизации)
FileInfo (директивы, управляющие типом обработки документа - AddHandler и т.д.)
Indexes (директивы автоматического построения индексов каталогов)
Limit (Allow, Deny и Order)
Options (Options и XBitHack)

Секция VirtualHost (S) включает директивы, применяемые для запросов к указанному хосту ("*" означает любой адрес или любой порт; "_default_" - адреса, не указанные в других секциях):

<VirtualHost имя-или-адрес[:порт] [ имя-или-адрес[:порт] ...]>
...
</VirtualHost>


Секция Directory (SV) включает директивы, применяемые только к запросам файлов из указанного в заголовке секции каталога и его подкаталогов (вместо полного имени каталога можно указывать шаблон в стиле Unix (?*[]) или регулярное выражение в кавычках, перед которым необходимо указать строку "~ "), нельзя вкладывать в секции Directory и Limit:

<Directory имя-каталога>
...
</Directory>


Секция DirectoryMatch (SV) включает директивы, применяемые только к запросам файлов из указанного в заголовке секции каталога и его подкаталогов, нельзя вкладывать в секции Directory и Limit:

<DirectoryMatch регулярное-выражение>
...
</Directory>


Секция Files (SVDA) включает директивы, применяемые только к запросам файлов с указанным в заголовке секции простым именем (вместо простого имени можно указывать шаблон в стиле Unix (?*[]) или регулярное выражение в кавычках, перед которым необходимо указать строку "~ "):

<Files простое-имя-файла>
...
</Files>


Секция FilesMatch (SVDA) включает директивы, применяемые только к запросам указанного в заголовке секции файла:

<FilesMatch регулярное-выражение>
...
</FilesMatch>


Секция Location (SV) включает директивы, применяемые только к запросам URL, указанным в заголовке секции (для локальных - не прокси - запросов нельзя указывать схему, имя хоста, номер порта и строку запроса; можно указывать шаблон в стиле Unix (?*[]) или регулярное выражение в кавычках, перед которым необходимо указать строку "~ ")

<Location начальная-часть-URL>
...
</Location>


Секция LocationMatch (SV) включает директивы, применяемые только к запросам URL, указанным в заголовке секции:

<LocationMatch регулярное-выражение>
...
</LocationMatch>


Секция Limit (SVDFLA) включает директивы управления доступом, применяемые только к запросам указанного в заголовке секции HTTP методам доступа (GET (действует также на HEAD), POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK; TRACE указывать нельзя):

<Limit метод [ метод ...]>
...
</Limit>


Секция LimitExcept (SVDFLA) включает директивы управления доступом, применяемые к запросам не указанных в заголовке секции HTTP методов доступа:

<LimitExcept метод [ метод ...]>
...
</LimitExcept>


Порядок применения директив определения свойств и прав доступа к объекту (все секции одного типа, кроме Directory и .htaccess, применются по порядку; Directory и .htaccess применяются от кратчайшего пути к самому длинному; секции внутри VirtualHost применяются после соответствующих общих секций):

секция Directory (кроме регулярных выражений) и .htaccess (.htaccess перебивает Directory, если разрешено директивой AllowOverride)
секция DirectoryMatch и Directory с регулярными выражениями
секции Files и FilesMatch
секции Location и LocationMatch

Директивы модуля Core


Общие характеристики сервера или виртуального сервера:

SV AllowEncodedSlashes off | on (разрешать принимать запросы с URL, в состав которых входит закодированный '/' или '\' (%2F или %5C); декодирование не производится в любом случае)
SV DocumentRoot путь (определяет, где находится корень документов сервера или виртуального сервера; добавляется к локальной части URL или к относительному имени файла для образования абсолютного имени файла)
SV ErrorLog имя-файла | syslog:facility (logs/error_log; куда выдавать сообщения об ошибках; если имя файла начинается с символа '|', то это программа обработки)
SVD HostNameLookups off | on | double (определять ли имя клиента по его IP-адресу; double - сначала делается обратный, затем прямо запрос к DNS, результат сравниваются)
SVD IdentityCheck off | on (запрашивать identd (RFC 1413) на клиентском компьютере для идентификации клиента)
SV KeepAlive on | off (обслуживать несколько запросов, не прерывая TCP-соединения с клиентом)
SV KeepAliveTimeout секунд (15)
SV LimitInternalRecursion число [число] (10; ограничение числа внутренних перенаправлений и подзапросов)
S LimitRequestFields число (100; максимальное число полей в заголовке запроса)
S LimitRequestFieldsize байт (8190; максимальный размер поля заголовка)
S LimitRequestLine байт (8190; максимальная длина строки запроса - метод, URI, версия)
SV LogLevel emerg | alert | crit | error | warn | notice | info | debug (warn; сообщения какого уровня серьёзности записывать в журнал ошибок)
S MaxKeepAliveRequests максимальное-число-запросов-при-keep-alive (100)
S NameVirtualHost addr[:port] (привязывает виртуальный хост к данному адресу/порту: запросы на этот адрес будут распределяться только между этими виртуальными хостами; если NAT или прокси перебрасывает запросы снаружи на другой IP адрес, то здесь необходимо указать новый адрес)
SV ServerAdmin email-address
V ServerAlias дополнительное-имя-хоста ... (задаёт альтернативные имена для виртуального хоста в дополнение к ServerName)
SV ServerName полное-доменое-имя[:порт] (используется для redirect; в секции виртуального хоста определяет значение поля "Host:" для обслуживаемых запросов)
V ServerPath путь (все запросы, URI которых начинаются с путь будут обслуживаться этим виртуальным сервером; адрес и порт должны соответствовать тоже; необходим для устаревших клиентов, не умеющих указывать заголовок "Host:")
S ServerRoot полное-имя-директории (задаёт место, где лежат все файлы сервера; отсюда отсчитываются относительные имена файлов)
S ServerTokens Major | Minor | Minimal | ProductOnly | OS | Full (Full; что сервер сообщает о себе в заголовке "Server:", примерный текст:
ProductOnly - Server: Apache
Major - Server: Apache/2
Minor - Server: Apache/2.0
Minimal - Server: Apache/2.0.42
OS - Server: Apache/2.0.42 (Unix)
Full - Server: Apache/2.0.42 (Unix) PHP/3.0 MyMod/1.2
S TimeOut секунд (300)
SVD UseCanonicalName on | off|DNS (как сервер определяет своё имя; используется при генерации URL, ссылающихся на этот же сервер:
On - использовать имя, определенное в ServerName
Off - использовать параметры из запроса пользователя
DNS - для устаревших клиентов, не обеспечивающих заголовок Host:

Ограничения на потребление ресурсов и оптимизация:

SVDFLA EnableMMAP on | off (использовать mmap(); для файлов, хранящихся в файловых системах NFS и SMB лучше отключить)
SVDFLA EnableSendfile on | off (использовать sendfile(); для файлов, хранящихся в файловых системах NFS и SMB лучше отключить)
SVDFLA LimitRequestBody байт (0, т.е. бесконечность)
SVDFLA LimitXMLRequestBody байт (1000000)
SVDFLA RLimitCPU soft-limit max-resource-limit (задает максимальное число секунд CPU для работы CGI процессов; оба параметра могут быть числом или словом max)
SVDFLA RlimitMEM soft-limit max-resource-limit (задает максимальное число байт, которое может использовать CGI процесс; оба параметра могут быть числом или словом max)
SVDFLA RlimitNPROC soft-limit max-resource-limit (задает максимальное число процессов, которое может запустить CGI процесс; оба параметра могут быть числом или словом max)

Вариации протокола взаимодействия с клиентами и путь обработки запроса:

SVDFLA AcceptPathInfo Default | On | Off (что делать с запросами, URI которых содержит "лишние" символы в конце:
Off - возвращать код 404
On - выдавать файл, имя которого совпадает с началом пути в URI
Default - в зависимости от обработчика: обработчик обычных файлов возвращает код 404, обработчики скриптов принимают запрос
SVDFLA AddDefaultCharset Off | On | имя-кодировки (для ответов типа text/plain и text/html добавлять заголовок с указанием кодировки; on - iso-8859-1)
SVDFLA AddOutputFilterByType фильтр[;...] MIME-тип ... (направляет ответ на запрос на вход исходящего фильтра в зависимости от MIME-типа:
AddOutputFilterByType DEFLATE text/html text/plain

SVDFLA ContentDigest Off | On (включать в ответ заголовок Content-MD5:)
SVDFLA DefaultType MIME-тип (text/plain)
SVDFLA ErrorDocument код-ошибки документ (какое сообщение выдавать в случае указанной ошибки; MSIE заменяет короткие (менее 512 байт) сообщения отсебятиной; описывается так:
default
"текст сообщения"
/локальный-URI-путь (в т.ч. скрипт)
http://имя-сайта...
SVDFLA FileETag атрибут-файла ... (какие атрибуты файла использовать для генерации заголовка ответа "ETag:" (используется при кешировании) - INode, MTime, Size, All, None; перед именем атрибута могут стоять управляющие символы '+' и '-')
DFLA ForceType MIME-тип | None (назначать всем ответам указанный MIME-тип)
SVDFLA Options [+ | -]опция ... (All; какие опции сервера доступны для данной директории:
None
All (кроме MultiViews)
ExecCGI - разрешается выполнение CGI
FollowSymLinks - ходить по символьным ссылкам (игнорируется в секции Location; при сравнении используется исходное имя)
Includes - использовать SSI
IncludesNOEXEC - использовать SSI, кроме exec и include CGI
Indexes - генерировать листинг директории, если отсутствует файл index.html
MultiViews - определять представление ресурса в зависимости от предпочтений клиента (тип носителя, язык, набор символов кодировка) (не надо это включать)
SymLinksIfOwnerMatch - следовать по символьным ссылкам, только если владелец целевого файла совпадает c владельцем ссылки (игнорируется в секции Location)
SVDFLA ServerSignature Off | On | EMail (позволяет дописывать информацию о сервере в конец сгенерированных документов: сообщения об ошибках, индекс каталога и т.п.)
SVDFLA SetHandler имя-обработчика | None (установить обработчик файла вне зависмости от суффикса или MIME-типа)
SVDFLA SetInputFilter фильтр[;...] (запрос пропускается через указанные фильтры)
SVDFLA SetOutputFilter фильтр[;...] (ответ пропускается через указанные фильтры)


Аутентификация и авторизация:

DFLA AuthName домен-авторизации (какой домен - realm - авторизации клиент должен использовать при аутентификации; выдаётся на экран при запросе имени и пароля)
DFLA AuthType Basic | Digest
DFLA Require тип имя [имя ...] (какой аутентифицированный пользователь может иметь доступ:
user {имя-пользователя} (только пользователи с данными именами)
group {имя-группы} (только пользователи из данной группы)
valid-user (любой аутентифицированный пользователь)
DFLA Satisfy All | Any (если одновременно используются методы авторизации Allow и Require, то требовать авторизации по обоим критериям или любому из них)

Модули управления процессами (MPM)


В отличие от первой версии Apache 2 может использовать различные модули управления процессами (MPM). Сервер может быть собран только с одним MPM. MPM осуществляет запуск процессов, потоков и привязку запросов клиентов к процессу или потоку. Область действия всех директив, кроме AssignUserID - сервер. Типы MPM:

prefork - MPM с ветвлением (как в Apache 1.3); никаких потоков, каждому запросу выделяется отдельный процесс, процессы порождаются заранее и используются при обработке последовательных запросов; директивы:
MinSpareServers число (5; минимальное число запасных процессов; недостающие процессы создаются с темпом 1 штука в секунду)
MaxSpareServers число (10; максимальное число запасных процессов; лишние процессы завершаются)
worker - гибридный MPM: запускается множество процессов, каждый из которых имеет множество обслуживающих потоков; директивы:
ThreadsPerChild число (25; число потоков на каждый обслуживающий процесс; создаются при запуске процесса, число потоков никогда не меняется)
leader - экспериментальный вариант MPM worker (--with-mpm=leader и --enable-nonportable-atomics=yes)
threadpool - экспериментальный вариант MPM worker
perchild - MPM с фиксированным количеством процессов, процессы запускаются с различными полномочиями и могут обслуживать указанное количество потоков; объявлен разработчиками как неработающий; директивы:
NumServers число-процессов
ChildPerUserID uid gid число-процессов
AssignUserID uid gid (используется при описании виртуального сервера)
StartThreads число (5 штук на процесс для perchild, сколько обслуживающих потоков запускать в начале работы)
MaxThreadsPerChild число (64)

Общие директивы:

Listen [IP-адрес:]порт (обслуживаемый адрес (по умолчанию - все интерфейсы) и порт; можно использовать несколько раз)
ServerLimit число (256 для prefork, 8 для perchild, 16 для других гибридных MPM; максимальное число процессов; нельзя изменить при перезапуске)
ThreadLimit число (64; максимальное число потоков на процессов; нельзя изменить при перезапуске)
MaxClients число (256 для prefork, ServerLimit*ThreadsPerChild для гибридных MPM; максимально возможное число одновременно обслуживаемых клиентов; остальные запросы ставятся в очередь до ListenBacklog штук)
ListenBacklog число (511; размер очереди запросов, ожидающих обслуживающего процесса или потока)
MaxRequestsPerChild число (10000; после обслуживания указанного числа соединений процесс завершается - на всякий случай; 0 означает бесконечность)
User uid (-1; идентификатор пользователя в смысле Unix, с правами которого будут запускаться обслуживающие процессы)
Group gid (-1; идентификатор группы в смысле Unix, с правами которой будут запускаться обслуживающие процессы)
MaxMemFree КБ (0, т.е. бесконечность; сколько неиспользуемой памяти можно удерживать, не выдавая free())
AcceptMutex метод (Default - определяется при сборке; метод раздачи запросов по обслуживающим процессам: flock, fcntl, posixsem, pthread, sysvsem)
LockFile имя-файла (logs/accept.lock; файл, используемый в методах fcntl и flock; нельзя располагать на NFS разделе)
StartServers число (5 для prefork, 3 для гибридных MPM; сколько обслуживающих процессов запускать в начале работы)
MaxSpareThreads число (10 штук на процесс для perchild, 250 штук на весь сервер для worker и его производных (при избытке закрываются процессы целиком); для гибридных MPM определяет максимальное число запасных обслуживающих потоков)
MinSpareThreads число (5 штук на процесс для perchild, 75 штук на весь сервер для worker и его производных (при недостатке создаются новые процессы, а не потоки); для гибридных MPM определяет минимальное число запасных обслуживающих потоков)
SendBufferSize байт (0, т.е. определяется ОС; размер буфера TCP)
CoreDumpDirectory каталог
PidFile имя-файла (logs/httpd.pid; указанному процессу надо посылать SIGHUP для повторного чтения конфигурационного файла)
ScoreBoardFile имя-файла (logs/apache_status; в этом файле хранится информация для координации работы процессов сервера; если его не указать, то синхронизация производится через разделяемую память, т.е. значительно быстрее)
EnableExceptionHook On|Off (Off; требуется ключ --enable-exception-hook при сборке; позволяет подключать обработчик аварийных завершений (mod_whatkilledus или mod_backtrace) сервера)

Базовые модули (для Unix)


Базовые модули входят в состав сервера при сборке по умолчанию:

access (авторизация доступа)
actions (позволяет привязать CGI скрипт к обработчику, MIME типу или методу запроса)
alias (отображение URL в файловую систему и перенаправление)
asis (обработчик send-as-is позволяет обрабатывать файлы, которые содержат часть заголовков ответа в себе)
auth (аутентификация Basic, построенная на текстовых файлах)
autoindex (в отсутствии сделанного вручную индексного файла каталога (задаётся модулем dir) создаёт его "на ходу" из списка находящихся в каталоге файлов)
cgi (обработчик CGI; устанавливается по умолчанию для prefork MPM)
cgid (обработчик CGI; устанавливается по умолчанию для гибридных MPM)
dir (отображение имени каталога, указанного в URL, в запрос индексного файла)
env (устанавливает и изменяет переменные окружения)
imap (обработка графических карт сервером: клиенту выдаётся изображение меню и когда он кликает на точку внутри изображения, сервер получает координаты точки; карта описывает области изображения и соответствующие им действия сервера)
include (реализует фильтр SSI)
log_config (журнал доступа)
mime (ассоциация файла по суффиксу имени с его обработкой (обработчики и фильтры) и типом содержимого (MIME тип, язык, набор символов и кодировка))
negotiation (позволяет серверу выбрать один из возможных документов для обслуживания клиента на основе характеристик каждого клиента)
setenvif (позволяет устанавливать переменные окружения в зависимости от характеристик запроса)
status (выдача информации о текущем состоянии сервера)
userdir (директива UserDir позволяет определить каталог в домашнем каталоге пользователя, который надо использовать при обработке URL вида http://www.company.ru/~username/; по умолчанию - public_html; рекомендуется сделать "UserDir disabled", а затем "UserDir enabled имя-пользователя", чтобы разрешить сайт только одному пользователю, а не всем подряд, включая root)

Модули расширения (для Unix)


Модули расширения необходимо добавить явно при сборке apache:

auth_anon (доступ анонимных клиентов к закрытым каталогах как для anonymous ftp; используется как механизм отслеживания клиентов вместо куки)
auth_dbm (аутентификация Basic, построенная на DBM)
cern_meta (позволяет добавлять заголовки в ответ; для каждого файла создаётся отдельный файл с дополнительными заголовками; MetaDir, MetaFiles, MetaSuffix)
dav (реализация WebDAV класса 1 и 2 (клиенты: IE 5.0, cadaver, sitecopy); позволяет создавать, копировать, перемещать и удалять ресурсы; обеспечивает синхронизацию нескольких редакторов; требуется аутентификация клиентов - Digest или Basic поверх SSL; сервер должен иметь права записи на требуемые файлы и каталоги; Dav, DavDepthInfinity, DavMinTimeout)
dav_fs (вспомогательный модуль для dav - метод хранения filesystem; DavLockDB)
deflate (реализует фильтр DEFLATE)
expires (управление содержимым заголовков Expires и Cache-Control)
ext_filter (позволяет использовать внешнюю программу в качестве фильтра)
headers (удаление и замена заголовков запросов и ответов)
info (выдача информации о конфигурации сервера)
log_forensic (записывает в отдельный журнал полные заголовки каждого запроса для отладки тяжёлых случаев)
logio (считает входящие и исходящие байты для каждого запроса (и заголовки, и тела; до TLS/SSL дешифровки на входе и после - на выходе), что позволяет использовать форматы %I и %O в модуле log_config)
mime_magic (определяет MIME тип по содержимому файла, аналогично программе file(1))
proxy (позволяет Apache работать как прокси-сервер; для обслуживания протокола FTP требуется модуль proxy_ftp, HTTP - proxy_http, CONNECT/SSL - proxy_connect и ssl; для кеширования может использоваться модуль cache; может работать в режиме прямого (ProxyRequests) и обратного (ProxyPass, RewriteRule) прокси (балансировка загрузки, кеширование, обход экрана или слияние адресных пространств нескольких серверов))
proxy_connect (вспомогательный модуль для модуля proxy)
proxy_ftp (вспомогательный модуль для модуля proxy)
proxy_http (вспомогательный модуль для модуля proxy)
rewrite (более мощное средство преобразования URL, чем alias)
so (загрузка дополнительных модулей при запуске и перезапуске сервера вместо пересборки сервера - DSO, .so, LoadModule, LoadFile)
speling (пытается скорректировать очепатки в URL)
ssl
suexec (позволяет запускать CGI программы под указанным именем пользователя и группы)
unique_id (уникальный идентификатор для каждого запроса)
usertrack (отслеживание клиентов с помощью куки)
vhost_alias (организация массового виртульного хостинга, имя из заголовка запроса "Host:" используется для определения каталога, из которого брать файлы; VirtualDocumentRoot, VirtualDocumentRootIP, VirtualScriptAlias, VirtualScriptAliasIP)

Экспериментальные модули (для Unix)


Экспериментальные модули необходимо добавить явно при сборке apache:

auth_digest (аутентификация Digest, построенная на текстовых файлах)
auth_ldap (BASIC аутентификация с использованием LDAP)
cache (кеширование местного или внешнего содержимого и доступ по ключу; требует по крайней мере одного модуля хранения)
charset_lite (перекодировка документов из кодировки хранения в кодировку клиента)
disk_cache (модуль хранения для модуля cache)
dumpio (записывать все входящие сообщения после декодирования SSL (DumpIOInput On) и/или все выходящие сообщения до кодирования SSL (DumpIOOutput On) в журнал ошибок)
file_cache (кеширование статических файлов)
ldap (кеширование соединений с LDAP и ответов)
mem_cache (модуль хранения для модуля cache)

Переменные окружения


Сервер позволяет обмениваться информацией с внешними программами (CGI) и между модулями с помощью переменных окружения. Имя пременной должно начинаться с буквы и может содержать буквы, цифры и подчёркивания. Перед вызовом CGI сервер устанавливает переменные запроса в соответствии со стандартом (и кое что от себя, некоторые модуля добавляют свои переменные):

DOCUMENT_ROOT="абсолютное-имя-директории-документов-виртуального-сервера"
GATEWAY_INTERFACE="CGI/1.1"
HTTP_ACCEPT="image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*"
HTTP_ACCEPT_CHARSET="iso-8859-1,*,utf-8"
HTTP_ACCEPT_LANGUAGE="ru, en"
HTTP_CACHE_CONTROL="max-age=259200"
HTTP_CONNECTION="keep-alive"
HTTP_HOST="www.printhouse.ru" - если клиент посылает поле HOST в запросе
HTTP_IF_MODIFIED_SINCE="Wednesday, 26-Jul-00 15:20:17 GMT; length=1437"
HTTP_USER_AGENT="Mozilla/4.05 [en] (X11; I; SunOS 5.5 sun4m)"
HTTP_VIA="1.0 acache.deol.ru:3129 (Squid/2.3.STABLE1)" - proxy
HTTP_X_FORWARDED_FOR="195.161.72.28" - proxy
PATH="директории, в которых ищутся исполняемые программы"
QUERY_STRING=""
REMOTE_ADDR="клиент или прокси"
REMOTE_PORT="39885"
REQUEST_METHOD="GET"
REQUEST_URI="/cgi-bin/printenv"
SCRIPT_FILENAME=абсолютное имя файла"
SCRIPT_NAME="логическое имя объекта"
SERVER_ADDR="IP адрес"
SERVER_ADMIN="почтовый адрес администратора сервера"
SERVER_NAME="имя-определенное-по-IP"
SERVER_PORT="80"
SERVER_PROTOCOL="HTTP/1.0"
SERVER_SIGNATURE="
Apache/1.3.12 Server at dual.deol.ru Port 80
\n"
SERVER_SOFTWARE="Apache/1.3.12 (Unix) rus/PL29.4"

Директивы модуля env:

SVDFLA PassEnv имя-переменной ... (передаёт значение системной - установливается в момент запуска сервера - переменной окружения)
SVDFLA SetEnv имя-переменной значение
SVDFLA UnsetEnv имя-переменной ...

Модуль setenvif позволяет устанавливать переменные в зависимости от характеристик запроса (директивы выполлняются последовательно):

SVDFLA BrowserMatch регулярное-выражение [!]имя-переменной[=значение] ... (установить переменную (в 1) или присвоить значение или удалить переменную в зависимости от заголовка запроса "User-Agent:")
BrowserMatchNoCase - сравнение без учёта регистра символов
SVDFLA SetEnvIf имя-атрибута регулярное-выражение [!]имя-переменной[=значение] ... (установить переменную (в 1) или присвоить значение (может содержать $1-$9 как значения подвыражения, см. PCRE) или удалить переменную в зависимости от значения атрибута:
имя поля заголовка запроса (например: Host, User-Agent, Referer, Accept-Language и др.), вместо имени поля можно указывать регулярное выражение
Remote_Host
Remote_Addr
Server_Addr
Request_Method (GET, POST и т.д.)
Request_Protocol ("HTTP/0.9", "HTTP/1.1" и т.д.)
Request_URI
имя переменной окружения, установленной предыдущими директивами SetEnvIf[NoCase]
SetEnvIfNoCase - сравнение без учёта регистра символов

Директива RewriteRule модуля rewrite имеет опцию установки переменной окружения.

Модуль unique_id уставливает "уникальное" для каждого запроса значение в переменную UNIQUE_ID.

Использование переменных в модулях:

модуль include (SSI) позволяет выводить значения переменных командой echo и использовать их для условного исполнения
модуль access позволяет управлять доступом, основываясь на значениях переменных
модуль log_config позволяет заносить значения переменных в журнал и принимать решения о записи вообще
модуль header позволяет добавлять поля в заголовок ответа, основываясь на значениях переменных
модуль mod_ext_filter может активировать внешний фильтр, основываясь на значениях переменных
модуль rewrite может использовать различные варианты, основываясь на значениях переменных

Специальные переменные окружения, меняющие обработку запроса сервером:

downgrade-1.0 (обрабатывать запрос в соответствии с протоколом HTTP/1.0)
force-no-vary (не вставлять поле Vary в заголовок ответа)
force-response-1.0 (выдавать ответ в формате HTTP/1.0)
gzip-only-text/html (запретить использование модуля deflate для всех типов содержимого, кроме text/html)
no-gzip (запретить использование модуля deflate для всех типов)
nokeepalive
prefer-language (модуль negotiation выбирает вариант, основываясь на этикетке языка, указанной в запросе)
redirect-carefully (для доступа DAV Microsoft WebFolders)
suppress-error-charset (сопроводительный текст перенаправления не помечается как ISO-8859-1)

Журналы


Журнал ошибок управляется директивами ErrorLog и LogLevel модуля Core. Кроме сообщений сервера сюда направляется вывод на stderr скриптов CGI, вывод модуля dumpio.

Журнал доступа управляется модулем log_config, который позволяет задать имя файла и формат вывода. Данный журнал содержит записи о всех (если не отфильтровано директивой CustomLog) запросах к серверу. Каждый виртуальный сервер может вести произвольное число журналов в различных форматах.

Каждый запрос к серверу порождает строку в журнале, состоящую из элементов (token), разделенных пробелами. Пустой элемент записывается как символ '-'. Если элемент содержит пробелы, то он должен заключаться в кавычки (это надо самому предусмотреть при описании формата). При описании формата используются литеральные символы, которые копируются в журнал (можно использовать '\n' и т.п.; кавычки и обратная косая должны быть прикрыты символом '\') и директивы, которые начинаются с символа '%' и завершаются однобуквенным именем директивы. Между ними может стоять условие в виде списка кодов завершения HTTP через запятую (м.б. предваренных восклицательным знаком для операции отрицания) - если условие не выполняется, то вместо элемента записывается минус. Модификаторы перед буквой директивы позволяют определить (в случае внутреннего перенаправления) атрибут исходного ('<') или результирующего ('>') запроса будет использоваться при создании строки журнала. Директива в описании формата замещается соответствующим значением:

%% - '%'
%a - адрес удаленного хоста
%A - локальный адрес
%B - количество посланных байт, кроме HTTP-заголовка
%b - количество посланных байт, кроме HTTP-заголовка (вместо 0 пишется '-')
%{имя-куки}C - значение куки
%D - микросекунд потрачено на обработку запроса
%{имя}e - значение переменной окружения
%f - имя файла
%h - имя удаленного хоста
%H - протокол (HTTP)
%{имя-заголовка}i - значение заголовка запроса; наиболее часто используются
Referer - откуда была ссылка на документ
User-agent - что сказал о себе броузер
%I - количество полученных байт, включая заголовки (требуется logio)
%l - имя удаленного пользователя (если задействован ident)
%m - метод (GET, PUT и т.д.)
%{имя-заметки}n - содержимое заметки с указанным именем, созданной другим модулем (например, %{forensic-id}n или %{cookie}n)
%{имя-заголовка}o - значение заголовка ответа
%O - количество посланных байт, включая заголовки (требуется logio)
%p - канонический номер порта сервера
%P - pid процесса, обслуживающего запрос
%{tid}P - идентификатор потока, обслуживающего запрос
%q - поисковая часть URI (после '?')
%r - первая строка запроса
%s - статус запроса (код возврата HTTP)
%t - время в CLF-формате ([day2d/month3l/year4d:hour2l:minute2l:second2l zone], где zone в формате [+|-]hour2dmin2d)
%{формат}t - время, формат описан в strftime(3)
%T - секунд, прошедших до окончания обслуживания запроса
%u - имя авторизованного пользователя (если статус не равен 401)
%U - запрошенный URL без поисковой части
%v - канонический ServerName
%V - имя сервера в соответствии с значением UseCanonicalName
%X - состояние соединения к моменту завершения ответа ('X' - преждевременный обрыв, '+' - можно использовать повторно, '-' - необходимо закрыть после завершения обработки запроса)

Директивы модуля log_config (рекомендуется использовать только LogFormat для определения формата и CustomLog для создания журнала):

SV CookieLog имя-файла (только для совместимости со старым модулем mod_cookie; рекомендуется использовать mod_usertrack и CustomLog)
SV CustomLog имя-файла-или-канала формат-или-имя-формата[env=[!]имя-переменной] (вести журнал определенного формата в указанном файле или подать на вход программе; канал записывается как символ "|", за которым идет имя запускаемой программы; журнал подается на стандартный ввод программы, которая запускается с теми же правами, что и httpd (root); формат определяется директивой LogFormat; env= позволяет заносить в журнал записи только о тех запросах, которые удовлетворяют условию)
SV LogFormat формат-или-имя-формата [имя-формата] (определить формат с указанным именем; по умолчанию - "%h %l %u %t \"%r\" %>s %b" - так называемый Common Log Format (CLF))
SV TransferLog имя-файла-или-канала (аналогично CustomLog, но формат определяется в предыдущей LogFormat без имени)

Модуль cgi имеет директиву ScriptLog, которая позволяет записывать весь ввод/вывод CGI скриптов. Модуль rewrite позволяет записывать относящуюся к преобразованию адресов информацию в отдельный файл (RewriteLog и RewriteLogLevel). Модуль dumpio записывает все входящие сообщения после декодирования SSL (DumpIOInput On) и/или все выходящие сообщения до кодирования SSL (DumpIOOutput On) в журнал ошибок.

Модуль log_forensic записывает в журнал полный текст заголовка запроса до и после обраьотки. Требует наличия модуля mod_unique_id. Уникальный идентификатор запроса может быть записан в обычный журнал директивой формата "%{forensic-id}n". Директива:
SV ForensicLog имя-файла-или-канала.

Каталог с журналами должен быть закрыт от записи посторонними. Журналы хранят информацию, полученную непосредственно от клиентов, и могут содержать управляющие символы (после 2.0.46 они заменяются на последовательности вида \x01; '"' преобразуются в '\"'; '\' - в '\\'; табуляции и т.п. - в '\n', '\t'), так что смотреть их надо осторожно.

Обработка журналов осуществляется внешними программами, например, analog или webalyzer. Чтобы удалить старые журналы необходимо переименовать их, затем перезапустить сервер (apachectl graceful), подождать пока закончится обработка текущих запросов и только после этого можно перемещать или сжимать старые журналы.

Аутентификация и авторизация


authentication - это установление личности пользователя (имя пользователя не длинее 255 символов и не может содержать символ ':'), а authorization - проверка полномочий на выполнение каких-либо действий.

При аутентификации сервер определяет директивой ядра AuthName какой домен (realm) авторизации клиент должен использовать при аутентификации; выдаётся на экран при запросе имени и пароля. Директивой ядра AuthType определяется тип аутентификации - Basic (имя и пароль передаются по сети в открытом виде, если не прикрыть TLS/SSL) или Digest. Аутентификация производится при каждом запросе, клиентская программа может скрывать это подставляя имя/пароль из кеша для одного и того же домена.

Директива AuthUserFile (DA) модуля auth определяет имя файла с паролями. Файл состоит из строк, содержащих имя пользователя и хешированный пароль (разделяются двоеточием). Директива AuthGroupFile (DA) модуля auth определяет имя файла c описанием групп пользователей. Файл состоит из строк, каждая из которых описывает одну группу. В начале строки указывается имя группы, затем двоеточие, затем список имён пользователей через пробел. Директива AuthAuthoritative (DA) позволяет при неудаче аутентификации передать запрос следующему модулю аутентификации (auth_ldap, auth_mysql), если указать "Off".

Модуль auth_dbm позволяет хранить имена, пароли и списки групп в DBM, что значительно ускоряет работу сервера при большом количестве пользователей в списках. Директива AuthDBMUserFile (DA) определяет имя файла с паролями (ключ - имя пользователя, значение - пароль). Директива AuthDBMGroupFile (DA) определяет имя файла c описанием групп пользователей (ключ - имя пользователя, значение - список групп через запятую). Директива AuthDBMType (DA) позволяет явно задать тип DBM: default, SDBM, GDBM, NDBM, DB. Директива AuthDBMAuthoritative (DA) позволяет при неудаче аутентификации передать запрос следующему модулю аутентификации (auth_ldap, auth_mysql), если указать "Off".

Модуль auth_digest позволяет использовать аутентификацию типа Digest. Директива AuthDigestAlgorithm (DA) определяет вариант алгоритма (MD5 или MD5-sess (недоделан)). Директива AuthDigestFile (DA) определяет имя файла с паролями. Директива AuthDigestGroupFile (DA) определяет имя файла c описанием групп пользователей. Директива AuthDigestDomain (DA) позволяет задать список URI через пробел, которые относятся к одному домену. URI из списка рассматриваются клиентом как префикс в адресном пространстве и используются для оптимизации (очень рекомендуется). Имеется множество директив (недоделанных) по тонкой настройке процесса аутентификации. Может сразу перейти на TLS? Кстати, для обслуживания MS IE требуется следующий хак:

BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On


Предварительно необходимо создать файл паролей в месте, недоступном для извлечения с сайта. Для создания файла используются утилиты htpasswd (аутентификация Basic, текстовые файлы), htdigest (аутентификация Digest, текстовые файлы), htdbm (аутентификация Basic, DBM, в девичестве называлась dbmmanage, так её и сейчас называют в документации). Добавление (изменение, удаление) пользователя в файл:

htpasswd имя-файла-с-паролями имя-пользователя


Ключи:

-c (создавать файл с паролями)
-d (использовать crypt() вместо хеширования MD5)
-m (использовать хеширование MD5 вместо crypt())
-D (удалить запись из файла)

Вывод созданной записи на stdout вместо записи в файл (можно использовать ключи -d и -m):

htpasswd -n имя-пользователя


Утилита htdigest позволяет добавить пользователя в текстовый файл паролей для аутентификации типа Digest (ключ -c создаёт файл):

htdigest имя-файла-с-паролями realm имя-пользователя


Модули auth_anon, auth_ldap и auth_mysql реализуют дополнительные возможности аутентификации.

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

Модуль access обеспечивает авторизацию доступа на основе IP адреса клиента или других характеристиках запроса (т.е. без аутентификации). Секция Limit позволяет ограничить действие директив авторизации конкретными методами доступа. Директивы:

DFLA Order порядок (определяет очередность в которой применяются директивы Allow и Deny)
Deny,Allow - первыми применяются директивы Deny, затем Allow (начальное состояние - доступ разрешен)
Allow,Deny - первыми применяются директивы Allow, затем Deny (начальное состояние - запрещено)
Mutual-failure - доступ только с тех хостов, которые перечислены в Allow и неперечислены в Deny
DFLA Allow from {адрес} (определяет с каких адресов будет дан доступ к данной директории)
all - со всех хостов
доменное имя (м.б. частичное) - с тех хостов, имя которых заканчивается на эту строку; сервер делает обратный, затем прямой поиск DNS
полный IP адрес
частичный IP адрес - первые 1, 2 или 3 байта IP адреса
a.b.c.d/e.f.g.h - network/netmask
a.b.c.d/nnn - network/бит
DFLA Allow from env=имя-переменной (доступ разрешается только если определена соответствующая переменная окружения)
DFLA Deny ... (определяет с каких адресов не будет доступа к данному каталогу или файлу; синтаксис идентичен синтаксису директивы Allow)

Директива ядра Satisfy увязывает требования Require и Allow/Deny.

Виртуальные хосты


Один сервер Apache может обслуживать запросы к нескольким сайтам (на одном компьютере можно запустить несколько серверов Apache, если это необходимо по требованиям безопасности - в этом случае можно задать отдельные User/Group). Описание каждого сайта заключается в секцию VirtualHost. Запросы, которые сервер не может соотнести ни с одной секцией VirtualHost, обслуживаются исходя из настроек главного сайта. Привязка сайта к виртуальному хосту может быть на основе IP адреса (возможно определение виртуального хоста со специальным именем "_default_", которое будет "перехватывать" на себя все неприкаянные запросы) или имени (работает только для клиентов, умеющих выдавать заголовок "Host:" в запросе; надеюсь, что других сейчас не осталось; см. также директиву ServerPath). При использовании TLS/SSL нельзя использовать привязку по имени. Внутри секции может быть использована почти любая директива (буква V в описании) или секции DFL. Самая необходимая директива - DocumentRoot, которая задаёт привязку корневого локального URI в каталогу файловой системы. Обычно также используются директивы ServerAdmin, ServerName и задание отдельных журналов.

При виртуальном хостинге на основе IP адреса для определения нужного сайта (секции VirtualHost) используется IP адрес сервера (или порт), соответственно, каждый сайт должен иметь отдельный IP адрес. В заголовке секции рекомендуется указывать IP адрес (в любом случае, при разборе конфигурации доменное имя преобразуется в IP адрес).

При виртуальном хостинге на основе имени директива NameVirtualHost (в основной секции) привязывает виртуальный хост к указанному адресу/порту: запросы на этот адрес будут распределяться только между соответствующими виртуальными хостами; если NAT или прокси перебрасывает запросы снаружи на другой IP адрес, то в директиве необходимо указать новый адрес. В качестве адреса можно использовать шаблон ("*" или "*:80"). Для приёма запросов необходимо дополнительно использовать директиву Listen. Аргумент секции VirtualHost должен соответствовать аргументу NameVirtualHost. В секции VirtualHost необходимо обязательно указать ServerName и DocumentRoot. Директива ServerAlias позволяет задать дополнительные имена сайта для виртуального хоста.

При получении запроса сервер проверяет соответствует ли входящий адрес и порт упомянутым в директиве NameVirtualHost. Если соответствует, то он перебирает секции VirtualHost, в заголовках которых указан входящий адрес. В них он ищет ту секцию, в которой указана директива ServerName (или ServerAlias), соответствующая заголовку запроса "Host:". Если соответствия не найдено ("_default_" соответствует всегда), то используется первая попавшаяся секция.

Модуль vhost_alias предназначен для организации массового виртульного хостинга.

Отображение URI в имена файлов


При получении запроса сервер прежде всего определяет виртуальный хост, к которому он относится. Соответствующая секция VirtualHost определяет дополнительные параметры. В простейшем случае локальная часть URI дописывается к значению DocumentRoot виртуального хоста, файл с получившимся именем извлекается и передаётся клиенту. Символьные ссылки в каталоге DocumentRoot обрабатываются только, если действуют опции (директива Options) FollowSymLinks или SymLinksIfOwnerMatch.

Директива AcceptPathInfo позволяет выдавать файл, имя которого совпадает с началом пути в URI. Директива ErrorDocument позволяет определить реакцию на несуществующий файл.

Модуль userdir позволяет определить каталог в домашнем каталоге пользователя, который надо использовать при обработке URL вида http://www.company.ru/~username/ (по умолчанию - public_html). Рекомендуется сделать "UserDir disabled", а затем "UserDir enabled имя-пользователя", чтобы разрешить сайт только одному пользователю, а не всем подряд, включая root (а лучше не включать этот модуль в сборку).

Модуль alias позволяет отображать URL в различные части файловой системы и перенаправлять запросы (директивы модуля alias обрабатываются после Location, но до Directory; директивы Redirect обрабатываются по очереди раньше директив Alias, которые также обрабатываются последовательно до первого совпадения):

SV Alias строка имя-каталога-или-файла (запрос с URL (% декодируются), начинающегося со строка, будет отображен на файл, начинающийся с имя-каталога-или-файла (м.б. вне DocumentRoot); доступ к имя-каталога-или-файла должен быть разрешен отдельно)
SV AliasMatch регулярное-выражение имя-каталога-или-файла (аналогично Alias, но сравнение производится в соответствие с регулярным выражением; часть регулярного выражения, заключенная в скобки, запоминается как позиционный параметр и м.б. вставлена в правую часть ($1 и т.д.))
SVDFLA Redirect [статус ] строка новый-URL (преобразование %-декодированного исходного URL (строка) в результатирующий (новый-URL); клиенту возвращается сообщение об ошибке и новый URL, который он должен запросить; строка д.б. абсолютным адресом; статус (по умолчанию temporary - код 302) определяет код возврата:
permanent - ресурс перемещён навсегда (301)
temp - ресурс перемещён временно (302)
seeother - ресурс замещён (303)
gone - ресурс удален (410) (в этом случае новый URL д.б. опущен)
явное указание кода
SV RedirectMatch [статус ] regex url (аналогично Redirect, но сравнение производится не на совпадение начал, а по соответствию URL от клиента регулярному выражению; строки, соответствующие подвыражениям в скобках, помещаются в позиционные переменные и м.б. использованы)
RedirectPermanent - эквивалент Redirect permanent
RedirectTemp - эквивалент Redirect temp
SV ScriptAlias строка имя-каталога-или-файла (аналогично директиве Alias, но дополнительно пометить директорию как содержащую CGI)
SV ScriptAliasMatch regex имя-каталога-или-файла (аналогично директиве AliasMatch, но дополнительно пометить директорию как содержащую CGI)

Модуль dir обеспечивает отображение имени каталога, указанного в URL, в запрос индексного файла:

SVDA DirectorySlash On|Off (по умолчанию - On; позволяет перенаправить неправильно оформленные запросы к каталогу (без завершающего '/') в правильные)
SVDA DirectoryIndex local-url ... (задает имя файла (обычно относительно запрашиваемого каталога), в котором лежит вручную сделанный индекс каталога (по умолчанию - index.html); сервер возвращает первый найденный ресурс в ответ на запрос к каталогу)

Модуль speling пытается скорректировать очепатки в URL (директива SVDFLA CheckSpelling Off|On): ошибки с прописными/строчными буквами, пропуск одного символа, вставка одного символа, перестановка 2 символов, замена одного символа). Предполагаемое правильное имя (список имён) возвращается в виде сообщения перенаправления.

Модуль rewrite.

MIME типы, обработчики и фильтры


Модуль mime ассоциирует суффикс (можно указывать с точкой или без, прописные и строчные буквы не различаются) имени файла с обработчиками, фильтрами и типом содержимого (MIME тип, язык, набор символов и метод кодирования). Допустимые MIME типы определяются IANA. Если имя файла имеет несколько суффиксов, то обычно MIME тип определяется по самому правому, а язык и кодировка по совокупности. Метод кодирования (например: сжатие (x-gzip, gzip, x-compress, compress), шифровка, uuencode) рассматривается как модификатор типа, вызывает посылку заголовка "Content-encoding:", чтобы подготовить клиента к декодированию. В запросах воспринимаются как методы кодирования x-gzip (старые клиенты), так и gzip (новый стандарт). В ответах сервер старается соответствовать стилю клиента. Сервер посылает в ответе информацию о языке (Content-Language:, двухсимвольный код) и наборе символов (дополнение charset= в заголовке Content-Type:). Допустимые наборы символов определяются IANA (US-ASCII, ISO-8859-1, ISO-10646-UTF-1, KOI8-R, UTF-7, UTF-8, windows-1251). Данные полученные от клиента могут быть пропущены через последовательность входных фильтров, данные перед передачей клиенту могут быть пропущены через последовательность выходных фильтров. Для использования доступны фильтры модулей include (SSI), deflate и ext_filter. Большинство запросов обслуживается встроенными обработчиками, в зависимости от типа содержимого. Имеется возможность привязывать специальные обработчики в зависимости от типа, имени или расположения ресурса:

default-handler (обработка статических страниц)
send-as-is (модуль asis, заголовки ответа в файле)
cgi-script (модули cgi и cgid)
imap-file (модуль imap; обработка графических карт сервером)
server-info (модуль info; выдача информации о конфигурации сервера)
server-status (модуль status; выдача информации о текущем состоянии сервера)
type-map (модуль negotiation)
модуль actions позволяет добавить дополнительные обработчики

Директивы ядра позволяют назначать всем ресурсам, описанным в секции (DFLA) MIME тип (ForceType), входной фильтр (SetInputFilter), выходной фильтр (SetOutputFilter), обработчик (SetHandler). Директива DefaultType назначает MIME тип по умолчанию. Директива AddOutputFilterByType назначает выходной фильтр в соответствии с указанным MIME типом. Директива AddDefaultCharset определяет будет ли информация о наборе символов добавляться к заголовку ответа.

Директивы модуля mime:

SVDFLA AddCharset набор-символов суффикс ... (ассоциация суффикса файла с набором символов - добавление в список)
SVDFLA AddEncoding MIME-кодирование суффикс ... (ассоциация суффикса файла с методом кодирования - добавление в список)
SVDFLA AddHandler имя-обработчика суффикс ... (ассоциация суффикса файла с обработчиком - добавление в список)
SVDFLA AddInputFilter имя-фильтра[;имя-фильтра ...] суффикс ... (ассоциация суффикса файла с последовательностью фильтров - добавление в список)
SVDFLA AddLanguage код-языка суффикс ... (ассоциация суффикса файла с языком - добавление в список)
SVDFLA AddOutputFilter имя-фильтра[;имя-фильтра ...] суффикс ... (ассоциация суффикса файла с последовательностью фильтров - добавление в список)
SVDFLA AddType MIME-тип суффикс ... (ассоциация суффикса файла с MIME типом - добавление в список)
SVDFLA DefaultLanguage код-языка
D ModMimeUsePathInfo Off | On (будет ли модуль mime использовать path_info, т.е. "лишнюю" часть URL; см. также AcceptPathInfo)
SVDFLA MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers [Handlers|Filters] (управление поведением MultiViews модуля negotiation; по умолчанию - NegotiatedOnly, т.е. суффикс файла обязательно д.б. привязан к MIME типу, языку, набору символов или методу кодирования)
VDFLA RemoveCharset суффикс ... (ассоциация суффикса файла с набором символов - удаление из списка)
VDFLA RemoveEncoding суффикс ... (ассоциация суффикса файла с методом кодирования - удаление из списка)
VDFLA RemoveHandler суффикс ... (ассоциация суффикса файла с обработчиком - удаление из списка)
VDFLA RemoveInputFilter суффикс ... (ассоциация суффикса файла с последовательностью фильтров - удаление из списка)
VDFLA RemoveLanguage суффикс ... (ассоциация суффикса файла с языком - удаление из списка)
VDFLA RemoveOutputFilter суффикс ... (ассоциация суффикса файла с последовательностью фильтров - удаление из списка)
VDFLA RemoveType суффикс ... (ассоциация суффикса файла с MIME типом - удаление из списка)
S TypesConfig имя-файла (conf/mime.types; файл содержит ассоциации между суффиксами файлов и MIME типами по умолчанию)

Модуль mime_magic определяет MIME тип по содержимому файла, аналогично программе file(1). Директива MimeMagicFile (SV) определяет имя файла описаний. С дистрибутивом поставляется файл conf/magic, но его необходимо указать явно.

Модуль deflate реализует выходной фильтр DEFLATE - сжатие результатов перед посылкой клиенту и рассжатие запросов (алгоритм gzip, zlib). Работает после SSI и PHP. Включается директивами SetInputFilter, SetOutputFilter, AddOutputFilterByType. Для работы кеширующих прокси необходимо позаботиться о добавлении правильного заголовка Vary (добавление чрезмерно правильного заголовка: Header set Vary *). Директивы:

SV DeflateBufferSize 8096
SV DeflateCompressionLevel уровень-сжатия (от 1 до 9)
SV DeflateFilterNote [Input|Output|Ratio] имя-пометки (позволяет поместить информацию в журнал: %{имя-пометки}n)
SV DeflateMemLevel 9
SV DeflateWindowSize 15

Модуль ext_filter позволяет использовать внешнюю программу в качестве выходного фильтра (ответ сервера поступает на stdin, результат работы программы считывается с stdout). Описанные фильтры используются в директиве SetOutputFilter. Директивы:

S ExtFilterDefine имя-фильтра параметры (описание фильтра, где параметры:
cmd=команда-и-параметры-через-пробел (программе передаются обычные переменные окружения CGI и DOCUMENT_URI, DOCUMENT_PATH_INFO, QUERY_STRING_UNESCAPED)
mode=output
intype=MIME-тип (ограничивает использование фильтра документами указанного типа)
outtype=MIME-тип (после обработки тип документа меняется)
PreservesContentLength
ftype=число-тип-фильтра (AP_FTYPE_RESOURCE; позволяет изменить место фильтра в цепочке фильтров)
disableenv=имя-переменной-окружения (если переменная установлена, то фильтр не выполняется)
enableenv=имя-переменной-окружения (если переменная не установлена, то фильтр не выполняется)
D ExtFilterOptions DebugLevel=число | LogStderr | NoLogStderr

Модуль include реализует выходной фильтр SSI и описан в отдельном документе.

Обработчик server-info (модуль info; директива AddModuleInfo позволяет добавить комментарий к описанию модуля) выдаёт информацию о конфигурации сервера (выводится текущее состояние файла настройки, а не на момент запуска сервера) и обычно используется так (http://www.company.ru/server-info):

<Location /server-info>
SetHandler server-info
Order deny,allow
Deny from all
Allow from свой-компьютер
</Location>


Обработчик server-status (модуль status) выдаёт информацию о текущем состоянии сервера и статистику о его загруженности, а также список последних обработанных запросов. Конфигурируется аналогично обработчику server-info (запросы вида: http://www.company.ru/server-status?refresh=секунд или http://www.company.ru/server-status?auto). Директива ExtendedStatus (S) позволяет собирать расширенную статистику.

Обработчик send-as-is (модуль asis) позволяет обрабатывать файлы, которые содержат часть заголовков ответа в себе (сервер добавляет заголовки Date: и Server:). Кроме явного указания обрабатываемых файлов с помощью AddHandler и SetHandler, также обрабатывает файлы с MIME типом httpd/send-as-is. В начале файла должны быть заголовки ответа (обязательно Status: и Content-type:), которые отделяются от тела ответа пустой строкой.

Модуль negotiation позволяет серверу выбрать одно из возможных представлений ресурса для передачи клиенту на основе пожеланий каждого клиента (тип, язык, набор символов, метод кодирования) явно с помощью обработчика type-map (*.var, application/x-type-map) или неявно при включении Options MultiViews. Например, пожелания моего Firefox 1.0.3:

ACCEPT: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
ACCEPT_CHARSET: KOI8-R,utf-8;q=0.7,*;q=0.7
ACCEPT_ENCODING: gzip,deflate
ACCEPT_LANGUAGE: ru,en-us;q=0.7,en;q=0.3


Входной файл для обработчика type-map содержит описания документов, каждая секция (вариант) может содержать метод кодирования, язык, длину, MIME тип с параметрами (level, qs), тело варианта или локальный URI с телом варианта. Механизм MultiViews позволяет выбрать из имеющихся файлов, имена которых начинаются с локальной части URI, наиболее подходящий на основе типа, языка, набора символов и метода кодирования, определяемых модулем mime по суффиксам файлов. Директивы:

SV CacheNegotiatedDocs Off | On (разрешить кеширование выбранных документов)
SVDFLA ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] (Prefer; использовать приоритет языков, установленный директивой LanguagePriority, для определения варианта; Fallback позволяет использовать приоритет языков, если не нашлось ни одного подходящего документа)
SVDFLA LanguagePriority код-языка ... (определяет приоритет языков в ситуации, когда клиент не предоставил свой выбор; может быть задан с помощью переменной окружения prefer-language)

Обработчик cgi-script (модули cgi или cgid в зависимости от MPM) обрабатывает файлы с MIME-типом application/x-httpd-cgi или которым явно назначен обработчик cgi-script (рекомендуется использование ScriptAlias, XBitHack). В дополнение к переменным окружения, положенным по стандарту CGI, устанавливаются переменные DOCUMENT_ROOT, PATH_INFO ("лишняя" часть URL, см. AcceptPathInfo), REMOTE_HOST (требуется HostnameLookups), REMOTE_IDENT, REMOTE_USER (только после аутентификации). Директивы:

SV ScriptLog имя-файла (файл открывается от имени пользователя, указанного в User, (например, nobody), т.е. его необходимо создать заблаговременно и дать права на запись)
SV ScriptLogBuffer байт (1024; часть PUT или POST, которая попадёт в журнал)
SV ScriptLogLength байт (10385760; максимальный размер журнала)
SV ScriptSock имя-файла (logs/cgisock; только для модуля cgid; сокет для связи с демоном cgid)

Модуль suexec в сочетании с утилитой suexec позволяет запускать CGI программы под uid и gid, указанным в директиве SuexecUserGroup (SV).

Модуль actions позволяет привязать CGI скрипт к обработчику, MIME типу или методу запроса (GET, PUT и т.д.). Директивы:

SVDFLA Action тип-или-имя-обработчика имя-скрипта (запуск CGI скрипта (д.б. объявлен ScriptAlias или AddHandler) для ресурса указанного типа или которому назначен обработчик)
SVD Script метод имя-скрипта (запуск CGI скрипта (д.б. объявлен ScriptAlias или AddHandler), если запрос указанного метода; прописные и строчные буквы различаются; запрос GET будет обработан скриптом только если URI имеет аргумент запроса (...?что-нибудь))

Преобразование содержимого документов и заголовков


Модуль charset_lite является подмножеством (очень небольшим) модуля charset, сделанного для Russian Apache. К сожалению, переноса модуля charset из Apache в Apache 2 не предвидится. При перекодировке используется библиотека iconv(3) и имена кодовых таблиц должны соответствовать, принятым в ней, а не какому-то стандарту. Проверить допустимость перекодировки можно с помощью программы iconv:

iconv -f исходная-кодировка -t требуемая-кодировка


Директивы charset_lite:

SVDFLA CharsetSourceEnc исходная-кодировка
SVDFLA CharsetDefault требуемая-кодировка
SVDFLA CharsetOptions опция ...
DebugLevel=уровень
ImplicitAdd (модуль неявно вставляет свой фильтр при необходимости перекодировки)
NoImplicitAdd (требуется если последовательность фильтров задаётся явно с помощью AddOutputFilter)

Модуль expires управляет содержимым заголовков Expires и Cache-Control (max-age) в ответах сервера. Эти заголовки используются при кешировании клиентом и промежуточными прокси. Директивы:

SVDFLA ExpiresActive On | Off (посылать заголовок Expires и Cache-Control для документов, определённых ExpiresByType и ExpiresDefault)
SVDFLA ExpiresByType MIME-тип {Mсекунд | Aсекунд} (определяет Expires и max-age для документов указанного типа; M - время отсчитывается с момента последнего изменения файла (не действует для динамически создаваемых документов), A - время отсчитывается с момента обращения)
SVDFLA ExpiresDefault {Mсекунд | Aсекунд}

Модуль headers позволяет удалять и заменять заголовки запросов и ответов. Директивы:

SVDFLA Header [условие] действие имя-заголовка [значение] [env=[!]имя-переменной] (настройка заголовков ответа; работает после обработчиков и фильтров; условие может быть onsuccess (коды ответа 2xx) или always; значение может содержать спецификаторы формата: %t - замещается на t=UNIX-время-в-микросекундах, %D - замещается на D=микросекунд-обработки-запроса, %{имя-переменной}e; env= задаёт условие выполнения директивы (директива выполняется, если указанная переменная установлена (не установлена); действия:
set - установить значение заголовка, замещая старое значение
append - добавить значение к заголовку через запятую
add - добавить заголовок, даже если заголовок с таким именем уже есть
unset - удалить все заголовки с указанным именем
echo - заголовок с указанным именем (м.б. регулярное выражение) из запроса копируется в ответ
SVDFLA RequestHeader действие имя-заголовка [значение] (настройка заголовков запросов; работает до обработчиков и фильтров; действия:
set - установить значение заголовка, замещая старое значение
append - добавить значение к заголовку через запятую
add - добавить заголовок, даже если заголовок с таким именем уже есть
unset - удалить все заголовки с указанным именем

Отслеживание запросов и клиентов


Модуль unique_id обеспечивает переменную UNIQUE_ID с уникальным идентификатором для каждого запроса в кластере серверов (требуется синхронизация по NTP и уникальные IP адреса).

Модуль usertrack позволяет отслеживать клиентов с помощью куки. Значение куки записывается в журнал с помощью спецификатора формата "%{cookie}n". Директивы:

SVDFLA CookieDomain имя-домена-куки (должен начинаться с точки и иметь минимум одну точку внутри; можно не задавать)
SVDFLA CookieExpires время-хранения (можно записывать в секундах или так: "2 weeks 3 days 7 hours"; если не задано, то действует на время сессии клиента)
SVDFLA CookieName имя (по умолчанию - Apache)
SVDFLA CookieStyle Netscape|Cookie|Cookie2|RFC2109|RFC2965 (устаревший формат Netscape успользуется по умолчанию; Cookie = RFC2109; Cookie2 = RFC2965)
SVDFLA CookieTracking Off | On (Off; включить отслеживание куки)

Автоматическое создание индекса каталога


Модуль autoindex позволяет автоматически создавать индекс каталога из списка находящихся в каталоге файлов, если отсутствует индекс, сделанный вручную (задаётся модулем dir). Действие модуля включается флагом Indexes директивы Option. Директивы модуля:

SVDA AddAlt строка file file... (какую строку текста показывать вместо иконки, если у клиента отключена загрузка картинок; file задается суффиксом, частичным именем файла или шаблоном)
SVDA AddAltByEncoding строка MIME-encoding... (аналогично, но определяется не по имени файла, а по MIME-кодировке (типа x-compress)
SVDA AddAltByType строка MIME-type ... (аналогично, но определяется по MIME-типу (например, text/html)
SVDA AddDescription строка file file... (текстовое описание файла; file задается суффиксом, частичным именем файла, шаблоном или полным именем)
SVDA AddIcon icon name name ... (определяет какую картинку показать для файла, соответствующего name; icon имеет формат либо URL, либо в круглых скобках альтернативный текст и URL через запятую; name задается суффиксом, частичным именем файла, шаблоном, полным именем или ключевыми словами ^^DIRECTORY^^ и ^^BLANKICON^^)
SVDA AddIconByEncoding icon MIME-encoding ... (аналогично, но определяется не по имени файла, а по MIME-кодировке (например, x-compress))
SVDA AddIconByType icon MIME-type MIME-type ... (аналогично, но определяется по MIME-типу (например, text/html))
SVDA DefaultIcon url (если никакая иконка не подошла, то будет использоватся эта)
SVDA FancyIndexing on|off (делать красивый индекс - возможность сортировки по столбцам)
SVDA HeaderName имя-файла (в качестве заголовка индекса будет вставлен указанный файл (точнее URI; text/*); сначала ищется файл имя-файла.html, затем просто имя-файла)
SVDA IndexIgnore file file ... (список файлов, которые надо скрывать; file задается суффиксом, частичным именем файла, шаблоном или полным именем)
SVDA IndexOptions [+|-]option [+|-]option ... (опции сливаются с учетом знаков)
DescriptionWidth=[n | *] - ширина колонки (* - использовать длину самого длинного описания)
FancyIndexing - делать красивый индекс (возможность сортировки по столбцам)
FoldersFirst
HTMLTable
IconHeight[=pixels]
IconsAreLinks - для fancy indexing
IconWidth[=pixels]
IgnoreCase
IgnoreClient - не обрабатывать запросы клиента по сортировке
NameWidth=[n | *] - ширина колонки (* - использовать длину самого длинного имени файла)
ScanHTMLTitles - вытаскивать описание файла из HTML-текста (только fancy indexing)
SuppressColumnSorting - имена колонок не будут вызывать сортировку индекса при fancy ind


заключение

Методические материалы были подготовлены для того, чтобы дать возможность студентам в достаточно короткий срок ознакомиться с как можно большим количеством возможностей Web-сервера Apache. Web-сервер Apache - это полностью конфигурируемая программа, которую можно гибко настроить для нужд своего сервера. В лекционном материале изложены основные концепции работы, способы установки и настройки. В лабораторном практикуме описаны практические занятия, посвященные работе в Web-сервером Apache. Связка Apache + PHP(Perl) + Mysql на текущий момент очень популярна и востребована, поэтому глубокие познания в этой области, а также владение практическими приемами открывает шировкие перспективы дальнейшего развития и практического применения.


литература
  1. М.Дж. Кабир "Сервер Apache 2. Библия пользователя". - М.: Изд.дом "Вильямс", 2002 - 672с.
  2. Боуэн Рич и др. "Apache. Настольная книга администратора". - СПб.: ООО "ДиаСофтЮП", 2002 - 384с.
  3. М. Арнольд "Администрирование Apache", - М.: Изд. "Лори", 2002 - 418с.
  4. Уэйнрайт "Apache для профессионалов", - М.: изд. "Лори", 2001 - 474с.
  5. Фролов А.В. и Г.В. "Практика применения Perl, PHP, Apache и MySQL для активных Web-сайтов", М.: изд.торг.дом "Русская редакция", 2002, - 576с.
  6. Ст.Спейнаур, Р.Экштейн "Справочник веб-мастера", СПб.: "Символ-Плюс", 2001 - 608с.
  7. Л. Томпсон, Л. Веллинг "Разработка Web-приложений на PHP и MySQL", К.: Изд. "ДиаСофт", 2001 - 672с.
  8. Поль Дюбуа "MySQL", М.: Изд.дом "Вильямс", 2001 - 816с.

  e-mail: