Логи NGINX не маппятся с томами Docker

Вопрос или проблема

Я определяю два уровня журналирования в моем конфигурационном файле Nginx

http {

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log         /var/log/nginx/access.log main;
    ...
}

и на сервере

server {
  access_log                /var/log/nginx/nginx_access.log;
  error_log                 /var/log/nginx/nginx_error.log;

  location / {
    ...
  }
}

Мой docker-compose.yaml

services:
  nginx:
    build:
      context: ./nginx
    restart: always
    volumes:
      - logs:/var/log/nginx
    ports:
      - "80:80"
    depends_on:
      - django
...

volumes:
  logs:

Но когда я запускаю контейнеры, в logs/ нет файла access.log, nginx_error.log, nginx_access.log или ни одной папки/файла, созданного NGINX, хотя при проверке в контейнере NGINX файлы есть.

Неужели я что-то упустил?

Как вы пытаетесь получить доступ к журналам на вашем хосте Docker?

Попробуйте сопоставить ваш именованный том с вашим хостом:

services:
  nginx:
    build:
      context: ./nginx
    restart: always
    volumes:
      - logs:/var/log/nginx
    ports:
      - "80:80"
    depends_on:
      - django
...

volumes:
  logs:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/path/on/your/docker/host/to/mount' 

И проверьте, доступны ли файлы доступа и ошибок!

С уважением,

maesi

Ответ или решение

Когда вы сталкиваетесь с проблемой отсутствия логов NGINX, мапируемых в Docker volumes, важно понимать, что существует несколько нюансов, которые могут влиять на работу с томами. Давайте рассмотрим вашу ситуацию более подробно и найдем возможное решение.

1. Проверка конфигурации Docker Compose

Ваш файл docker-compose.yaml выглядит корректно с точки зрения определения сервиса NGINX и маппинга томов. Однако, так как вы используете именованный том (logs), это может создавать путаницу, так как ни один процесс на хосте не будет явно видеть его содержимое, как с примонтированным каталогом.

Решение:

Для того чтобы сделать логи доступными на хосте, рекомендуется использовать бинд-тому для привязки к конкретной директории на хост-машине. Это можно сделать, изменив ваш файл docker-compose.yaml, как показано ниже:

services:
  nginx:
    build:
      context: ./nginx
    restart: always
    volumes:
      - ./logs:/var/log/nginx # Указываем путь на хосте
    ports:
      - "80:80"
    depends_on:
      - django

# Можно убрать часть "volumes:" внизу, если не нужен именованный том

Здесь ./logs — это папка на хосте, куда будут сохраняться все логи NGINX. Не забудьте создать эту папку заранее с правами записи.

2. Проверка прав доступа

При использовании томов Docker убедитесь, что у процесса NGINX внутри контейнера есть необходимые права для записи в каталог, который вы маппируете.

Решение:

Вы можете проверить права на папку в контейнере с помощью следующей команды:

docker exec -it <nginx_container_id> ls -ld /var/log/nginx

Убедитесь, что у пользователя, от имени которого запускается NGINX, есть права на запись в этот каталог.

3. Подтверждение конфигурации NGINX

Несмотря на то, что вы корректно указали логи в конфигурации NGINX, убедитесь, что конфигурация загружается без ошибок. Используйте команду:

docker exec -it <nginx_container_id> nginx -t

Это позволит проверить конфигурацию на ошибки.

4. Перезапуск контейнера

После изменения конфигурации убедитесь, что вы перезапустили контейнер, чтобы изменения вступили в силу:

docker-compose down
docker-compose up -d

Заключение

С учетом всех предложенных шагов, вы сможете настроить логи NGINX таким образом, что они будут сохраняться как на хосте, так и в контейнере. Убедитесь, что используете нужную конфигурацию, проверяете права доступа и правильно настраиваете volumes в Docker.

Если после выполнения этих шагов проблема останется, рассмотрите также возможность анализа ошибок в самом NGINX, которые могут помочь диагностировать источник проблемы.

Оцените материал
Добавить комментарий

Капча загружается...