У меня возникают периодические сбои запросов при доступе к моему веб-приложению с помощью Traefik.
Я использую:
- Приложение Dockerized Flask с Gunicorn
- официальный почтовый контейнер Postgres
- официальный контейнер для перевозки грузов Traefik
- docker-compose для запуска всех вышеперечисленных контейнеров
Все работает на одном экземпляре AWS EC2. В основном я использую Traefik для получения автоматически сгенерированного SSL-сертификата от letsencrypt
По большей части все работает так, как я надеюсь. Однако периодически при загрузке моей страницы в браузере она зависает. Когда я проверяю вкладку сети, я вижу, что некоторые запрошенные документы не удалось загрузить.
Я включил журналы доступа и установил уровень журнала DEBUG в Traefik и перезагружал свою страницу, пока не смог увидеть ошибку. В первый раз, когда мне удалось зафиксировать ошибку, журналы не указывали, что что-то не так. Они показали, что Трафик отвечает документом с ответом 200. Вот соответствующая часть журнала и снимок экрана панели сети Safari
log: https://pastebin.com/DUegF4UU
После регистрации большего количества успехов и неудач я в конечном итоге смог увидеть ошибку, которая может иметь значение в журналах:
traefik | time="2019-01-09T22:14:54Z" level=debug msg="Request has been aborted [96.92.159.193:63283 - /admin/static/vendor/jquery.min.js?v=2.1.4]: net/http: abort Handler"
traefik | time="2019-01-09T22:15:08Z" level=debug msg="http: TLS handshake error from 96.92.159.193:37272: EOF"
Вот полный набор соответствующих строк журнала: https://pastebin.com/9uXxFDEs
И сетевая панель:
Несколько замечаний:
1) Это происходит не с каждым запросом
2) Даже когда это происходит, я не обязательно вижу ошибку
3) Из 10 сбоев, которые я запечатлел в журнале отладки, дважды появилась ошибка «Запрос был прерван», а однажды обнаружена «Ошибка квитирования TLS»
Просто для полноты, вот панель журнала и сети для успешного запроса:
log: https://pastebin.com/f1WhUWYk
Вот мой файл traefik.toml:
debug = false
logLevel = "DEBUG"
defaultEntryPoints = ["http", "https"]
[web]
# Port for the status page
address = ":8080"
[web.auth.basic]
users = ["admin:nope"]
# Entrypoints, http and https
[entryPoints]
# http should be redirected to https
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
# https is the default
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
# Enable ACME (Let's Encrypt): automatic SSL
[acme]
# Email address used for registration
email = "mine"
storageFile = "/etc/traefik/acme.json"
entryPoint = "https"
onDemand = false
OnHostRule = true
[acme.httpChallenge]
entryPoint = "http"
[retry]
# Enable Docker configuration backend
[docker]
endpoint = "unix:///var/run/docker.sock"
watch = true
exposedbydefault = false
Пожалуйста, дайте мне знать, если какая-либо дополнительная информация может быть полезна.
РЕДАКТИРОВАТЬ: После дополнительных экспериментов кажется, что я получаю сбои ответа, только когда Traefik работает в контейнере Docker. Когда я запускаю его прямо на главном компьютере (с моим приложением, все еще работающим в докере), я больше не вижу никаких проблем.