Отладка тайм-аута с ldap auth на apache

Я пытаюсь отладить проблему тайм-аута, которая у меня есть с Apache, уже несколько месяцев.

Схема выглядит так: Затем сервер ждет ровно 1 минуту перед отправкой результата.

enter image description here

На последующие запросы отвечают мгновенно, это происходит только для запросов через некоторое время (пока не удалось точно определить это, от 5 до 15 минут).

Факт то, что время ожидания воспроизводится ровно 60 секунд, для меня пахнет тайм-аутом. Если я отменю запрос и нажму «перезагрузить», я сразу же получу запрошенный URL.

Поскольку запрос пароля также появляется мгновенно, я могу исключить проблему с подтверждением связи SSL между клиентом и сервером или проблемы с DNS на этом участке. Не имеет значения, запрашиваю ли я PHP-скрипт или пустой текстовый файл, что также устраняет проблему со скриптами на сервере. Я предполагаю, что результат процесса аутентификации затем кэшируется на некоторое время, поэтому он не требуется для последующих запросов.

Обратите внимание, что аутентификация всегда проходит успешно, так что я могу также исключить проблему «контроллер домена не ответил».

Apache 2.4 работает на Windows Server 2012 R2. Он настроен для аутентификации LDAP:

<Location />
    AuthType Basic
    AuthName "AD Login"
    AuthBasicProvider ldap
    LDAPReferrals Off
    #AuthLDAPUrl ldap://dc01.domain.de:3268/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*)
    #AuthLDAPUrl ldap://ad.domain.de:389/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*) STARTTLS
    AuthLDAPUrl ldap://ad.domain.de:389/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*) TLS
    AuthLDAPBindDN "service@domain.de"
    AuthLDAPBindPassword "secret"
    Require valid-user
    Require all denied
</Location>

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

ad.domain.de разрешается для нескольких контроллеров домена, но поведение остается таким же, если я подключаюсь к определенному DC.

Нет записей в журнале ошибок на LogLevel info , я пока не решаюсь увеличьте его до debug , поскольку я знаю по опыту, что у меня проблемы с просмотром сгенерированной отладочной информации.

Есть ли что-то, что я еще пропустил, что я могу использовать для отладки проблемы, докер-машина создать -d виртуальный бокс worker1 docker-machine create -d virtualbox worker2 это их IP: ...

Я создал 3 виртуальных машины с помощью docker-machine:

docker-machine create -d virtualbox manager1
docker-machine create -d virtualbox worker1
docker-machine create -d virtualbox worker2

это их IP:

docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
manager   -        virtualbox   Running tcp://192.168.99.102:2376                                   v1.12.6
worker1   -        virtualbox   Running   tcp://192.168.99.100:2376           v1.13.0-rc5  
worker2   -        virtualbox   Running   tcp://192.168.99.101:2376           v1.13.0-rc5   

Затем docker-machine ssh manager1

и:

docker swarm init --advertise-addr 192.168.99.102:2377

, затем worker1 и worker2 присоединяются к рою.

Теперь я создал оверлейную сеть как:

docker network create -d overlay skynet

и развернул службу в глобальном режиме (1 задача для узла):

docker service create --name http --network skynet --mode global -p 8200: 80 katacoda / docker-http-serve r

И фактически имеется 1 контейнер (задача) для узла.

Теперь я хотел бы получить доступ непосредственно к моему виртуальному хосту .. или, по крайней мере, я хотел бы просматривать непосредственно контейнер моей службы, потому что я хотел бы разработать балансировщик нагрузки моего сервис с nginx. Для этого в моем файле конфигурации nginx я хотел бы указать на конкретный контейнер службы (т.е. теперь у меня есть 3 узла (1 менеджер и 2 рабочих) в глобальном режиме, поэтому у меня запущено 3 задачи -> i хочу выбрать один из этих 3-х контейнеров). Как я могу это сделать?

[править]: я могу указать на мои узлы роя, просто просматривая:, то есть:

192.168.99.102:8200

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

0
задан 26 April 2017 в 10:17
2 ответа

Если вы можете использовать службу докеров в режиме HOST + GLOBAL , вы можете использовать внешний балансировщик нагрузки. Поскольку в режиме service GLOBAL существует только 1 задача службы (то есть контейнер) на каждой виртуальной машине, принадлежащей рою. Из-за режима HOST порт служебной задачи отображается на «хост» (в данном случае виртуальный хост: виртуальная машина). Таким образом, внешний балансировщик нагрузки (например, nginx) может перенаправлять входящие запросы на IP_VM: MAPPED_PORT . Надеюсь, все было ясно :)

0
ответ дан 24 November 2019 в 05:07

Docker выполняет балансировку входящей нагрузки. Это балансировщик нагрузки по умолчанию. вы можете использовать команду --endpoint-mode dnsrr для балансировки нагрузки DNS.

Если вы хотите использовать внешнюю балансировку нагрузки, такую ​​как nginx. Сначала вы должны запустить контейнер Nginx, скопировать файл конфигурации в работающий контейнер и заменить старый. затем он укажет опубликованный контейнером порт и хост.

0
ответ дан 24 November 2019 в 05:07

Теги

Похожие вопросы