Описание окружения
- ОС: Ubuntu 24.04 LTS
- Nginx: 1.24.0 (Ubuntu)
- Docker Engine: 29.1.3 (API 1.52)
- Стек: Loki/Grafana/Promtail (Promtail 2.9.0)
Проблема 1: Nginx – «invalid URL prefix»
При настройке proxy_pass в конфигурации сайта (/etc/nginx/sites-available/...) получаем ошибку:
nginx: [emerg] invalid URL prefix in /etc/nginx/sites-enabled/...:19
Пример строки:
location / {
proxy_pass 127.0.0.1;
}
Почему Nginx 1.24.0 не принимает такой синтаксис? Нужно ли указывать протокол http://? Есть ли системные ограничения?
Проблема 2: Promtail видит старую версию Docker API
После обновления Docker Engine до 29.1.3 и перезапуска службы Promtail (2.9.0) возникает ошибка:
error while listing containers: Error response from daemon: client version 1.42 is too old. Minimum supported API version is 1.44
docker version показывает API 1.52. Почему Promtail «видит» 1.42? Как заставить Promtail использовать актуальную версию API или обновить Docker socket?
Вопросы
- Как правильно настроить
proxy_passв Nginx 1.24.0 для проксирования на localhost? - Как решить проблему совместимости Docker API в Promtail после обновления Docker Engine?
Проблемы, которые вы описали, связаны с двуми разными частями стека: конфигурацией Nginx и совместимостью версии Docker‑API, которую использует Promtail. Ниже приведены конкретные решения для каждой из них.
1. Как правильно настроить proxy_pass в Nginx 1.24.0 для проксирования на localhost?
Что происходит
Nginx требует, чтобы в директиве proxy_pass был указан полный URL (с протоколом).
Если в конфигурации написано только 127.0.0.1, Nginx не может определить схему передачи и выдаёт ошибку “invalid URL prefix”. Это поведение не изменилось в 1.24.0 – оно унаследовано от более ранних версий.
Как исправить
location / {
proxy_pass http://127.0.0.1:80; # порт можно опустить, если он 80
}
- Если ваш сервис прослушивает другой порт, укажите его явно.
- Если вы проксируете через Unix‑socket, используйте:nginx
location / { proxy_pass http://unix:/var/run/your-app.sock; } - Важно оставить слеш в конце
proxy_pass, если хотите пропускаем путь без изменений:nginxlocation /api/ { proxy_pass http://127.0.0.1:8080/; # обратите внимание на trailing slash }
Почему Nginx 1.24.0 не принимает такой синтаксис
Nginx всегда требовал протокол в proxy_pass. В более ранних версиях иногда это работало без протокола только для http://, но в 1.24.0 строгий синтаксис стал обязательным. Это сделано для более понятной и безопасной конфигурации.
2. Как решить проблему совместимости Docker API в Promtail после обновления Docker Engine?
Почему Promtail «видит» 1.42
Promtail 2.9.0 использует Docker‑client библиотеку, которая по умолчанию пытается подключиться к Docker‑API версии 1.42 (стандартная версия, поддерживаемая в течение многих лет). После обновления Docker Engine до 29.1.3 вы получили API 1.52, но Promtail не знает об этом и выдает ошибку:
Error response from daemon: client version 1.42 is too old. Minimum supported API version is 1.44
Как заставить Promtail использовать актуальную версию
-
Указать версию через переменную окружения
Запустите Promtail сDOCKER_API_VERSION=1.52:bashDOCKER_API_VERSION=1.52 /usr/bin/promtail -config.file /etc/promtail/config.yaml
Или добавьте переменную в системный юнит
/etc/systemd/system/promtail.service.d/docker.conf:ini[Service] Environment="DOCKER_API_VERSION=1.52" -
Указать версию в конфигурации Promtail
В секцииdocker_sdможно задатьapi_version:yamldocker_sd: host: unix:///var/run/docker.sock api_version: 1.52 # <- указываем нужную версию -
Обновить Promtail
Если вы используете более старый релиз Promtail, проверьте наличие обновлений. В версии 2.10+ (или 3.x) уже включена более современная Docker‑client библиотека, автоматически определяющая поддержку API.bash# Пример обновления в Ubuntu sudo apt-get update sudo apt-get install promtail
Проверка
После применения одного из вышеуказанных методов перезапустите сервис Promtail и проверьте логи:
systemctl restart promtail journalctl -u promtail -f | grep Docker
Если всё работает, в логах больше не будет строки с ошибкой о «client version 1.42 is too old».
Ссылка: Docker Engine – Client version too old – GitLab Support
Заключение
| # | Что сделать | Как |
|---|---|---|
| 1 | Настроить proxy_pass с протоколом |
proxy_pass http://127.0.0.1:80; |
| 2 | Указать Docker‑API версию Promtail | DOCKER_API_VERSION=1.52 в env или api_version: 1.52 в config |
| 3 | При необходимости обновить Promtail до последнего релиза | apt-get install promtail или скачать с официального репозитория |
Эти шаги устранят обе ошибки и позволят корректно работать как Nginx, так и Promtail с Docker 29.1.3. Если после изменений появятся новые сообщения в логах, внимательно изучите их – возможно потребуется добавить дополнительные флаги (--api-version) или проверить права доступа к Docker‑socket.