Мониторинг является неотъемлимой частью любого современного бизнес процесса. При этом выполняется постоянное наблюдение за системой и в случае отклонения от некоторого установленного состояния имеется возможность мгновенного реагирования а иногда и автоматического устранения неисправности. Мониторинг компьютерных систем является сложнейшей задачей в виду огромного разнообразия сервисов, служб и параметров проверки. Поиски решения, которое максимально охватило бы все аспекты мониторинга привели меня к Zabbix. Это реализация клиент-серверной архитектуры с очень гибкими параметрами конфигурации как серверной так и клиентской части, что позволяет мониторить что и как угодно.
Со времён моего первого знакомства с этой системой прошло немало времени и zabbix превратился из просто хорошей в абсолютную систему. И тем не менее проект развивается.
В данном случае у меня имеется новенький сервер с только что установленной операционной системой CentOS 7 и самыми последними обновлениями. Zabbix имеет клиентскую часть, серверную часть и web-интерфейс управления системой. Все настройки и аналитические данные хранятся в базе данных(MySQL, PostgreSQL и т.д.) что добавляет удобства в поддержке, обновлении и переносе системы. Следовательно для полноценной работы сервиса нам потребуется настроить WEB-сервер и сервер баз данных(в данном случае MySQL).
Установка Nginx с официального репозитория
# vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1
Так же для некоторых компонентов нам понадобится дополнительный репозиторий EPEL (Extra Packages for Enterprise Linux)
# yum install epel-release # yum install nginx # systemctl enable nginx # systemctl start nginx # yum install php-fpm phpmyadmin
На всякий случай устанавливаю и phpMyAdmin. Он тянет некоторые модули php, которые лишними точно не будут
По умолчанию менеджер процессов FastCGI запускается на 9000 порту. Я обычно изменяю эту настройку на использование доменных сокетов. Так шустрее и безопаснее.
# vim /etc/php-fpm.d/www.conf ;listen = 127.0.0.1:9000 listen = /var/run/php-fpm/php-fpm.sock
Забегая наперёд скажу, что нужно отредактировать некоторые параметры php. Если этого не сделать, то при установке веб-интерфейса Zabbix получим ошибку о нехватке ресурсов
Я правлю примерно так. Можно использовать текстовый редактор
# sed -i 's/^post_max_size.*/post_max_size=16M/' /etc/php.ini # sed -i 's/^max_execution_time.*/max_execution_time=300/' /etc/php.ini # sed -i 's/^max_input_time.*/max_input_time=300/' /etc/php.ini # sed -i "s/^;date.timezone.*/date.timezone='Europe/Kiev'/" /etc/php.ini # systemctl enable php-fpm # systemctl start php-fpm
Ни для кого не секрет, что CentOS 7 претерпела серьёзных изменений. Вплоть до того, что теперь нельзя установить mysql-server. Вместо него теперь устанавливается mariadb-server.
Как заявляет разработчик MariaDB существенно лучше обычного MySQL и вот чем именно:
— Еще больше механизмов хранения данных
— Улучшенная производительность
— Расширения и новые возможности
— Улучшенное тестирование
— Меньше предупреждений и ошибок
— Настоящий Open Source
Не берусь комментировать, время покажет 🙂 Просто верим и просто устанавливаем:
# yum install mariadb mariadb-server
Работая некоторое время с заббиксом я узнал определённые нюансы, от которых попытаюсь Вас убереч
Хаускипер.
Камень преткновения Zabbix, если вовремя не обратить на него внимание.
Очистка истории (Housekeeper) — периодический процесс, выполняемый Zabbix сервером. Этот процесс удаляет устаревшую информацию и информацию удаленную пользователем. Так же историю хранимых действий и событий.
Zabbix сервер каждую минуту получает информацию о состоянии агента всех наблюдаемых серверов. В том числе о состоянии сервисов на каждом из хостов. Это довольно большой объём информации. При этом хранится информация за 365 дней. Рекомендуется установить реально необходимые сроки хранения истории.
Установив даже самые короткие сроки информации будет много. По-этому рекомендуется рулить данные и средствами СУБД, а именно добавить параметр innodb_file_per_table. При добавления таблицы с механизмом InnoDB сервер MySQL будет создавать для неё отдельный файл .ibd для хранения данных и индексов
Это глобальный параметр и его нельзя просто сменить на уже работающем сервере. Для этого потребуется ещё ряд действий.
Добавим следующие строки в конфигурационный файл в секцию [mysqld]
# vim /etc/my.cnf [mysqld] innodb_file_per_table=1 innodb_flush_method=O_DIRECT innodb_log_file_size=1G innodb_buffer_pool_size=4G #(Устанавливается порядка 60-70 % от общей оперативной памяти) innodb_strict_mode = 0
Сохраняем и запускаем в режиме безопасной установки:
# systemctl enable mariadb # systemctl start mariadb # mysql_secure_installation Enter current password for root (enter for none): OK, successfully used password, moving on... Set root password? [Y/n] y New password: Re-enter new password: Password updated successfully! Remove anonymous users? [Y/n] y ... Success! Disallow root login remotely? [Y/n] y ... Success! Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reload privilege tables now? [Y/n] y ... Success! Thanks for using MariaDB!
Что бы далеко не ходить сразу создадим БД, пользователя и доступ для zabbix.
Что бы русский язык корректно отображался кодировку по умолчанию ставлю UTF-8
# mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 11 Server version: 5.5.41-MariaDB MariaDB Server Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. MariaDB [(none)]> CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_general_ci; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by '$ecur3Z@bb!xp@$S'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> q Bye
Подготовительные работы окончены. Дальше сам Zabbix. Для получения самых свежих пакетов можно установить релиз или добавить репозиторий вручную:
# yum localinstall http://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm # yum install php-pecl-mysql.x86_64 # yum -y install zabbix-server-mysql zabbix-agent zabbix-web-mysql
После установки необходимо создать структуру базы данных вручную имтортировав структуру и метаданные:
# zcat /usr/share/doc/zabbix-server-mysql-4.4.1/create.sql.gz | mysql -uzabbix -p zabbix Enter password:
Последний шаг — настройка веб сервера:
# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name zabbix.tradenark.com.ua www.zabbix.tradenark.com.ua;
root /usr/share/zabbix;
location / {
root /usr/share/zabbix;
index index.php index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ .php$ {
#root html;
fastcgi_buffer_size 32k;
fastcgi_buffers 4 32k;
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
проверяем правила и перечитываем их:
# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # nginx -s reload
Перед установкой необходимо так же выставить необходимые права на запись
chown -R nginx:nginx /etc/zabbix/web/
Переходим к установке веб интерфейса
1) Приветствие
2) Проверка системных требований
3) Установка соединения с сервером БД MySQL
4) Имя и порт сервера
5) Итоговая информация
6) Сообщение об успешной установке
И теперь укажем в конфигурационном файле zabbix-сервера параметры соединения с БД
# sed -i 's/^# DBPassword=.*/DBPassword=$ecur3Z@bb!xp@$S/' /etc/zabbix/zabbix_server.conf
Добавим сервисы в автозагрузку и запустим их:
# systemctl enable zabbix-server ln -s '/usr/lib/systemd/system/zabbix-server.service' '/etc/systemd/system/multi-user.target.wants/zabbix-server.service' # systemctl enable zabbix-agent ln -s '/usr/lib/systemd/system/zabbix-agent.service' '/etc/systemd/system/multi-user.target.wants/zabbix-agent.service' # systemctl start zabbix-agent.service # systemctl start zabbix-server.service
Можно заходить на веб интерфейс с логином admin(Admin с заглавной буквы тоже подходит) и паролем zabbix

