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

Ссылка скопирована
1 ответ

Сейчас ситуация такая: я пытаюсь настроить сбор логов 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)

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

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Кирилл JS Ответ

Ошибки Nginx invalid URL prefix и Promtail client version too old после обновления Docker на Ubuntu 24.04, скорее всего, имеют разные причины, но проявились одновременно из-за обновления окружения. Нужно разделить Nginx-конфиг/прокси и связку Promtail/Loki.

Nginx invalid URL prefix часто появляется, когда в proxy_pass указан некорректный URL: без схемы, с переменной в неправильном месте, с лишними символами или пустым значением переменной.

# плохо
proxy_pass app:3000;
 
# правильно
proxy_pass http://app:3000;

# плохо proxy_pass app:3000; # правильно proxy_pass http://app:3000;

Проверьте итоговый конфиг:

nginx -t
nginx -T | grep -n "proxy_pass" -C 2

nginx -t nginx -T | grep -n "proxy_pass" -C 2

Если proxy_pass собирается через переменную, убедитесь, что она не пустая. После обновления Docker могли измениться имена контейнеров, network alias или env-файлы.

Promtail client version too old обычно говорит о несовместимости версии Promtail с Loki или его API. Проверьте версии образов и не используйте latest без фиксации. Обновите Promtail и Loki согласованно:

docker compose pull promtail loki
docker compose up -d promtail loki
docker logs promtail --tail=100

docker compose pull promtail loki docker compose up -d promtail loki docker logs promtail --tail=100

Также проверьте формат конфигурации Promtail: старый config может не подходить к новой версии, но сообщение про “client too old” чаще именно о несовместимости клиента и сервера.

Итог: Nginx чинится проверкой proxy_pass, схемы http:// и docker DNS. Promtail чинится согласованием версий Promtail/Loki и отказом от случайного latest. Разберите их как две независимые ошибки, иначе можно долго искать одну общую причину там, где её нет.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно