Скрипт бэкапов и ротации логов доступа веб-серверов apache и nginx

Достоинство (или недостаток) скрипта в том, что написан он полностью на bash. Не придётся ничего устанавливать.

У Вас может отличаться структура папок в web-сервере, но советую её так же перенять. Хотя дело Ваше. Мне, например, так удобнее работать с кучей сайтов.

Схема структуры - как, например, в Ubuntu. Т.е. существует папка /etc/httpd(apache2)/sites-enabled/, где лежат все работающие host'ы с расширением .conf.
Папка с виртуальными хостами nginx - /etc/nginx/conf.d/.

Честно говоря, есть вариант либо сделать в nginx'е такую же структуру как в apache или же, наоборот, убрать в apache "sites-enable". Тут я ещё не определился, но подправить пути в данном скрипте не долго.

От Вас требуется лишь прописать пути в конфигурационных файлах web-серверов для файлов логов до папок
Для apache:

CustomLog /var/log/httpd/access/$host
ErrorLog /var/log/httpd/error/$host

Для nginx:
error_log /var/log/nginx/access/$host
access_log /var/log/nginx/error/$host
ВАЖНО! Имена файлов логов предполагаются быть одноименными host'ам, только с расширением .conf. Например,

ServerName mysite.ru
ErrorLog /var/log/httpd/error/mysite.ru.conf

Итак, что же делает скрипт?
Скрипт автоматически создаёт простую структуру папок.

/var/log/httpd/access/$hosts/`date_'+%Y%m'`/
/var/log/httpd/error/$hosts/`date_'+%Y%m'`/
/var/log/httpd/archive/access/$hosts/`date_'+%Y%m'`/
/var/log/httpd/archive/error/$hosts/`date_'+%Y%m'`/
/var/log/httpd/archive/error/main/
/var/log/nginx/access/$hosts/`date_'+%Y%m'`/
/var/log/nginx/error/$hosts/`date_'+%Y%m'`/
/var/log/nginx/archive/access/$hosts/`date_'+%Y%m'`/
/var/log/nginx/archive/error/$hosts/`date_'+%Y%m'`/
/var/log/nginx/archive/access/main/
/var/log/nginx/archive/error/main/

Далее он берёт файл лога, архивирует его и кладёт его в папку
/var/log/httpdИлиNginx/ошибкиИлиДоступ/названиеХоста/годМесяц/имяФайла_ГодМесяцДень_ЧасМинутаСекунда.tag.bz2.

Зачем время? От дурака. Чтобы при запуске скрипта реже раза в секунду файлы не перетирались. А если чаще раза в секунду? Найдите дурака и убейте! =)

Первоначальный файл просто очищается. Это позволяет исключить так часто виденное мною в других примерах действие перезапуска/перечтения web-сервера. Ведь мало ли что.... =)