Естественно, первым делом устанавливаем свой пароль
UPD1:
Если получаем ошибку типа
Cannot display item queue. Connection to Zabbix server "localhost" failed. Possible reasons: 1. Incorrect server IP/DNS in the "zabbix.conf.php"; 2. Incorrect DNS server configuration. Permission denied
То скорее всего необходимо отключить SELinux
# setenforce 0
Это до первой перезагрузки
Что бы отключить SELinux перманентно нужно в файле /etc/selinux/config исправить
SELINUX=enforcing
на
SELINUX=disabled

access log сайта расположен в /var/log/nginx/newsite_com_ssl_access.log
Пользователь zabbix от которого запущен агент Zabbix не имеет прав доступа на чтение лога.
Доступ к лог-файлам в директории /var/log/nginx имеет владелец www-data и группа adm. Проверить можно командой:
ls -l /var/log/nginx/
Для возможности чтения логов nginx, добавим пользователя zabbix в группу adm:
usermod -aG adm zabbix
После изменений прав доступа пользователя zabbix, необходимо перезапустить агент Zabbix:
systemctl restart zabbix-agent
Проверяем изменения, получаем последние записи лог-файла от имени пользователя zabbix:
sudo -u zabbix bash -c 'tail -f /var/log/nginx/newsite_com_ssl_access.log'
Далее создадим элемент данных в Zabbix:
| Key | Value |
|---|---|
| Name | HTTP Status Codes |
| Type | Zabbix (active) |
| Key | log[/var/log/nginx/newsite_com_ssl_access.log,"^(S+) (S+) (S+) [([w:/]+s[+-]d{4})] "(S+)s?(S+)?s?(S+)?" (d{3}|-)",,,,8,,] |
| Type of Information | numeric (unsigned) |
| Update Interval | 1m |
Регулярное выражение: ^(S+) (S+) (S+) [([w:/]+s[+-]d{4})] "(S+)s?(S+)?s?(S+)?" (d{3}|-) (d+|-)s?"?([^"]*)"?s?"?([^"]*)" разбивает каждую строку лога на несколько групп. Код состояния HTTP находится в 8-й группе.
Второй вариант получения статус-кодов HTTP с помощью скрипта на bash:
vi /opt/get_response_http_codes.sh
#!/bin/bash
tail -n 1 /var/log/nginx/newsite_com_ssl_access.log | awk '{print $9}'
Меняем владельца скрипта и предоставляем права на выполнение:
chown zabbix /opt/get_response_http_codes.sh
chmod u+x /opt/get_response_http_codes.sh
Разрешаем выполнение удаленных команд агенту Zabbix:
vi /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1
После внесенных изменений, необходимо перезапустить агент Zabbix:
systemctl restart zabbix-agent
Далее создадим элемент данных в Zabbix:
| Key | Value |
|---|---|
| Name | HTTP Status Codes |
| Type | Zabbix agent |
| Key | system.run[sh /opt/get_response_http_codes.sh] |
| Type of Information | numeric (unsigned) |
| Update Interval | 1m |
Video Lecture



Description
Monitoring Log Files — HTTP Status Codes of a Nginx Proxy
If you don’t have an existing Nginx server that you can read the logs for, then you can install one.
Debian/Ubuntu
CentOS 8
The file I monitor is located at /var/log/nginx/access.log
The default Zabbix user that the Zabbix agent user uses, does not have read access to many log files on the system.
You can usually add the zabbix user to a group to solve this problem.
The nginx access.log file can be read by the www-data or adm groups on Ubuntu, so I add the Zabbix user to the adm group.
To find out which groups a log file can be read by, for example, I typed,
This tells me that the access.log file can be read by www-data and adm groups.
Then I check which groups the user Zabbix is part of,
If it’s not part of either group already, I then add it,
sudo usermod -a -G adm zabbix
and check again to confirm.
After changing the Zabbix users permissions, you will need to restart the Zabbix agent.
sudo service zabbix-agent restart
I can read the most recent log file entries by typing
tail -f /var/log/nginx/access.log
You can also check this command works when using the Zabbix user,
sudo -H -u zabbix bash -c 'tail -f /var/log/nginx/access.log'
I then created an item for the host, with settings
| Property | Value |
|---|---|
| Name | HTTP Status Codes |
| Type | Zabbix (active) |
| Key | log[/var/log/nginx/access.log,"^(S+) (S+) (S+) [([w:/]+s[+-]d{4})] "(S+)s?(S+)?s?(S+)?" (d{3}|-) (d+|-)s?"?([^"]*)"?s?"?([^"]*)"",,,skip,8,,,] |
| Type of Information | numeric (unsigned) |
| Update Interval | 1m |
The regex value that I copy into https://regex101.com is
^(S+) (S+) (S+) [([w:/]+s[+-]d{4})] "(S+)s?(S+)?s?(S+)?" (d{3}|-) (d+|-)s?"?([^"]*)"?s?"?([^"]*)"
This regex can separate the values for both Nginx and Apache access logs.
The regex splits each row of the log into several groups.
The HTTP Status code is in the 8th group.
I can also create triggers to notify on
- 101 Switching Protocols
- 301 Moved Permanently
- 302 Redirect
- 304 not modified
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
- 404 Not found
- 405 Method Not Allowed
- 500 Server Error
In this video I demonstrate creating triggers for HTTP 5XX errors and use count to detect 10 or more HTTP 404 Errors in 10 minutes.
How and whether you decide to trigger on HTTP status codes is up to you.
The video just provides examples for you to follow.
Note
If you installed Zabbix like I did on Ubuntu 20.04 with the default Apache server, there also are Apache logs at /var/log/apache2/ on the Zabbix server that you can use for this lesson.
You can tail them in the command prompt using
tail -f /var/log/apache2/access.log
This is a good source of http logs of you don’t already have an active webserver somewhere that you can use, or you don’t want to set one up.
Apache and Nginx logs follow the same format so my regex in the video will still work.
Useful Links
Zabbix Agent Items
List of HTTP status codes
How to let the admin get noticed when 500 errors occurred in nginx?
asked Jan 21, 2010 at 5:12
ChengCheng
7212 gold badges9 silver badges16 bronze badges
3
maybe you could do something with a bash script, like
#!/bin/bash
b=`grep 'error' -c /var/log/nginx.log`
if [[ $b -gt 500 ]] ; then
echo "more than 500 errors";
# or send an email
else
#echo "OK" > /dev/null 2>&1
fi
answered Jan 21, 2010 at 10:05
![]()
RaziqueRazique
2,2661 gold badge19 silver badges23 bronze badges
3
Most monitoring systems, whether they’re software you install like Nagios or Zabbix or monitoring services such as Panopta or Pingdom, can be configured to detect 500 responses as errors and alert you to investigate. The benefit of using a full monitoring system is that you can get SMS or voice alerts in addition to just emails. You can also get notified if the server itself goes down or loses all connectivity, which a local cron script wouldn’t be able to handle.
answered Jan 21, 2010 at 23:32
Jason AbateJason Abate
4414 silver badges3 bronze badges
1
No matter you use scripts or monitoring systems.
You can used «curl» to check the http status code.
answered May 22, 2014 at 6:38
user164485user164485
511 silver badge6 bronze badges