Меню

Zabbix nginx мониторинг 500 ошибок

<?xml version=«1.0« encoding=«UTF-8«?> <zabbix_export> <version>3.2</version> <date>2018-06-18T18:43:50Z</date> <groups> <group> <name>!Templates</name> </group> </groups> <templates> <template> <template>nginx lua status</template> <name>nginx lua status</name> <description/> <groups> <group> <name>!Templates</name> </group> </groups> <applications> <application> <name>Nginx</name> </application> </applications> <items> <item> <name>nginx http code 200</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http200</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx http code 401</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http401</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx http code 403</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http403</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx http code 404</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http404</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx http code 500</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http500</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx http code 501</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http501</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx http code 502</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http502</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx http code 503</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http503</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>nginx http code 504</name> <type>2</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>http504</key> <delay>0</delay> <history>30</history> <trends>60</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>2</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Nginx</name> </application> </applications> <valuemap/> <logtimefmt/> </item> </items> <discovery_rules/> <httptests/> <macros/> <templates/> <screens/> </template> </templates> <graphs> <graph> <name>Nginx http status codes</name> <width>900</width> <height>200</height> <yaxismin>0.0000</yaxismin> <yaxismax>100.0000</yaxismax> <show_work_period>1</show_work_period> <show_triggers>1</show_triggers> <type>0</type> <show_legend>1</show_legend> <show_3d>0</show_3d> <percent_left>0.0000</percent_left> <percent_right>0.0000</percent_right> <ymin_type_1>0</ymin_type_1> <ymax_type_1>0</ymax_type_1> <ymin_item_1>0</ymin_item_1> <ymax_item_1>0</ymax_item_1> <graph_items> <graph_item> <sortorder>0</sortorder> <drawtype>0</drawtype> <color>1A7C11</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http200</key> </item> </graph_item> <graph_item> <sortorder>1</sortorder> <drawtype>0</drawtype> <color>F63100</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http401</key> </item> </graph_item> <graph_item> <sortorder>2</sortorder> <drawtype>0</drawtype> <color>2774A4</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http403</key> </item> </graph_item> <graph_item> <sortorder>3</sortorder> <drawtype>0</drawtype> <color>A54F10</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http404</key> </item> </graph_item> <graph_item> <sortorder>4</sortorder> <drawtype>0</drawtype> <color>FC6EA3</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http500</key> </item> </graph_item> <graph_item> <sortorder>5</sortorder> <drawtype>0</drawtype> <color>6C59DC</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http501</key> </item> </graph_item> <graph_item> <sortorder>6</sortorder> <drawtype>0</drawtype> <color>AC8C14</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http502</key> </item> </graph_item> <graph_item> <sortorder>7</sortorder> <drawtype>0</drawtype> <color>611F27</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http503</key> </item> </graph_item> <graph_item> <sortorder>8</sortorder> <drawtype>0</drawtype> <color>F230E0</color> <yaxisside>0</yaxisside> <calc_fnc>4</calc_fnc> <type>0</type> <item> <host>nginx lua status</host> <key>http504</key> </item> </graph_item> </graph_items> </graph> </graphs> </zabbix_export>

Мониторинг является неотъемлимой частью любого современного бизнес процесса. При этом выполняется постоянное наблюдение за системой и в случае отклонения от некоторого установленного состояния имеется возможность мгновенного реагирования а иногда и автоматического устранения неисправности. Мониторинг компьютерных систем является сложнейшей задачей в виду огромного разнообразия сервисов, служб и параметров проверки. Поиски решения, которое максимально охватило бы все аспекты мониторинга привели меня к 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 получим ошибку о нехватке ресурсов
error
Я правлю примерно так. Можно использовать текстовый редактор

# 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 дней. Рекомендуется установить реально необходимые сроки хранения истории.
housekeeper
Установив даже самые короткие сроки информации будет много. По-этому рекомендуется рулить данные и средствами СУБД, а именно добавить параметр 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

Log File Monitoring - Nginx Proxy HTTP Status Codes
Log File Monitoring - Nginx Proxy HTTP Status Codes
Log File Monitoring - Nginx Proxy HTTP Status Codes

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

Cheng's user avatar

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

Razique's user avatar

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 Abate's user avatar

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

user164485's user avatar

user164485user164485

511 silver badge6 bronze badges

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Zabbix agent windows ошибка 1067
  • Z18xer пропала тяга ошибок нет