Здравствуйте. Я пытаюсь настроить сбор логов 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 не помог.
Вопросы к сообществу:
- Почему Nginx 1.24.0 на Ubuntu 24.04 не принимает стандартный синтаксис
proxy_pass http://...? Есть ли какие-то системные настройки, которые это блокируют, или я упускаю элементарную синтаксическую ошибку?
- Почему 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 для двух сервисов:
- Основной дашборд: Доступен по пути
/admin/center/dashboard/ (проксируется на http://127.0.0.1:8100)
- 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.
Решение проблемы (обходной путь):
Так как решить проблему синтаксиса в одном файле не удалось, было принято решение использовать два разных поддомена:
https://admin.example.com -> проксируется на порт 8100 (основной дашборд)
https://logsbots.example.com -> проксируется на порт 3000 (логи Grafana)
Хотелось бы все же знать может есть какие-то решения данного вопроса без разделения на разные субдомены!