Мы пытаемся настроить группу Apache 2.4.18 для передачи полученных запросов через прокси на вышестоящий сервер нашего партнера. Наш партнер использует Amazon Elastic Load Balancing, поэтому единственное, что мы знаем об их серверах, - это их DNS-имена.
TTL записей DNS составляет 60 секунд, и я хотел бы знать, может ли Apache соблюдать этот ttl, поддерживая соединение, пока запись DNS действительна, а затем запрашивая перевод, когда TTL истек.
Использование mod_proxy DisableReuse = on заставляет открывать новое соединение каждый раз, когда в восходящем направлении требуется ресурс. Это сработает, если нижележащая операционная система выполняет кэширование TTL DNS. В противном случае каждый раз, когда требуется новый ресурс, Apache будет принудительно выполнять новый DNS-запрос, увеличивая время ответа.
Я думал поиграть с параметрами mod_proxy ttl и timeout, но мне кажется, что я неправильно решаю проблему. Согласно документации, параметр таймаута mod_proxy контролирует время, в течение которого сокет будет ожидать данных из восходящего потока, но я не уверен, закроет ли экземпляр Apache соединение и откроет новое. Кроме того, игра с тайм-аутом подвержена ошибкам, потому что меньшее значение может отправить неправильный ответ клиенту.
Я потратил некоторое время, без всякой радости, пытаясь разобраться с этой установкой. Есть ли какие-то специальные настройки для этого сценария? А может я что-то пропустил? Любая помощь будет оценена.
Лучший,
Густау
Единственный вариант, который может быть полезен для вашего варианта использования, - это disablereuse=On
.
Запросы DNS выполняются резолверной частью glibc. Результаты не кэшируются ни этой библиотекой, ни ОС. В случае apache результаты DNS кэшируются рабочим процессом apache. У вас может быть служба DNS, например nscd
или dnsmasq
, который выполняет кеширование DNS.
Вот выдержки из документации apache.
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#workers
Разрешение DNS для исходных доменов
Разрешение DNS происходит при первом создании сокета для исходного домена. Когда включено повторное использование соединений, каждый внутренний домен разрешается только один раз для каждого дочернего процесса и кэшируется для всех последующих подключений, пока дочерний домен не будет переработан. Эту информацию следует учитывать при планировании задач обслуживания DNS, связанных с внутренними доменами. Также проверьте параметры ProxyPass для получения более подробной информации о повторном использовании соединения.
https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
disablereuse (по умолчанию «Выкл»). Этот параметр следует использовать, если вы хотите заставить mod_proxy немедленно закрыть соединение с серверной частью после использования и, таким образом, отключить постоянное соединение и пул для этого внутреннего интерфейса. Это помогает в различных ситуациях, когда брандмауэр между Apache httpd и внутренним сервером (независимо от протокола) имеет тенденцию незаметно разрывать соединения или когда сами серверные части могут находиться под циклическим DNS. Когда включено повторное использование соединений, каждый внутренний домен разрешается (с помощью DNS-запроса) только один раз для каждого дочернего процесса и кэшируется для всех дальнейших подключений, пока дочерний домен не будет перезапущен. Чтобы отключить повторное использование подключения, установите для этого свойства значение Вкл.
В вашем случае лучше использовать nginx или haproxy. Apache тяжеловесен для проксирования запросов.
Nginx может установить преобразователь, например:
server {
...
resolver 127.0.0.1;
set $backend_upstream "http://dynamic.example.com:80";
proxy_pass $backend_upstream;
...
}
О таймаутах можно прочитать в haproxy Воти таймауты в nginx Вот. Горячо настроить nginx.