Статьи

Базовая конфигурация Apache 2 в Unix-подобных системах

В предыдущем посте мы рассмотрели HTTP-сервер Apache, что это такое и как он работает. Сегодня мы рассмотрим некоторые из наиболее важных директив конфигурации Apache, посмотрим, для чего они нужны, и узнаем, как их редактировать, чтобы сформировать работу нашего сервера по своему вкусу.

Сервер Apache — это служба, работающая в фоновом режиме, ожидающая запросов от клиентов, подключающихся к портам, которые он слушает, для принятия мер. Apache либо отвечает на эти запросы, либо оставляет соответствующие заметки в своих файлах журнала. Его поведение контролируется посредством его конфигурации, используя так называемые директивы (среди прочего). Мы обсудим самые основные директивы в этой статье.


Директива ServerName используется для установки имени хоста сервера; это то, как сервер идентифицирует себя. Он использует это имя при ответе на HTTP-запросы. Вы можете установить эту директиву либо в конфигурации сервера, либо на виртуальных хостах. Расположение ваших файлов конфигурации зависит как от версии Apache, так и от дистрибутива Linux.

1
2
3
4
5
6
7
8
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www
    ServerName www.example-site.com
    .
    .
    .
</VirtualHost>

Apache имеет множество директив, которые вы можете устанавливать и манипулировать ими для настройки поведения вашего сервера.

Если директива ServerName не указана, сервер пытается получить ее, выполнив обратный поиск DNS по своему IP-адресу. Вы всегда должны явно указывать ServerName для сервера; это единственное значение, которое вам нужно установить, чтобы ваш сервер работал после установки.

Вам придется использовать IP-адрес вашего компьютера, если у вас еще нет зарегистрированного доменного имени. В противном случае вам потребуется добавить доменное имя и IP-адрес в файл hosts на сервере — так же, как вы делаете это с файлом hosts на вашем ПК. Делая это, сервер проверяет свой файл hosts, прежде чем обращаться к DNS-серверу. Я лично добавляю свою запись IP-адреса / имени домена в файл хостов Apache, чтобы минимизировать время отклика сервера, сохраняя вызов на DNS-сервере.

Предполагая, что наше доменное имя — www.example-site.com а IP-адрес нашего сервера — 50.57.77.153 , вам необходимо добавить следующую строку в файл hosts на сервере (/ etc / hosts):

1
50.57.77.153 www.example-site.com example-site.com

После редактирования файла hosts вам необходимо перезапустить (или остановить и запустить) Apache. Я покажу вам, как это сделать позже.


Директива Listen сообщает Apache, какие IP-адреса и / или порты следует прослушивать для входящих запросов. Если ничего не указано, Apache прослушивает все адреса и порты на машине. Конфигурация по умолчанию устанавливает сервер для прослушивания порта 80, порта по умолчанию для связи HTTP.

Если вы укажете только IP-адрес, сервер будет отвечать на запросы, поступающие на все порты этого адреса (также называемые интерфейсом). Если указан только номер порта, то Apache отвечает на запросы указанного порта, поступающие на все интерфейсы на машине. Если указана комбинация адреса и порта, то Apache отвечает только на эти конкретные комбинации интерфейса / порта.

Если на вашем сервере установлены отдельные файлы конфигурации, вы сможете найти или установить эту директиву в файле ports.conf .

Вы можете найти этот файл в том же месте, что и ваши файлы конфигурации Apache (у меня это /etc/apache2/ports.conf , но он может отличаться для других версий Apache и / или дистрибутивов Linux).

Давайте предположим, что наш пример сайта находится по IP-адресу 50.57.77.153 . Чтобы настроить Apache для прослушивания портов 80 и 443, соответствующих портов по умолчанию для HTTP и HTTPS, вам необходимо ввести следующие директивы в файл ports.conf :

1
2
Listen 50.57.77.153:80
Listen 50.57.77.153:443

В качестве альтернативы, если вы хотите, чтобы Apache прослушивал порты 80 и 443 на всех интерфейсах независимо от IP-адреса, вы можете ввести следующее:

1
2
Listen 80
Listen 443