Логи ошибок старше месяца (31 день) и доступа старше года - удаляются, что так же можно подкорректировать.
Ну вот в общем-то и всё. Ниже сам скрипт (редакция #2)

Spoiler: Highlight to view

#!/bin/bash
 
enabledDomains=`ls /etc/httpd/sites-enabled/ | sed -e 's/.conf//g'`
### В переменной enabledDomains при необходимости можно отключить ротацию логов для некоторых хостов.
### Этого можно добиться, если дописать перед командой "sed" строки "grev -v $host", например:
### enabledDomains=`ls /etc/httpd/sites-enabled/ | grep -v mysite.ru.conf | sed -e 's/.conf//g'`
dateFolder=`date '+%Y_%m'`
currentDate=`date '+%Y%m%d_%H%M%S'`
 
### Скрипт бэкапов и ротации логов доступа веб-сервера apache
 
apacheAccessLogs=/var/log/httpd/access
apacheErrorLogs=/var/log/httpd/error
apacheArchiveLogs=/var/log/httpd/archive
apacheArchiveAccessLogs=$apacheArchiveLogs/access
apacheArchiveErrorLogs=$apacheArchiveLogs/error
apacheArchiveErrorMainLogs=$apacheArchiveErrorLogs/main
 
mkdir -p $apacheArchiveErrorMainLogs
for nameHost in $enabledDomains; do
  /bin/mkdir -p "$apacheArchiveAccessLogs/$nameHost/$dateFolder" &&
  /bin/mkdir -p "$apacheArchiveErrorLogs/$nameHost/$dateFolder";
done
 
for nameHost in $enabledDomains; do
  logFileInput=$apacheAccessLogs/$nameHost;
  logFileOutput="$apacheArchiveAccessLogs/$nameHost/$dateFolder/${nameHost}_${currentDate}.log.bz2";
  /usr/bin/bzip2 -c $logFileInput > $logFileOutput &&
  /bin/cp /dev/null $logFileInput;
done
 
for nameHost in $enabledDomains; do
  logFileInput=$apacheErrorLogs/$nameHost;
  logFileOutput="$apacheArchiveErrorLogs/$nameHost/$dateFolder/${nameHost}_${currentDate}.log.bz2";
  /usr/bin/bzip2 -c $logFileInput > $logFileOutput &&
  /bin/cp /dev/null $logFileInput;
done
 
mainErrorLogInput=/var/log/httpd/error_log
mainErrorLogOutput=$apacheArchiveErrorMainLogs/main_${currentDate}.log.bz2
/usr/bin/bzip2 -c $mainErrorLogInput > $mainErrorLogOutput
/bin/cp /dev/null $mainErrorLogInput
 
/usr/bin/find $apacheArchiveErrorLogs -mtime +31 | /usr/bin/xargs  /bin/rm -rf
/usr/bin/find $apacheArchiveAccessLogs -mtime +365 | /usr/bin/xargs  /bin/rm -rf
 
### Скрипт бэкапов и ротации логов доступа веб-сервера nginx
 
nginxAccessLogs=/var/log/nginx/access
nginxErrorLogs=/var/log/nginx/error
nginxArchiveLogs=/var/log/nginx/archive
nginxArchiveAccessLogs=$nginxArchiveLogs/access
nginxArchiveErrorLogs=$nginxArchiveLogs/error
nginxArchiveAccessMainLogs=$nginxArchiveAccessLogs/main
nginxArchiveErrorMainLogs=$nginxArchiveErrorLogs/main
 
mkdir -p $nginxArchiveErrorMainLogs
mkdir -p $nginxArchiveAccessMainLogs
for nameHost in $enabledDomains; do
  /bin/mkdir -p "$nginxArchiveAccessLogs/$nameHost/$dateFolder" &&
  /bin/mkdir -p "$nginxArchiveErrorLogs/$nameHost/$dateFolder";
done
 
for nameHost in $enabledDomains; do
  logFileInput=$nginxAccessLogs/$nameHost;
  logFileOutput="$nginxArchiveAccessLogs/$nameHost/$dateFolder/${nameHost}_${currentDate}.log.bz2";
  /usr/bin/bzip2 -c $logFileInput > $logFileOutput &&
  /bin/cp /dev/null $logFileInput;
done
 
for nameHost in $enabledDomains; do
  logFileInput=$nginxErrorLogs/$nameHost;
  logFileOutput="$nginxArchiveErrorLogs/$nameHost/$dateFolder/${nameHost}_${currentDate}.log.bz2";
  /usr/bin/bzip2 -c $logFileInput > $logFileOutput &&
  /bin/cp /dev/null $logFileInput;
done
 
mainErrorLogInput=/var/log/nginx/error.log
mainErrorLogOutput=$nginxArchiveErrorMainLogs/main_${currentDate}.log.bz2
/usr/bin/bzip2 -c $mainErrorLogInput > $mainErrorLogOutput
/bin/cp /dev/null $mainErrorLogInput
 
mainAccessLogInput=/var/log/nginx/access.log
mainAccessLogOutput=$nginxArchiveAccessMainLogs/main_${currentDate}.log.bz2
/usr/bin/bzip2 -c $mainAccessLogInput > $mainAccessLogOutput
/bin/cp /dev/null $mainAccessLogInput
 
/usr/bin/find $nginxArchiveAccessLogs -mtime +365 | /usr/bin/xargs  /bin/rm -rf
/usr/bin/find $nginxArchiveErrorLogs -mtime +31 | /usr/bin/xargs  /bin/rm -rf

Почему скрипт берёт имена host'ов из apache, а не из nginx?
Так как nginx выступает frontend'ом - у него больше записей. Связанно это с тем, что есть файлы конфигураций, где прописан redirect'ы. Смысла писать логи по ним не вижу - только место забивать.

Сам скрипт готовым файликом прикреплён к этой статье.
Не забываем дать права на исполнение:
chmod +x ./backup_hosts_logs.sh

Буду рад Вашему мнению и замечаниям и если кому-то пригодиться =)

P.S. Логично поставить скрипт в cron и, если Вы хотите, чтобы Вам на почту приходили сообщения о том, что есть какие то ошибки, предлагаю вашему вниманию такую строчку:
59 23 * * * root erlog=`/root/scripts/backup_hosts_logs.sh 2>&1`; if ! $erlog; then echo $erlog | mail -s "Backup logs servername report" user@domain.com; fi

Приложение: 

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

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image