Я пытаюсь отладить проблему тайм-аута, которая у меня есть с Apache, уже несколько месяцев.
Схема выглядит так: Затем сервер ждет ровно 1 минуту перед отправкой результата.
На последующие запросы отвечают мгновенно, это происходит только для запросов через некоторое время (пока не удалось точно определить это, от 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
, но внутренняя балансировка нагрузки все еще существует. Я думал, что если я укажу на конкретный узел роя, я буду использовать контейнер внутри этого конкретного узла. Но пока ничего.
Если вы можете использовать службу докеров в режиме HOST + GLOBAL , вы можете использовать внешний балансировщик нагрузки. Поскольку в режиме service GLOBAL существует только 1 задача службы (то есть контейнер) на каждой виртуальной машине, принадлежащей рою. Из-за режима HOST порт служебной задачи отображается на «хост» (в данном случае виртуальный хост: виртуальная машина). Таким образом, внешний балансировщик нагрузки (например, nginx) может перенаправлять входящие запросы на IP_VM: MAPPED_PORT . Надеюсь, все было ясно :)
Docker выполняет балансировку входящей нагрузки. Это балансировщик нагрузки по умолчанию. вы можете использовать команду --endpoint-mode dnsrr для балансировки нагрузки DNS.
Если вы хотите использовать внешнюю балансировку нагрузки, такую как nginx. Сначала вы должны запустить контейнер Nginx, скопировать файл конфигурации в работающий контейнер и заменить старый. затем он укажет опубликованный контейнером порт и хост.