В операционных системах Unix рекомендуется настроить Apache для работы под определенным пользователем и группой вместо пользователя root. Это делает сервер более безопасным и менее уязвимым для атак. В идеале, пользователь и группа, которые вы устанавливаете, не должны иметь возможность войти на сервер (то есть: не иметь учетных данных для входа) и не иметь оболочки для входа; они просто будут использоваться для обработки запросов веб-клиента. Установите домашний каталог пользователя Apache в каталог документов веб-сервера, обычно расположенный по адресу /var/www или /usr/local/apache2/htdocs .

1
2
groupadd anyUserName
useradd -d /var/www -g anyUserName -s /bin/false

В приведенном выше примере в качестве нашего веб-пользователя и группы используется anyUserName ; просто используйте имя, не зарезервированное для других процессов. -d / var / www устанавливает домашний каталог новой учетной записи /var/www , а -s / bin / false гарантирует, что новая учетная запись не имеет доступа к оболочке. Затем вам нужно изменить ваш конфигурационный файл, чтобы использовать нового пользователя и группу Apache. Если ваш говорит:

1
2
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

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

1
2
User anyUserName
Group anyUserName

Поведение Apache контролируется через его конфигурацию.

Важные файлы Apache, такие как файлы конфигурации, ошибок и журналов сервера, хранятся в верхней части дерева каталогов. Это расположение ServerRoot , и вы можете установить другое значение в главном конфигурационном файле Apache. В зависимости от вашей установки по умолчанию может быть что-то вроде /usr/local/apache2 или /etc/apache2 . Любые директивы Apache, использующие относительный путь, по умолчанию добавляются к корневому пути, указанному в ServerRoot .

При первой установке сервера файлы конфигурации и журналы помещаются в ServerRoot . Вы можете изменить его значение на новый каталог, но обязательно скопируйте файлы конфигурации в новое место. Кроме того, убедитесь, что вы не добавляете косую черту в путь при изменении значения.


При возникновении ошибки Apache регистрирует ошибку в файле журнала. Расположение журнала ошибок определяется значением, указанным с помощью директивы ErrorLog . Этот файл является критическим, потому что вы будете обращаться к нему для отладки ошибок, решения проблем конфигурации сервера и оптимизации сервера.

Если на сервере размещено несколько сайтов, и вы хотите иметь отдельные журналы ошибок для каждого сайта, вы можете указать отдельный файл и местоположение для каждого сайта в файле виртуальных хостов.

Если вы этого не сделаете, то ошибки всех сайтов регистрируются в журнале ошибок по умолчанию, обычно расположенном в /usr/local/apache2/logs/error_log или /var/log/apache2/error.log (еще раз, в зависимости от вашего установка).

Обратите внимание, что приведенные выше пути журнала являются абсолютными. Например, рассмотрим следующую директиву:

1
ErrorLog logs/error_log

Это относительный путь. Поэтому фактическое местоположение журнала ошибок — $ServerRoot/logs/error_log .

Директива LogLevel контролирует уровень сообщений, зарегистрированных в журналах ошибок. По умолчанию установлено предупреждение , что означает, что все сообщения со значением предупреждения и выше (как в более критических) будут регистрироваться. Вы можете изменить значение этой директивы, чтобы настроить уровень ведения журнала в соответствии с вашими предпочтениями.


Директива DocumentRoot устанавливает расположение общедоступных файлов сервера, также называемых htdocs . Это каталог документов веб-сервера Apache по умолчанию, и его содержимое легко и общедоступно для клиентов, подключающихся через Интернет. Он содержит статический и динамический контент, который будет обслуживаться, как только сервер получит для них HTTP-запрос. Поскольку файлы и подкаталоги в htdoc доступны для общественности, очень важно правильно обрабатывать разрешения, чтобы минимизировать возможность поставить под угрозу безопасность и защиту сервера.

В зависимости от вашей установки, расположение по умолчанию DocumentRoot может быть что-то вроде /var/www или /usr/local/apache2/htdocs .

Если вы размещаете несколько веб-сайтов на одном сервере, вам нужно установить разные DocumentRoot для каждого сайта. Это можно сделать в соответствующей директиве VirtualHost , соответствующей каждому сайту. Допустим, у вас есть три веб-сайта на одном сервере (например: www.example-site1.com , www.example-site2.com , www.example-site3.com ), ваш файл виртуальных хостов может выглядеть примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<VirtualHost www.example-site1.com>
    DocumentRoot /usr/local/apache2/htdocs/example_site1
    ServerName www.example-site1.com
    .
    .
    .
