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 подходит для продакшена — меньше шума, но важные ошибки видны.