Веб

proxy_pass в Nginx 1.24.0 и Docker API в Promtail

Решаем ошибки Nginx 1.24.0 «invalid URL prefix» и несовместимость Docker API в Promtail 2.9.0. Пошаговые инструкции по proxy_pass и настройке DOCKER_API_VERSION.

Описание окружения

  • ОС: 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?

Вопросы

  1. Как правильно настроить proxy_pass в Nginx 1.24.0 для проксирования на localhost?
  2. Как решить проблему совместимости 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 – оно унаследовано от более ранних версий.

Как исправить

nginx
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, если хотите пропускаем путь без изменений:
    nginx
    location /api/ {
        proxy_pass http://127.0.0.1:8080/;   # обратите внимание на trailing slash
    }
    

Ссылка: Nginx – “invalid URL prefix” – Stack Overflow

Почему 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 использовать актуальную версию

  1. Указать версию через переменную окружения
    Запустите Promtail с DOCKER_API_VERSION=1.52:

    bash
    DOCKER_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"
    
  2. Указать версию в конфигурации Promtail
    В секции docker_sd можно задать api_version:

    yaml
    docker_sd:
      host: unix:///var/run/docker.sock
      api_version: 1.52   # <- указываем нужную версию
    
  3. Обновить Promtail
    Если вы используете более старый релиз Promtail, проверьте наличие обновлений. В версии 2.10+ (или 3.x) уже включена более современная Docker‑client библиотека, автоматически определяющая поддержку API.

    bash
    # Пример обновления в Ubuntu
    sudo apt-get update
    sudo apt-get install promtail
    

Проверка

После применения одного из вышеуказанных методов перезапустите сервис Promtail и проверьте логи:

bash
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.


Источники

  1. Nginx – “invalid URL prefix” – Stack Overflow
  2. Docker Engine – Client version too old – GitLab Support
  3. Promtail Docker SD documentation – GitHub
  4. Docker compose issue – client version too old
Авторы
Проверено модерацией
Модерация