Привязка к адресам и портам
Настройка Apache HTTP Server для прослушивания определённых адресов и портов.
Обзор
| Связанные модули | Связанные директивы |
|---|---|
При запуске httpd привязывается к некоторому порту и адресу на локальном компьютере и ожидает входящие запросы. По умолчанию он прослушивает все адреса компьютера. Однако может потребоваться указать ему прослушивать определённые порты, только выбранные адреса или сочетания того и другого. Часто это используется вместе с функцией виртуальных хостов, которая определяет, как httpd отвечает на запросы, поступающие на разные IP-адреса, имена хостов и порты.
Директива Listen указывает серверу принимать входящие запросы только на указанных портах или сочетаниях адресов и портов. Если в директиве Listen указан только номер порта, сервер прослушивает этот порт на всех интерфейсах. Если вместе с портом указан IP-адрес, сервер прослушивает указанный порт и интерфейс. Для указания нескольких адресов и портов, которые нужно прослушивать, можно использовать несколько директив Listen. Сервер будет отвечать на запросы, поступившие на любой из указанных адресов и портов.
Например, чтобы сервер принимал соединения на портах 80 и 8000 на всех интерфейсах, используйте:
Listen 80 Listen 8000
Чтобы сервер принимал соединения на порту 80 на одном интерфейсе, а на порту 8000 — на другом, используйте:
Listen 192.0.2.1:80 Listen 192.0.2.5:8000
IPv6-адреса необходимо заключать в квадратные скобки, как в следующем примере:
Listen [2001:db8::a00:20ff:fea7:ccea]:80
Перекрывающиеся директивы Listen приведут к критической ошибке, которая помешает запуску сервера.
(48)Address already in use: make_sock: could not bind to address [::]:80
Дополнительные советы по устранению неполадок см. в обсуждении на вики.
Изменение конфигурации Listen при перезапуске
При перезапуске httpd следует учитывать особенности изменения директив Listen. Во время перезапуска httpd сохраняет привязку портов (согласно исходной конфигурации), чтобы избежать ошибок «Соединение отклонено» при новых попытках подключения к серверу. Если внесённые изменения в набор используемых директив Listen конфликтуют со старой конфигурацией, конфигурация завершится с ошибкой, а сервер будет остановлен.
Например, изменение конфигурации:
Listen 127.0.0.1:80
на следующую может завершиться ошибкой, поскольку привязка порта 80 ко всем адресам конфликтует с привязкой порта 80 только к адресу 127.0.0.1.
Listen 80
Чтобы такие изменения конфигурации вступили в силу, необходимо остановить сервер, а затем запустить его снова.
Особенности IPv6
Всё больше платформ поддерживают IPv6, а APR поддерживает IPv6 на большинстве из них. Благодаря этому httpd может создавать сокеты IPv6 и обрабатывать запросы, отправленные по IPv6.
Для администраторов httpd дополнительную сложность представляет вопрос о том, может ли сокет IPv6 обрабатывать как IPv4-, так и IPv6-соединения. Для обработки IPv4-соединений с помощью сокета IPv6 используются IPv4-отображённые IPv6-адреса. На большинстве платформ они разрешены по умолчанию, но во FreeBSD, NetBSD и OpenBSD по умолчанию запрещены, чтобы соответствовать общесистемной политике этих платформ. В системах, где они запрещены по умолчанию, специальный параметр configure может изменить это поведение для httpd.
С другой стороны, на некоторых платформах, таких как Linux и Tru64, единственный способ обрабатывать IPv6 и IPv4 — использовать отображённые адреса. Если вы хотите, чтобы httpd обрабатывал IPv4- и IPv6-соединения с минимальным количеством сокетов, для чего требуется использовать IPv4-отображённые IPv6-адреса, укажите параметр --enable-v4-mapped configure.
На всех платформах, кроме FreeBSD, NetBSD и OpenBSD, по умолчанию используется --enable-v4-mapped, поэтому, вероятно, именно с этим параметром был собран ваш httpd.
Если вы хотите, чтобы httpd обрабатывал только IPv4-соединения, независимо от возможностей вашей платформы и APR, укажите IPv4-адрес во всех директивах Listen, как в следующих примерах:
Listen 0.0.0.0:80 Listen 192.0.2.1:80
Если ваша платформа поддерживает это и вы хотите, чтобы httpd обрабатывал IPv4- и IPv6-соединения через отдельные сокеты (то есть отключить IPv4-отображённые адреса), укажите параметр --disable-v4-mapped configure. Во FreeBSD, NetBSD и OpenBSD по умолчанию используется --disable-v4-mapped.
Указание протокола с помощью Listen
Необязательный второй аргумент protocol директивы Listen не требуется для большинства конфигураций. Если он не указан, для порта 443 по умолчанию используется https, а для всех остальных портов — http. Протокол используется для определения модуля, который должен обрабатывать запрос, а также для применения оптимизаций, специфичных для протокола, с помощью директивы AcceptFilter.
Указывать протокол нужно только при использовании нестандартных портов. Например, для запуска сайта https на порту 8443:
Listen 192.170.2.1:8443 https
Взаимодействие с виртуальными хостами
Директива Listen не реализует виртуальные хосты — она лишь указывает основному серверу, какие адреса и порты нужно прослушивать. Если директивы <VirtualHost> не используются, сервер будет одинаково обрабатывать все принятые запросы. Однако с помощью <VirtualHost> можно задать другое поведение для одного или нескольких адресов либо портов. Чтобы настроить виртуальный хост, сначала нужно указать серверу прослушивать используемые адрес и порт. Затем следует создать секцию <VirtualHost> для заданных адреса и порта и определить поведение этого виртуального хоста. Обратите внимание: если <VirtualHost> задан для адреса и порта, которые сервер не прослушивает, получить к нему доступ будет невозможно.
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/bind.html