Post navigation

Введение

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 8.
  2. Настройка CentOS 8.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 10, если предпочитаете его:

  1. Установка Debian 10.
  2. Базовая настройка Debian.
  3. Установка и настройка zabbix на debian.

Я буду в своем примере настраивать все на CentOS 7, но в данном случае дистрибутив не имеет принципиального значения, все так же настраивается и на других linux системах с учетом их особенностей в установке пакетов и путей для конфигов и программ.

Мы будем использовать в качестве источника информации штатные возможности nginx, apache и php-fpm, затем передавать данные в zabbix сервер и там анализировать. Я подразумеваю, что nginx или apache вы уже настроили и имеете некое представление о работе его компонентов, поэтому некоторые вещи я не разжевываю, а просто говорю, что делать.

Настройка журнала доступа

Каждый раз, когда клиентский запрос обрабатывается, Nginx генерирует новое событие в журнале доступа. Каждая запись события содержит отметку времени и включает различную информацию о клиенте и запрошенном ресурсе. Журналы доступа могут показать вам местоположение посетителей, страницу, которую они посещают, сколько времени они проводят на странице и многое другое.

Директива позволяет вам определять формат регистрируемых сообщений. Директива включает и устанавливает расположение файла журнала и используемый формат.

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

Где — это полный путь к файлу журнала, а — формат, используемый файлом журнала.

Журнал доступа можно включить в блоке , или .

По умолчанию журнал доступа глобально включен в директиве в основном файле конфигурации Nginx.

/etc/nginx/nginx.conf

Для удобства чтения рекомендуется создавать отдельный файл журнала доступа для каждого серверного блока. Директива установленная в директиве директиву, установленную в директиве (более высокого уровня).

/etc/nginx/conf.d/domain.com.conf

Если формат журнала не указан, Nginx использует предопределенный комбинированный формат, который выглядит следующим образом:

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

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

Хотя журнал доступа предоставляет очень полезную информацию, он занимает дисковое пространство и может повлиять на производительность сервера. Если на вашем сервере мало ресурсов и у вас загруженный веб-сайт, вы можете отключить журнал доступа. Чтобы сделать это, установите значение директиву :

Шаг 2 — Изменение конфигурации Postfix

Теперь вы можете изменить дополнительные настройки, которые не предлагались в диалогах процедуры установки. Многие параметры конфигурации Postfix заданы в файле . Вместо того, чтобы редактировать этот файл напрямую, вы можете использовать команду Postfix для запроса или установки параметров конфигурации.

Для начала задайте расположение почтового ящика пользователя Ubuntu без прав root. В этом обучающем модуле мы используем формат Maildir, в котором соообщения выделяются в отдельные файлы, перемещаемые между каталогами в зависимости от действий пользователя. Также существует возможность хранить все сообщения в одном файле в формате mbox, но мы не рассматриваем ее в этом обучающем модуле.

Задайте для переменной значение . Впоследствии вы создадите структуру каталогов с этим именем в своем домашнем каталоге пользователя. Настройте с помощью следующей команды:

Задайте расположение таблицы , где произвольные учетные записи электронной почты сопоставляются с системными учетными записями Linux. Запустите следующую команду, сопоставляющую расположение таблицы с файлом базы данных хэша под именем :

Мы определили расположение файла виртуальной карты в файле и теперь можем создать сам файл и начать сопоставление учетных записей электронной почты с учетными записями пользователей в системе Linux. Создайте файл в или другом предпочитаемом текстовом редакторе:

Укажите все адреса, для которых вы хотите получать электронную почту, а затем укажите через пробел имя пользователя Linux, которому должна доставляться эта почта.

Например, если вы хотите принимать электронную почту на адреса и и доставлять ее пользователю Linux с именем sammy, файл можно настроить следующим образом:

/etc/postfix/virtual

После сопоставления всех почтовых адресов с соответствующими учетными записями сервера вы можете сохранить и закрыть файл. Если вы использовали , нажмите , , а затем .

Примените сопоставление:

Перезапустите процесс Postfix, чтобы все изменения были применены:

Если вы следовали указаниям руководства по начальной настройке сервера, вы настроили брандмауэр с помощью UFW. Этот брандмауэр по умолчанию блокирует внешние подключения к службам вашего сервера, если эти подключения прямо не разрешены, и поэтому вам нужно будет добавить исключение для Postfix в правило брандмауэра.

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

