Задать вопрос
@Kirill48

Кто сталкивался с 'Nginx invalid URL prefix' и 'Promtail client version too old' после обновления Docker на Ubuntu 24.04?

Здравствуйте. Я пытаюсь настроить сбор логов Docker-контейнеров с помощью стека Loki/Grafana/Promtail на сервере Ubuntu 24.04 и столкнулся с двумя неустранимыми проблемами. Сервисы развернуты через Docker Compose v5.x

Буду благодарен за любую помощь в диагностике.

Конфигурация сервера:
  • ОС: Ubuntu 24.04 LTS
  • Nginx: 1.24.0 (Ubuntu)
  • Docker: Engine 29.1.3 (API 1.52)
  • Стек: Loki/Grafana/Promtail




Проблема 1: Ошибка Nginx "invalid URL prefix"

При попытке настроить Nginx для проксирования на 127.0.0.1 или даже просто 127.0.0.1:3000 в файлах /etc/nginx/sites-available/ я постоянно получаю ошибку синтаксиса invalid URL prefix на строке proxy_pass.

Пример синтаксиса, который выдает ошибку (строка 19):

location / {
    proxy_pass 127.0.0.1;
    # ... заголовки
}


Вывод команды nginx -t:

2025/12/13 18:49:24 [emerg] 2666660#2666660: invalid URL prefix in /etc/nginx/sites-enabled/admin-control-center:19
nginx: configuration file /etc/nginx/nginx.conf test failed


Файл /etc/nginx/nginx.conf (основной) выглядит стандартно, проблема именно в конфигурации сайта.



Проблема 2: Ошибка совместимости Docker API в Promtail

Я обновил Docker Engine с очень старой версии до 29.1.3 (API 1.52), перезапустил службу Docker (systemctl restart docker), но агент Promtail (версии 2.9.0) продолжает выдавать ошибку при попытке подключиться к сокету /var/run/docker.sock:

Логи Promtail:

level=error ts=2025-12-13T17:33:43.277546384Z caller=refresh.go:99 component=docker_discovery discovery=docker config=docker-containers/unix:///var/run/docker.sock:80 msg="Unable to refresh target groups" err="error while listing containers: Error response from daemon: client version 1.42 is too old. Minimum supported API version is 1.44, please upgrade your client to a newer version"


Команда docker version показывает, что API 1.52 используется. Перезапуск Docker не помог.



Вопросы к сообществу:

  1. Почему Nginx 1.24.0 на Ubuntu 24.04 не принимает стандартный синтаксис proxy_pass http://...? Есть ли какие-то системные настройки, которые это блокируют, или я упускаю элементарную синтаксическую ошибку?
  2. Почему Promtail "видит" старую версию API 1.42, если Docker Engine обновлен до 1.52 и служба была перезапущена? Как принудительно обновить сокет Docker или заставить Promtail использовать актуальную версию API?


Дополнение!


Проблема с Nginx: ошибка "invalid URL prefix" при попытке проксирования на один поддомен
Столкнулся с необычной ситуацией при попытке настроить Nginx для проксирования двух различных бэкенд-сервисов на один поддомен (https://admin.example.com), используя разные префиксы URL. Несмотря на использование стандартного синтаксиса, Nginx выдает критическую ошибку.

Дано:
  • ОС: Ubuntu Server
  • Nginx Version: nginx/1.24.0 (Ubuntu)
  • Цель: Использовать один домен https://admin.example.com для двух сервисов:
    1. Основной дашборд: Доступен по пути /admin/center/dashboard/ (проксируется на http://127.0.0.1:8100)
    2. Grafana (логи): Доступна по корневому пути / (проксируется на http://127.0.0.1:3000)




Предполагаемая конфигурация (которая должна работать по логике Nginx):
server {<br>
    listen 443 ssl;<br>
    server_name admin.example.com;<br>
    # ... (ssl_certificate settings) ...<br>
<br>
    location /admin/center/dashboard/ {<br>
        proxy_pass http://127.0.0.1:8100;<br>
        # ... (headers) ...<br>
    }<br>
<br>
    location / {<br>
        proxy_pass http://127.0.0.1:3000;<br>
        # ... (headers) ...<br>
    }<br>
}


Проблема:
При попытке использовать такую конфигурацию (или любые её вариации с использованием location ^~ или location =), Nginx выдавал критическую ошибку синтаксиса при проверке (nginx -t):
[emerg] ... invalid URL prefix in /etc/nginx/sites-enabled/admin-control-center:20<br>
nginx: configuration file /etc/nginx/nginx.conf test failed

Ошибка указывала на строку с директивой proxy_pass внутри блока location, независимо от того, какой синтаксис использовался (http://IP:PORT/ или просто IP:PORT).

Почему не сработало:
Хотя синтаксис Nginx для проксирования на разные бэкенды через разные location в одном файле является стандартным и рабочим, в моем случае он постоянно приводил к ошибке invalid URL prefix. Вероятная причина заключалась в неустранимом конфликте внутри базовой конфигурации Nginx на сервере (возможно, в /etc/nginx/nginx.conf) или в специфической проблеме с версией Nginx/Ubuntu, которая препятствовала корректному парсингу сложных правил location.

Решение проблемы (обходной путь):
Так как решить проблему синтаксиса в одном файле не удалось, было принято решение использовать два разных поддомена:
  1. https://admin.example.com -> проксируется на порт 8100 (основной дашборд)
  2. https://logsbots.example.com -> проксируется на порт 3000 (логи Grafana)


Хотелось бы все же знать может есть какие-то решения данного вопроса без разделения на разные субдомены!
  • Вопрос задан
  • 87 просмотров
Подписаться 1 Средний 8 комментариев
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия C++ разработчик
    11 месяцев
    Далее
  • Хекслет
    Fullstack-разработчик на Node.js
    16 месяцев
    Далее
  • Stepik
    Основы работы в консоли Linux, настройка сетевых служб (кластер)
    1 неделя
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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