</VirtualHost>
 
<VirtualHost www.example-site2.com>
    DocumentRoot /usr/local/apache2/htdocs/example_site2
    ServerName www.example-site2.com
    .
    .
    .
</VirtualHost>
 
<VirtualHost www.example-site3.com>
    DocumentRoot /usr/local/apache2/htdocs/example_site3
    ServerName www.example-site3.com
    .
    .
    .
</VirtualHost>

Чтобы установить отдельный журнал ошибок для каждого из этих доменов, что является хорошей идеей, файл виртуальных хостов может выглядеть примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<VirtualHost www.example-site1.com>
    DocumentRoot /usr/local/apache2/htdocs/example_site1
    ServerName www.example-site1.com
    ErrorLog /usr/local/apache2/logs/site1_error_log
    .
    .
    .
</VirtualHost>
 
<VirtualHost www.example-site2.com>
    DocumentRoot /usr/local/apache2/htdocs/example_site2
    ServerName www.example-site2.com
    ErrorLog /usr/local/apache2/logs/site2_error_log
    .
    .
    .
</VirtualHost>
 
<VirtualHost www.example-site3.com>
    DocumentRoot /usr/local/apache2/htdocs/example_site3
    ServerName www.example-site3.com
    ErrorLog /usr/local/apache2/logs/site3_error_log
    .
    .
    .
</VirtualHost>

Директива ServerName используется для установки имени хоста сервера; это то, как сервер идентифицирует себя.

Служба Apache сначала запускается от имени пользователя root для привязки к привилегированному порту 80 для HTTP (или 443 при использовании SSL), поскольку номера портов менее 1024 зарезервированы только для пользователя root. После первоначального выполнения дочерние процессы порождают для обработки клиентских запросов, принадлежащих пользователю Apache, указанному в файле конфигурации. По этой причине вы найдете один корневой процесс и несколько процессов, принадлежащих веб-пользователю; этот корневой процесс запускается первым при запуске Apache. У него есть идентификатор процесса, и этот идентификатор хранится в файле Pid на сервере. Вы можете контролировать местоположение файла Pid с помощью директивы PidFile в файле конфигурации.

Если вы откроете файл, указанный в директиве PidFile , вы найдете число, соответствующее идентификатору родительского процесса. Вы можете остановить сервер Apache, убив процесс, используя его идентификационный номер. Тем не менее, убить процесс только в крайнем случае. Мы обсудим предпочтительный способ остановить Apache через минуту.


Можно разделить конфигурацию и настройки сервера на несколько файлов; фактически некоторые установки Apache действительно так и делают. Эти несколько файлов могут быть включены в исходный файл конфигурации сервера. Этот подход идеален для того, чтобы ваш конфигурационный файл был легким и понятным, но он также заставляет вас заглянуть внутрь нескольких файлов, находящихся в разных местах, чтобы полностью понять, как настроен Apache. В любом случае ниже приведен синтаксис для включения внешних конфигурационных файлов. Независимо от того, хотите ли вы использовать включение файла, зависит от вас:

1
2
3
4
5
6
7
8
9
# Include ports listing:
Include /etc/apache2/ports.conf
 
# Include generic snippets of statements
Include /etc/apache2/conf.d/
 
# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

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


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

Чтобы остановить сервер Apache, введите в консоли следующую команду:

1
/etc/init.d/apache2 stop

Чтобы запустить сервер Apache, введите следующую команду:

1
/etc/init.d/apache2 start

Чтобы перезапустить сервер Apache, введите следующую команду:

1
/etc/init.d/apache2 restart

Естественно, вы должны войти в систему с привилегированным пользователем для выполнения этих команд. Тем не менее, вы все равно можете запустить приведенные выше команды, добавив sudo перед каждой строкой. Это в основном говорит системе, что вы выполняете команду как суперпользователь (отсюда и название, sudo), и в этом случае система просит вас ввести пароль, прежде чем она выполнит вашу команду. Если вы не знаете этот пароль, обратитесь к администратору сервера. Предшествующие выше команды с sudo:

1
2
3
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/apache2 start
sudo /etc/init.d/apache2 restart

Apache имеет множество директив, которые вы можете устанавливать и манипулировать ими для настройки поведения вашего сервера. Это отвечает за гибкость и мощь Apache.

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