Теперь Postfix настроен и готов принимать внешние подключения. Однако мы еще не готовы тестировать его с помощью почтового клиента. Прежде чем устанавливать почтовый клиент и использовать его для взаимодействия с доставляемой на сервер почтой, необходимо внести некоторые изменения в настройки сервера Ubuntu.

Краткое описание файла настроек Logrotate

Описание того, каким образом Logrotate будет работать с тем или иным лог файлом находится в специальном конфигурационном файле. Как правило, они располагаются в директории /etc/logrotate.d/. Например, файл конфигурации для apache2 выглядит следующим образом:

$ more /etc/logrotate.d/apache2
/var/log/apache2/*.log {
        weekly              # ротация раз в неделю. Возможные варианты daily, weekly,
                            # monthly, size (например size=1M)
        missingok           # отсутствие файла не является ошибкой
        rotate 52           # сохраняется последние 52 ротированных файла
        compress            # сжимать ротируемый файл
        delaycompress       # сжимать предыдущий файл при следующей ротации 
                            # (т.е. файл *.log.1 будет не сжат, а *.log.2 и далее сжатыми)
        notifempty          # не обрабатывать пустые файлы
        create 640 root adm # сразу после ротации создать пустой файл с заданными правами и пользователем
        sharedscripts       # крипты prerotate/postrotate будут выполнены только один раз
                            # не зависимо от количества журналов, подходящих под заданный шаблон
        postrotate          # скрипт будет выполнен сразу после ротации
                if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
                        /etc/init.d/apache2 reload > /dev/null
                fi
        endscript
}

При этом, первая строка /var/log/apache2/*.log есть ничто иное, как шаблон обрабатываемых лог-файлов. Он означает, что указанная конфигурация ротации будет использоваться для всех файлов, находящихся в директории /var/log/apache2/ и имеющих расширение «log».

Допустимых директив в конфигурационном файле очень много (более 40). Подробнее о них можно узнать из man logrotate.

  • Директивы:
  • mail — указывает куда отсылать ротированный файл
  • mailfirst — отсылать первую ротированную комию; maillast — отсылать последнюю ротированную копию
        postrotate
                reload rsyslog >/dev/null 2>&1 || true # for Debian
                invoke-rc.d rsyslog reload > /dev/null # for RHEL
        endscript

copytruncate — после создания копии, обрезать исходный файл журнала взамен перемещения старого файла журнала и создания нового. Это может найти применение в том случае, когда некоторой программе нельзя указать закрыть её журнал, и таким образом можно постоянно продолжать запись (добавление) в существующий файл журнала

Примите во внимание, что хотя между копированием файла и его обрезанием очень маленький промежуток времени, некоторая часть журналируемых данных может быть потеряна. При использовании этого параметра, не имеет силы директива create, так как старый файл журнала остаётся на своём месте.

Настройки DNS

Для работы вашей почтовой системы необходимо настроить следующие записи DNS:

Запись, указывающая полное доменное имя (имя хоста) вашей системы на IPv4-адрес вашего почтового сервера.

Полное доменное имя состоит из двух частей: имени хоста и имени домена.

Запись MX, чтобы указать, какой почтовый сервер отвечает за прием сообщений электронной почты от имени домена получателя. В нашем случае мы хотим, чтобы все электронные письма, отправленные на @linuxize.com электронной почты @linuxize.com принимались почтовым сервером mail.linuxize.com .

Запись SPF, которая используется для проверки того, какие почтовые серверы одобрены для отправки электронной почты от имени данного домена. В приведенном ниже примере мы утверждаем почтовые серверы домена (mx), и если проверка SPF не удалась, результатом будет мягкий сбой (~ все):

Конечно, вам необходимо заменить доменное имя и IP-адрес на ваше реальное доменное имя и IP-адрес вашего почтового сервера.

Обратный DNS (PTR)

Обратный DNS (PTR) — это IP-адрес для сопоставления доменного имени, полная противоположность DNS, который сопоставляет доменные имена с IP-адресами.

Большинство почтовых серверов будут выполнять обратный поиск DNS на IP-адресе, который пытается подключиться к ним, и могут не принимать электронные письма с сервера, если запись PTR не установлена.

В большинстве случаев записи PTR можно установить через веб-интерфейс вашего хостинг-провайдера или связавшись со службой поддержки и попросив их настроить для вас правильную запись PTR.

Вы можете использовать команду dig, чтобы узнать обратный DNS для заданного IP-адреса.

Опции выполнения скриптов:

postrotate/endscript Строки, находящиеся между словами postrotate и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh после ротации файла лога. Обычно скрипту в качестве первого аргумента передается полное имя файла лога с путем. Если указана директива sharedscripts, то передается список файлов. Таким образом можно выполнить скрипт для всех файлов сразу
prerotate/endscript Строки, находящиеся между словами prerotate и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh перед ротацией файла лога. Обычно скрипту в качестве первого аргумента передается полное имя файла лога с путем. Если указана директива sharedscripts, то передается список файлов.
sharedscripts В обычном режиме скрипты выполняются по одному разу на каждый файл, указанный для ротации. Таким образом скрипты могут быть выполнены несколько раз, по разу для каждого файла, указанного для ротации. Если указана директива sharedscripts, то скрипты выполняются по одному разу, но в качестве аргументов им передается список файлов. Если же ни один файл лога не ротируется, скрипты выполнены не будут. Если в процессе выполнения скрипта возникнет ошибка, то действие не будет завершено для всех логов.
nosharedscripts Запускать prerotate и postrotate скрипты для каждого лога, который ротируется. Это значение по умолчанию, кроме того, эта директива перегружает sharedscripts. Скриптам передается абсолютный путь к файлам логов. Если во время выполнения скрипта возникнет ошибка, то действие не будет завершено только для одного текущего файла лога.
preremove/endscript Строки, находящиеся между словами preremove и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh перед удалением старого файла лога. logrotate передаст название файла, который будет удален, скрипту в качестве аргумента
firstaction/endscript Строки, находящиеся между словами firstaction и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh один раз до того, как лог-файлы будут ротированы и еще до того, как будет выполнена секция prerotate. Это произойдет только в том случае, если хотя бы один лог-файл будет действительно ротироваться. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет.
lastaction/endscript Строки, находящиеся между словами lastaction и endscript, каждое из которых должно находиться в отдельной строке, выполняются с использованием /bin/sh один раз только после того, как лог-файлы будут ротированы и даже после того, как будет выполнена секция postrotate. Это произойдет только в том случае, если хотя бы один лог-файл ротирован. Скрипту передается весь список файлов текущей секции в качестве аргументов. Если скрипт заканчивает работу с ошибкой, другого запуска не будет.

Опции, связанные с датами:

|                                                    | |
|-|-|
|dateext|Использовать в названии старых лог-файлов дату вместо номера. При использовании номера названия выглядят так: logfile.1.gz, logfile.2.gz и так далее|
|nodateext|Не использовать дату в названиях старых лог-файлов. Эта опция перегружает опцию dateext|
|dateformat форматная-строка|Указать форматную строку для даты, которая будет добавляться к названию лога. Форматная строка похожа на используемую в команде date, но допустимы только шаблоны %Y(четырехзначный номер года), %m(двузначный номер месяца), %d(двузначный номер дня месяца) и %s(unix time, количество секунд с 00:00 01.01.1970). Значение по умолчанию “-%Y%m%d”, минус также включен в шаблон, при задании шаблона его можно упустить. Нужно отметить, что logrotate использует сортировку для определения более старых файлов, которые необходимо удалить, поэтому строка даты должна учитывать корректную сортировку. Именно поэтому вначале пишется обычно год, затем месяц и только затем день.|
|dateyesterday|Использовать вчерашнюю дату при ротации. Таким образом, дата в названии файла будет соответствовать дате файла, который находится внутри архива|

Опции, связанные с размером и существованием файла лога:

maxsize размер Лог ротируется, когда его размер превысит указанный, еще до наступления следующего интервала ротации (daily, weekly, monthly, yearly). Поскольку такая ротация не зависит от времени, поэтому использовать в названии файла дату не имеет смысла.
minsize размер Лог ротируется, когда его размер больше указанного, но не ранее, чем наступает соответствующий временной интервал ротации (daily, weekly, monthly, yearly)
size размер Лог ротируется, когда его размер больше указанного количества байт. Если после размера указана буква k, размер считается в килобайтах, если M — в мегабайтах, если G — в гигабайтах. Например, 1G или 10M.
ifempty Ротировать файл лога, даже если он пуст. Используется по умолчанию.
notifempty Не ротировать файл лога, если он пуст. Перегружает опцию ifempty.
missingok Если файл лога отсутствует, перейти к следующему без сообщения об ошибке
nomissingok Если файл лога отсутствует, возникнет ошибка. Этот параметр установлен по умолчанию.

Опции создания нового лог-файла (после ротации старого):

create права владелец группа
create владелец группа
Указать права доступа, владельца и группу владения нового свежесоздаваемого лог-файла сразу после его создания. Как уже упоминалось, если используются опции copy и copytruncate, то create не имеет смысла, так как старый файл остается на месте, новый файл не создается. Чтобы опция create отработала, файл должен отсутствовать. Права указываются восьмеричными значениями в таком же виде, как и при использовании программы chmod. Например, 644 или 600. Если какое-то значение (права/владелец/группа) опущено, то оно будет таким же, как у оригинального файла
nocreate Новые лог-файлы не создаются. Эта опция перегружает опцию create

Добавление новых записей dkim

Разберем процесс быстрого добавления дополнительных записей dkim на примере Linux (во FreeBSD будут другие пути до файлов).

Чтобы работать было удобнее и быстрее, в консоли создадим переменную, значением которой должен быть наш домен:

DKIM_DOMAIN=domain.zone

* где вместо domain.zone ставим наш домен.

Создаем каталог для размещения ключей домена:

mkdir -p /etc/opendkim/$DKIM_DOMAIN

Генерируем ключ:

opendkim-genkey -D /etc/opendkim/$DKIM_DOMAIN/ —domain $DKIM_DOMAIN —selector relay

Задаем нужные права:

chown :opendkim /etc/opendkim/$DKIM_DOMAIN/*

chmod g+rw /etc/opendkim/$DKIM_DOMAIN/*

Смотрим содержимое файла txt:

cat /etc/opendkim/$DKIM_DOMAIN/relay.txt

… и используя данное содержимое, в панели управления нашим DNS создаем TXT-запись.

Добавляем соответствующие настройки в файлы TrustedHosts, KeyTable, SigningTable:

echo «*.$DKIM_DOMAIN» >> /etc/opendkim/TrustedHosts

echo «relay._domainkey.$DKIM_DOMAIN $DKIM_DOMAIN:relay:/etc/opendkim/$DKIM_DOMAIN/relay.private» >> /etc/opendkim/KeyTable

echo «*@$DKIM_DOMAIN relay._domainkey.$DKIM_DOMAIN» >> /etc/opendkim/SigningTable

Перезапускаем службу.

а) если Linux:

systemctl reload opendkim

б) если FreeBSD:

service milter-opendkim restart

Готово.

Отказоустойчивость

Можно настроить Action для выполнения только в случае, если предыдущее Action было приостановлено: описание. Это позволяет настраивать failover конфигурации. Некоторые Actions используют транзакции для увеличения производительности. В таком случае, успех или неудача будут известны только после завершения транзакции, когда сообщения уже обработаны. Это может приводить к потере части сообщений без вызова failover Action. Чтобы такого не происходило, надо ставить параметр (по-умолчанию 16), что может снизить производительность.

Эту возможность я пока не пробовал в продакшене.

Step 1 — Viewing Logrotate Configuration

System logs on Ubuntu 20.04 with a default configuration are maintained by the daemon. This daemon uses configuration files that specify all rotation details for each application. The configuration consist of the following parts:

  • is the most general configuration file with default setup.
  • is a directory that includes files for specific application rotation. Each such application has its own configuration file in this directory. Otherwise, application logs use general configuration.

We will view both configuration possibilities.

General Logrotate Configuration

As first, let’s view more general configuration file .

Print the content of file with utility :

The command prints the entire content of this configuration file:

The output shows the global configuration that specifies following default setup:

  • : Logs are rotated every week. Alternatively, you can specify another time interval (daily, weekly, monthly, or yearly). You can also specify to rotate every hour (hourly), but note that the logrotate daemon runs daily. In such a case, you have to change the logrotate cron job interval to be able to really rotate logs hourly.
  • : Log rotation is performed with root user and admin group.
  • : Log files are rotated 4 times before being removed. If rotate is set to 0 then old versions are removed rather than rotated.
  • : The new log file is created immediately after the rotation (with the same name as the log file just rotated).
  • : This rule determines if old log files are compressed. Since this rule is by default commented, the compression is turned off.
  • : This specifies the directory for specific application rotation configurations. You can see that it is (as we already know).

Application Specific Logrotate Configuration

Now, let’s view the directory that holds application specific logrotate configurations.

Let’s view content of directory by executing :

The command lists all files in this directory into output:

You can see that the rsyslog daemon contains its own logrotate configuration file.

Print first 15 lines of rsyslog configuration file with utility :

You’ll see the program’s output appear on the screen:

The output shows that file is rotated daily, keeps seven backups, and backups are compressed. There are also directives that we do not know yet:

  • : Don’t report any error if the log file is missing.
  • : Don’t rotate the log if it is empty.
  • : Postpone compression of the previous log file to the next rotation cycle, because it is still used by some program.
  • : The lines between and are executed after the log file is rotated.

The logrotate configuration may include various other directives. For example, you can specify that it is mailed to a specific address if the log is rotated out of existence. Or you can set up that log files are rotated when they grow bigger than the specified size of bytes. All possible directives are described in logrotate manual pages (you can also see them by executing ).

Опции, связанные с датами:

dateext Использовать в названии старых лог-файлов дату вместо номера. При использовании номера названия выглядят так: logfile.1.gz, logfile.2.gz и так далее
nodateext Не использовать дату в названиях старых лог-файлов. Эта опция перегружает опцию dateext
dateformat форматная-строка Указать форматную строку для даты, которая будет добавляться к названию лога. Форматная строка похожа на используемую в команде date, но допустимы только шаблоны %Y(четырехзначный номер года), %m(двузначный номер месяца), %d(двузначный номер дня месяца) и %s(unix time, количество секунд с 00:00 01.01.1970). Значение по умолчанию «-%Y%m%d», минус также включен в шаблон, при задании шаблона его можно упустить. Нужно отметить, что logrotate использует сортировку для определения более старых файлов, которые необходимо удалить, поэтому строка даты должна учитывать корректную сортировку. Именно поэтому вначале пишется обычно год, затем месяц и только затем день.
dateyesterday Использовать вчерашнюю дату при ротации. Таким образом, дата в названии файла будет соответствовать дате файла, который находится внутри архива

Тестирование системы

AB (Apache Benchmark) — простой инструмент тестирования нагрузки от Apache Foundation. Еще одна программа для тестирования — Siege. Также доступен инструмент на основе Python — Locust.

После установки Locust нужно будет создать файл locust в каталоге, из которого вы запускаете приложение:

from locust import HttpLocust, TaskSet, task

class UserBehavior(TaskSet):
    @task(1)
    def index(self):
        self.client.get("/")

    @task(2)
    def shop(self):
        self.client.get("/?page_id=5")

    @task(3)
    def page(self):
        self.client.get("/?page_id=2")

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    min_wait = 300
    max_wait = 3000

Затем запускаем инструмент из командной строки:

locust --host=https://my-website.com

Применение перечисленных выше средств создает эффект DDoS-атаки, поэтому рекомендуется ограничить тестирование собственными сайтами.

Опции, связанные с директориями, в которых хранятся логи:

olddir директория Директория, в которую будут перемещаться логи при ротации. Эта директория должна находиться на том же устройстве, что и ротируемый файл лога. Путь к директории можно указывать как абсолютный, так и без полного пути. Во втором случае он будет считаться поддиректорией директории, в которой хранится оригинальный файл лога. Когда эта опция указана, все старые версии логов попадают в эту директорию. Опция может быть перегружена опцией noolddir
noolddir Логи ротируются в той же директории, где находится оригинальный файл

Файлы настроек для logrotate позволяют выполнять скрипты в процессе ротации логов. Таким образом можно выполнить какие-то действия на каждом этапе ротации.

ОПЦИИ

-d
Активирует режим отладки, в котором включена и опция -v (действия программы сопровождаются выводом подробной информации). В режиме отладки файлы системных сообщений, а также файл состояния logrotate, не подвергаются изменениям со стороны утилиты.
-f, —force
Принуждает logrotate произвести обращение журналов, даже если сама программа не считает это необходимым. Иногда это полезно после добавления новых записей в logrotate или если старый файл журнала был удалён вручную; таким образом будут созданы новые файлы и журналирование будет корректно продолжено.
-m, —mail <команда>
Указывает logrotate, какую команду использовать для отправки журналов по электронной почте. Эта команда может принять два аргумента: 1) тема письма и 2) получатель. Команда должна читать сообщение со стандартного входа и отсылать его электронной почтой получателю. Командой по умолчанию является /bin/mail -s.
-s, —state <файл>
Предписывает logrotate использовать альтернативный файл состояния. Это полезно, если logrotate запускается от имени разных пользователей для разных наборов файлов системных сообщений. Файл состояния по умолчанию — /var/lib/logrotate/status.
—usage
Выводит краткую справку об использовании.
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: