NGINX
#nginx#logs#virtual-hosts#access-log#error-log#monitoring

Nginx: раздельные логи для каждого virtual host

Настройка отдельных access_log и error_log для каждого сайта (virtual host) в Nginx. Структура директорий для логов, уровни логирования.

Настройка отдельных логов для каждого virtual host. Упрощает отладку и мониторинг отдельных сайтов.

Базовая настройка раздельных логов

# Сайт 1
server {
    listen 80;
    server_name site1.ru;

    root /var/www/site1.ru/public;

    access_log /var/www/site1.ru/logs/access.log;
    error_log  /var/www/site1.ru/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

# Сайт 2
server {
    listen 80;
    server_name site2.ru;

    root /var/www/site2.ru/public;

    access_log /var/www/site2.ru/logs/access.log;
    error_log  /var/www/site2.ru/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

С уровнями логирования

server {
    listen 80;
    server_name site1.ru;

    root /var/www/site1.ru/public;

    # Access log
    access_log /var/www/site1.ru/logs/access.log;
    
    # Error log с уровнем (debug, info, notice, warn, error, crit)
    error_log  /var/www/site1.ru/logs/error.log warn;
}

Отключение логов для статики

server {
    listen 80;
    server_name site1.ru;

    root /var/www/site1.ru/public;

    access_log /var/www/site1.ru/logs/access.log;
    error_log  /var/www/site1.ru/logs/error.log;

    location / {
        try_files $uri $uri/ =404;
    }

    # Статика без логов (экономия места)
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ {
        expires 30d;
        access_log off;
    }
}

Создание директорий для логов

# Создаём директорию для логов первого сайта
mkdir -p /var/www/site1.ru/logs

# Создаём директорию для логов второго сайта
mkdir -p /var/www/site2.ru/logs

# Устанавливаем права (nginx должен писать)
chown -R www-data:www-data /var/www/site1.ru/logs
chown -R www-data:www-data /var/www/site2.ru/logs

chmod 755 /var/www/site1.ru/logs
chmod 755 /var/www/site2.ru/logs

Структура директорий

/var/www/
├── site1.ru/
│   ├── public/
│   └── logs/
│       ├── access.log
│       └── error.log
├── site2.ru/
│   ├── public/
│   └── logs/
│       ├── access.log
│       └── error.log

Кастомный формат лога для каждого сайта

http {
    # Формат для первого сайта
    log_format site1_format '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent"';

    # Формат для второго сайта (с дополнительными полями)
    log_format site2_format '$remote_addr - $remote_user [$time_local] '
                            '"$request" $status $body_bytes_sent '
                            '"$http_referer" "$http_user_agent" '
                            '$request_time $upstream_response_time';

    server {
        listen 80;
        server_name site1.ru;
        root /var/www/site1.ru/public;
        
        access_log /var/www/site1.ru/logs/access.log site1_format;
        error_log  /var/www/site1.ru/logs/error.log;
    }

    server {
        listen 80;
        server_name site2.ru;
        root /var/www/site2.ru/public;
        
        access_log /var/www/site2.ru/logs/access.log site2_format;
        error_log  /var/www/site2.ru/logs/error.log;
    }
}

Ротация логов для каждого сайта

Создайте /etc/logrotate.d/nginx-sites:

/var/www/*/logs/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Просмотр логов конкретного сайта

# Просмотр access логов первого сайта
tail -f /var/www/site1.ru/logs/access.log

# Просмотр error логов второго сайта
tail -f /var/www/site2.ru/logs/error.log

# Поиск ошибок в логах конкретного сайта
grep "error" /var/www/site1.ru/logs/error.log

# Статистика по запросам
awk '{print $1}' /var/www/site1.ru/logs/access.log | sort | uniq -c | sort -rn

Usage:

Добавьте access_log и error_log в каждый server блок с путями к отдельным файлам. Создайте директории для логов и установите правильные права.

Notes:

⚠️ Раздельные логи упрощают отладку проблем конкретного сайта. Отключение логов для статики (access_log off) экономит место на диске. Уровень warn для error_log подходит для продакшена — меньше шума, но важные ошибки видны.