Статьи

Расширенная настройка Apache 2 в Unix-подобных системах

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

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

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

Конфигурационные файлы для .htaccess каталога по умолчанию называются файлами .htaccess и находятся в общедоступном каталоге документов веб-сервера. Это позволяет применять определенные директивы к определенным каталогам и их подкаталогам, а не ко всему серверу и всем размещенным на нем веб-сайтам. Хотя это не рекомендуется, вы можете изменить имя файла .htaccess на другое, используя директиву AccessFileName , которую можно установить в httpd.conf :

1
2
3
4
5
#
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.
#
AccessFileName .htaccess

Обратите внимание, что htaccess не является расширением; это имя файла. В UNIX-подобных операционных системах точка ( . ) Перед именем файла означает, что файл скрыт.

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

  • # , указывающий на комментарий
  • действительная директива
  • пространство
  • пустая строка

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


Самый важный файл .conf — httpd.conf.

При внесении собственных изменений в файлы конфигурации по умолчанию лучше всего разбить эти изменения на внешние файлы (со значимыми именами, конечно) и включить их в основной файл конфигурации, используя директиву include . Если отделить ваши настройки от настроек сервера по умолчанию невозможно, по крайней мере, сделайте привычку комментировать старые настройки, прежде чем вводить новые. Это упростит откат до любой версии файла, если возникнет такая необходимость, а также позволит вам перейти на более новую версию файла httpd.conf с минимальными трудностями. Все, что вам нужно сделать, это скопировать новую версию вместо старой и заново вставить ваши включения в конец нового файла (или, по крайней мере, повторно применить ваши старые изменения после комментирования изменений по умолчанию в новом файле) , Например:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
.
.
.
# End of default apache configuration
 
#Beginning of your new configuration and settings
 
# 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. В этом уроке мы рассмотрим несколько расширенных директив, начиная с <Directory> .

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

Теги <Directory> принимают путь и содержат блок параметров, которые будут применены к этому каталогу и его подкаталогам. Вот пример:

1
2
3
4
5
6
<Directory />
    Options None
    AllowOverride None
    Order Deny,Allow
    Deny from all
</Directory>

Открывающий <Directory> в этом примере указывает путь к / , что означает корневой каталог и все его подкаталоги и файлы. Параметры, определенные внутри тегов <Directory> применяются к / path (по сути, ко всему в корне).

Обратите внимание, что htaccess не является расширением; это имя файла.

Директива Options объявляет, какие функции сервера действительны для указанного каталога. В этом примере никакие параметры недопустимы для пути / . Но вы можете указать любое количество параметров, например, разрешить символические ссылки, разрешить выполнение сценариев CGI, разрешить включения на стороне сервера и многое другое.

Директива AllowOverride сообщает серверу, какие параметры объявлены в тегах <Directory> для переопределения, если они сбрасываются в файле .htaccess . Когда сервер находит файл .htaccess , ему необходимо знать, какие директивы, объявленные в этом файле, могут переопределять более ранние директивы конфигурации. Если для параметра AllowOverride установлено значение None , как показано в примере выше, то никакие директивы не будут переопределены, а любые повторные объявления в файлах .htaccess полностью игнорируются.

Если для директивы AllowOverride установлено значение All , то любая директива, повторно объявленная в файле .htaccess будет переопределять более ранние директивы конфигурации. AllowOverride может принимать определенные типы директив, которые могут быть переопределены, в то время как остальные будут игнорироваться.

Deny и Allow контролируют доступ к каталогу, указанному в открывающем теге, и имеют приоритет через директиву Order .

В вышеприведенном примере Order Deny, Allow означает, что всем подключающимся хостам или IP-адресам запрещен доступ к корневому каталогу, кроме тех, которые объявлены хорошими хостами. Order Allow, Deny с другой стороны Order Allow, Deny будет означать, что всем хостам и IP-адресам будет разрешен доступ к корневому каталогу, кроме тех, которые объявлены как плохие или занесены в черный список.

Параметр Deny from all объявляет, что доступ должен быть запрещен со всех хостов. Поскольку за ним не следует белый список, ни один из хостов или IP-адресов не имеет доступа к корневому каталогу (и так должно быть по соображениям безопасности). ТОЛЬКО в демонстрационных целях, приведенный ниже пример демонстрирует, как запретить доступ всем хостам, кроме www.goodhost1.com и www.goodhost2.com :

1
2
3
4
5
<Directory />
    Order Deny,Allow
    Deny from all
    Allow from www.goodhost1.com www.goodhost2.com
</Directory&gt;

Обратите внимание, что директива Order определяет приоритет правил. Итак, сначала мы запрещаем доступ со всех хостов, а затем разрешаем доступ только к www.goodhost1.com и www.goodhost2.com . Кроме того, вы можете указать два хоста в отдельной строке, например:

1
2
3
4
5
6
<Directory />
    Order Deny,Allow
    Deny from all
    Allow from www.goodhost1.com
    Allow from www.goodhost2.com
</Directory>

Если вы хотите разрешить доступ ко всем поддоменам хоста goodhost.com (например, sub1.goodhost.com , sub2.goodhost.com и sub3.goodhost.com ), вы можете указать частичное имя домена для предоставления доступа чтобы вместо перечисления всех поддоменов, которые будут разрешены. В следующем примере показано, как:

1
2
3
4
5
<Directory />
    Order Deny,Allow
    Deny from all
    Allow from goodhost.com
</Directory>

Кроме того, если вы хотите запретить доступ всем, кроме определенного IP-адреса в локальной сети, следующий пример иллюстрирует, как вы можете это сделать:

1
2
3
4
5
<Directory />
    Order Deny,Allow
    Deny from all
    Allow from 192.168.2.103
</Directory>

Если вы хотите разрешить доступ ко всем хостам, за исключением нескольких плохих, вы можете сделать что-то вроде этого:

1
2
3
4
5
<Directory /usr/local/apache2/htdocs/>
    Order Allow,Deny
    Allow from all
    Deny from www.badbot1.com badbot2.com spamhost.com
</Directory>

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

Аналогично <Directory> есть <DirectoryMatch> . Он включает в себя группу директив, которые применяются только к названному каталогу и его подкаталогам. Вместо указания пути в качестве аргумента используется регулярное выражение.

Когда вы посещаете веб-сайт, вы часто просто вводите доменное имя без указания страницы (например, www.example.com а не www.example.com/index.html ). Причина в том, что сервер обычно всегда дает вам страницу по умолчанию.

Эта функциональность регулируется директивой DirectoryIndex на веб-сервере; он сообщает серверу страницу по умолчанию для ответа, если в URL не указан файл.

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

1
2
3
<Directory /usr/local/apache2/htdocs/>
    DirectoryIndex index.php index.html
</Directory>

Если клиент запрашивает каталог, который не содержит ни одного из файлов по умолчанию, перечисленных в директиве DirectoryIndex , сервер отвечает списком каталогов , списком всех файлов и подкаталогов, содержащихся в этой папке. Это может потенциально представлять угрозу безопасности, поскольку файлы и структура файловой системы запрошенного каталога открыты. Вы можете избежать этого, используя опцию Indexes чтобы предотвратить перечисление каталогов на уровне DocumentRoot (который является корневым каталогом htdocs или публичных файлов сервера). Если вы хотите отобразить списки папок для любого подкаталога в DocumentRoot , вы можете включить опцию Indexes для этой конкретной папки. Следующий листинг демонстрирует это:

1
2
3
4
5
6
7
<Directory /usr/local/apache2/htdocs/>
    Options -Indexes
</Directory>
 
<Directory /usr/local/apache2/htdocs/sub-dir1/>
    Options Indexes
</Directory></p>

В приведенном выше примере отключаются списки каталогов в основной общедоступной папке HTML (в данном случае /usr/local/apache2/htdocs/ ) и во всех подкаталогах, а затем снова включается только для /usr/local/apache2/htdocs/sub-dir1/ sub-directory.

В то время как директива <Directory> определяет разрешения или ограничения, которые должны применяться к конкретному каталогу, директива <Files> управляет ограничениями и разрешениями для одного или нескольких файлов (подстановочные знаки должны использоваться в имени файла для указания нескольких файлов). Взгляните на этот список:

1
2
3
4
<Files «.htaccess»>
    Order allow,deny
    Deny from all
</Files>

В этом примере используется директива <Files> для предотвращения просмотра файлов .htaccess веб-клиентами. Изображение ниже — это снимок экрана того, что сервер отвечает, если вы пытаетесь получить файл .htaccess , запрашивая что-то вроде http://www.example.com/.htaccess .

Аналогично, директива <FilesMatch> ограничивает область действия вложенных директив именем файла, так же как и директива <Files> . Тем не менее, он принимает регулярное выражение в качестве аргумента.

Директива <Location> работает аналогично директиве <Directory> за исключением того, что в качестве аргумента используется URL-адрес, а не путь к локальному физическому каталогу в файловой системе. Это означает, что <Location> может использоваться для управления контентом вне сервера.

Настоятельно рекомендуется не использовать директиву <Location> локальных расположений файловой системы, поскольку многие URL-адреса могут отображаться в один и тот же файл.

Директива <LocationMatch> также ограничивает область действия вложенных директив по URL. Как и другие директивы Match, он принимает регулярное выражение в качестве аргумента.

Директива <Limit> определяет, какие методы HTTP (например, GET , POST и т. Д.) Разрешены. Как видно из приведенного ниже примера, директива <Limit> запрещает использование методов POST , PUT и DELETE для всех клиентских запросов, кроме тех, которые исходят из 50.57.77.153 .

1
2
3
4
5
<Limit POST PUT DELETE>
    Order Deny,Allow
    Deny from all
    Allow from 50.57.77.153
</Limit>

Директива <LimitExcept> обеспечивает противоположную функциональность. Он по-прежнему контролирует, какие методы HTTP разрешены, но делает это исключительным образом. В приведенном ниже примере <LimitExcept> запрещает доступ ко всем клиентским запросам, используя любые методы HTTP, кроме GET и POST .

1
2
3
<LimitExcept GET POST>
    deny from all
</LimitExcept>

Настоятельно рекомендуется не использовать директиву <Location> локальных файловых системах.

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

  • Конфигурация на уровне сервера
  • Директивы контейнера
  • Конфигурация для каждого каталога

Конфигурация на уровне сервера включает в себя директивы по умолчанию, установленные для сервера в целом. Эти директивы затем могут быть переопределены с помощью файлов конфигурации для каждого каталога (файлы .htaccess ) или внутри директив контейнера (таких как теги <Directory> и <Files> ).

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


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