Настройка мониторинга nginx, php-fpm, apache в zabbix

Создаем виртуальный хост в nginx для zabbix

У меня заббикс будет работать на отдельном виртуальном хосте. Для примера будем считать, что имя этого виртуального хоста будет zabbix.site.ru. Веб сервер уже полностью настроен по приведенной выше статье и готов к работе.

Для начала сделаю небольшую пометку. В моей статье про настройку веб сервера все виртуальные хосты описаны в основном файле конфигурации nginx.conf. Это не очень удобно, но статью уже не хочется переделывать. Сейчас мы вынесем настройки хоста для заббикса в отдельный конфигурационный файл в папку /etc/nginx/conf.d.

Для этого в файл nginx.conf в секцию с настройками http нужно добавить строку:

include  /etc/nginx/conf.d/*.conf

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

# mcedit /etc/nginx/conf.d/zabbix.conf
server {
listen 80;

root /usr/share/zabbix;
access_log /var/log/nginx/zabbix.access.log;
server_name zabbix.site.ru;

location / {
index index.php index.html index.htm;
}

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param PHP_VALUE "
max_execution_time = 300
memory_limit = 128M
post_max_size = 16M
upload_max_filesize = 2M
max_input_time = 300
date.timezone = Europe/Moscow
always_populate_raw_post_data = -1
";
fastcgi_buffers 8 256k;
fastcgi_buffer_size 128k;
fastcgi_intercept_errors on;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}

Обращаю внимание, что у меня nginx работает с php-fpm через сокет. Если у вас по tcp порту, то ставьте

fastcgi_pass 127.0.0.1:9000;

Сохраняете файл и проверяете конфигурацию на ошибки:

# nginx -t

Если все ОК, то дальше можно приступать к установке zabbix 3.0 как рассказано у меня в статье. Все этапы в точности совпадают, кроме настройки httpd. Его можно не ставить, пропустить все, что его касается. Параметры для php мы уже задали в свойствах виртуального хоста.

Тюнинг веб-сервера

PHP

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

vi /etc/php/7.4/apache2/php.ini

И правим следующее:

post_max_size = 1G

upload_max_filesize = 512M

short_open_tag = On

date.timezone = «Europe/Moscow»

* где post_max_size — максимальный объем отправляемых на сервер данных; upload_max_filesize — максимально допустимый размер одного загружаемого файла; short_open_tag — разрешение использования короткого способа открытия php (<?); date.timezone — временная зона, которая будет использоваться веб-сервером, если ее не переопределить настройками в коде php или в файле .htaccess.

Теже настройки применяем для php-fpm:

vi /etc/php/7.4/fpm/php.ini

post_max_size = 1G

upload_max_filesize = 512M

short_open_tag = On

date.timezone = «Europe/Moscow»

Перезапускаем php-fpm и apache:

systemctl restart php7.4-fpm

systemctl restart apache2

NGINX

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

vi /etc/nginx/nginx.conf

И внутри секции http добавляем:

client_max_body_size 512M;

После перезапускаем nginx:

systemctl restart nginx

Шаг 9 — Создание тестового оповещения

На этом шаге вы сгенерируете тестовое оповещение, чтобы убедиться, что все подключено. По умолчанию Zabbix отслеживает объем свободного места на диске на вашем сервере. Он автоматически обнаруживает все установки диска и добавляет соответствующие проверки. Это обнаружение выполняется каждый час, поэтому необходимо немного подождать, чтобы сработало уведомление.

Создайте временный файл, чтобы он был достаточно большим, чтобы сработало оповещение об использовании файловой системы Для этого войдите на второй сервер Ubuntu, если вы еще не подключены:

Затем определите, сколько есть свободного места на сервере. Чтобы выяснить это, можно использовать команду ​​​:

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

В этом случае свободное пространство составляет 77G. Ваше свободное пространство может отличаться.

Используйте команду , которая позволяет предварительно распределять или освобождать пространство для файла или создавать файл, который занимает более 80 % имеющегося пространства на диске. Этого будет достаточно, чтобы сработало оповещение:

Приблизительно через час Zabbix активирует оповещение об объеме свободного пространства на диске и запустит действие, которое вы настроили, чтобы отправить сообщение с уведомлением. Вы можете проверить входящие на наличие сообщения с сервера Zabbix. Сообщение может выглядеть следующим образом:

Также вы можете перейти на вкладку Monitoring (Мониторинг), а затем на Dashboard​​​ (Панель управления), чтобы увидеть уведомление и детали.

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

Через одну минуту Zabbix отправит сообщение и оповещение исчезнет с главной панели управления.

1: Настройка php-fpm

Если вы выполнили все предварительные требования, на вашем сервере уже есть рабочий веб-сайт. Если у вас нет FQDN, вы можете получить доступ к нему по FQDN localhost локально или по IP-адресу сервера удаленно.

Теперь создайте второй сайт (site1.example.org) со своим собственным пулом php-fpm и пользователем Linux.

Для начала нужно создать пользователя. Для лучшей изоляции новый пользователь должен иметь свою собственную группу. Поэтому сначала создайте группу site1:

Затем создайте пользователя site1, который будет входить в эту группу.

На данный момент пользователь site1 не имеет пароля и не может входить на сервер. Если вам нужно предоставить кому-то доступ к сайту через этого пользователя, создайте для него пароль с помощью команды:

Теперь пользователь может удаленно войти в систему через ssh или sftp.

Затем создайте новый пул php-fpm для site1. Пул php-fpm – это по сути обычный Linux-процесс, который работает под определенным пользователем/группой и прослушивает сокет Linux. Он также может прослушивать комбинацию IP:порт, но для этого потребуется больше ресурсов сервера, и это не самый предпочтительный метод.

По умолчанию в Ubuntu 14.04 каждый пул php-fpm настраивается в файле внутри каталога /etc/php5/fpm/pool.d. Каждый файл с расширением .conf в этом каталоге автоматически загружается в глобальную конфигурацию php-fpm.

Итак, для нового сайта нужно создать файл /etc/php5/fpm/pool.d/site1.conf. Вы можете сделать это с помощью редактора:

В файле должны быть такие параметры:

В приведенной выше конфигурации обратите внимание на следующие параметры:

  • – имя пула. Каждый пул должен иметь уникальное имя.
  • user и group – пользователь и группа Linux, в которой будет запущен новый пул.
  • listen – уникальное местоположение каждого пула.
  • listen.owner и listen.group определяют сокет нового пула php-fpm. Nginx должен иметь возможность читать этот сокет. Потому в сокете указываются пользователь и группа, через которые работает nginx (www-data).
  • php_admin_value позволяет настраивать пользовательские параметры php. Здесь эта строка используется для отключения функций, которые могут запускать команды Linux – exec, passthru, shell_exec, system.
  • php_admin_flag аналогичен параметру php_admin_value, но поддерживает только логические значения on и off. Отключите с его помощью функцию allow_url_fopen, которая позволяет сценариям PHP открывать удаленные файлы и может использоваться злоумышленниками.

Примечание: Вышеупомянутые значения php_admin_value и php_admin_flag также могут применяться глобально. Однако сайту они могут не понадобиться, поэтому по умолчанию они не настроены. преимущество пулов php-fpm заключается в том, что они позволяют точно настраивать индивидуальные параметры безопасности для каждого сайта. Кроме того, эти параметры могут использоваться с другими параметрами php для дальнейшей настройки среды сайта.

Параметры pm подробно рассматриваться здесь не будут, но вы должны знать, что они позволяют настраивать производительность пула.

Параметр chdir должен иметь значение /, что определяет корень файловой системы. Это значение не нужно изменять, если вы не используете другой важный параметр chroot.

Параметр chroot не включен в указанную выше конфигурацию. Это позволит вам запускать пул в закрытой среде, то есть заблокировать его внутри одного каталога. Это отлично подходит для настройки безопасности, поскольку вы можете заблокировать пул внутри корневого каталога веб-сайта. Однако такая настройка вызовет серьезные проблемы для любого PHP-приложения, которое использует системные бинарные файлы и приложения – они не будут доступны.

Перезапустите php-fpm, чтобы обновить параметры:

Убедитесь, что новый пул запущен правильно, запросив его процессы:

Если вы точно следовали инструкциям, вы должны увидеть такой результат:

Красным выделен пользователь, через которого запущен процесс или пул php-fpm.

Кроме того, нужно отключить кэширование php по умолчанию, предоставляемое opcache. Это расширение кэширования может улучшить производительность, но не безопасность, как вы убедитесь позже. Чтобы отключить его, отредактируйте файл /etc/php5/fpm/conf.d/05-opcache.ini с привилегиями суперпользователя и добавьте строку:

После этого перезапустите php-fpm.

Подготовка nginx к мониторингу

Я планирую мониторить следующие параметры nginx:

accepts per second Число принятых соединений в секунду
active connections Текущие активные соединения
handled per second Число обработанных соединений в секунду
latency Время ответа сервера в миллисекундах
memory allocated Занимаемая память
process count Число запущенных процессов
reading state connection count Текущее число соединений, в которых nginx в настоящий момент читает заголовок запроса
requests per second Число запросов в секунду
waiting state connection count Текущее число бездействующих соединений в ожидании запроса
writing state connection count Текущее число соединений, в которых nginx в настоящий момент отвечает
memory allocated Сколько памяти занимают все worker process

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

Я обычно добавляю в самый конец основного конфига nginx.conf. Сохраняем и перечитываем конфигурацию, перед этим проверив его конфиг на ошибки:

Проверяем, можем ли мы получить необходимую информацию для настройки мониторинга:

Теперь проверим, сможет ли zabbix получать эту страницу.

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

Сразу обращаю внимание на один важный момент, на котором я застрял на приличное время. Через curl я без проблем забирал страничку со статусом nginx, а вот через zabbix никак не получалось

Была ошибка:

Я всю голову сломал, 10 раз перепроверил конфиги, никак не мог понять, почему не работает. Оказалось, дело было вот в чем. Zabbix-agent обращался к серверу Nginx по протоколу ipv6. Это при том, что как агент, так и nginx работали по ipv4. Я принудительно отключаю у служб ipv6, если он не используется.

Обнаружил это случайно, когда от безысходности запустил Nginx на всех интерфейсах и снял ограничения allow/deny в конфиге. Тогда запрос прошел нормально. Я посмотрел access лог и увидел, что zabbix-agent обращается с адреса ::1. И все стало ясно. Я так и не понял, как заставить агента ходить по ipv4. В итоге запустил nginx на обоих протоколах и разрешил забирать страницу статуса с адреса ::1. После этого заработало.

Самое неприятное в этой ситуации было то, что в логах нигде не было никаких ошибок, отклоненных запросов или чего-то еще, что могло бы дать зацепку. Zabbix agent просто писал, что подключение отклонено и все. О том, что он обращается по ipv6, не было никакого намека.

2. Настройка Nginx

Первым делом следует рассмотреть структуру конфигурационного файла. На первый взгляд, тут все может показаться очень запутанным, но там все достаточно логично:

Сначала идут глобальные опции, которые задают основные параметры программы, например, от какого пользователя она будет запущена и количество процессов. Дальше есть секция events, в которой описано как Nginx будет реагировать на входящие подключения, затем идет секция http, которая объединяет все настройки касаемо работы протокола http

В ней находится секция server, каждая такая секция отвечает за отдельный домен, в секции server размещаются секции location, каждая из которых отвечает за определенный URL запроса, обратите внимание, что не файл на сервере, как в Apache, а именно URL запроса

Основные глобальные настройки мы будем делать в файле /etc/nginx/nginx.conf. Дальше рассмотрим что именно будем менять и какие значения желательно установить. Начнем с глобальных опций:

  • user — пользователь, от имени которого будет запущен сервер, должен быть владельцем каталога с файлами сайта, и от имени его же нужно запускать php-fpm;
  • worker_processes — количество процессов Nginx, которые будут запущены, нужно установить ровно столько, сколько у вас есть ядер, например, у меня — 4;
  • worker_cpu_affinity — этот параметр позволяет закрепить каждый процесс за отдельным ядром процессора, установите значение auto, чтобы программа сама выбрала что и к чему крепить;
  • worker_rlimit_nofile — максимальное количество файлов, которые может открыть программа, на каждое соединение нужно как минимум два файла и каждый процесс будет иметь указанное вами количество соединений, поэтому формула такая: worker_processes * worker_connections* 2, параметр worker_connections разберем чуть ниже;
  • pcre_jit — включите этот параметр для ускорения обработки регулярных выражений с помощью JIT компиляции;

В секции events стоит настроить два параметра:

worker_connections — количество соединений для одного процесса, должно быть достаточным для обработки входящих соединений. Сначала нам нужно знать сколько этих входящих соединений есть, для этого смотрим статистику по адресу ip_сервера/nginx_status. Как включить рассмотрим ниже. В строке Active Connections видим количество активных соединений с сервером, также нужно учесть что соединения с php-fpm тоже считаются

Дальше обратите внимание на поля accepted и handled, первое отображает обработанных подключений, второе — количество принятых. Из значения должны быть одинаковыми

Если отличаются значит соединений не хватает. Смотрите примеры, первый снимок проблема, второй — порядок. Для моей конфигурации оптимальной может быть цифра в 200 соединений (всего 800, учитывая 4 процесса):

  • multi_accept — позволяет программе принимать несколько соединений одновременно, тоже ускоряет работу, при большом количестве соединений;
  • accept_mutex — установите значение этого параметра в off, чтобы сразу все процессы получали уведомление про новые соединения;

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

  • sendfile — использовать метод отправки данных sendfile. Самый эффективный метод для Linux.
  • tcp_nodelay, tcp_nopush — отправляет заголовки и тело запроса одним пакетом, работает немного быстрее;
  • keepalive_timeout — таймаут поддержания соединения с клиентом, если у вас нет очень медленных скриптов, то будет достаточно будет 10 секунд, устанавливаем значение сколько нужно чтобы пользователь мог быть подключен к серверу;
  • reset_timedout_connection — разрывать соединения после таймаута.
  • open_file_cache — кэшировать информацию об открытых файлах. Например, open_file_cache max=200000 inactive=120s; max — максимальное количество файлов в кэше, время кэширования.
  • open_file_cache_valid — когда нужно проверить актуальность файлов. Например: open_file_cache_valid 120s;
  • open_file_cache_min_uses — кэшировать только файлы, которые были открыты указанное количество раз;
  • open_file_cache_errors — запоминать ошибки открытия файлов.
  • if_modified_since — устанавливает каким образом будут обрабатываться заголовки if-modified-since. С помощью этого заголовка браузер может получить ответ 304 если страница не изменилась с момента последнего просмотра. Возможны варианты — не отправлять — off, отправлять при точном совпадении времени — exact, отправлять если время совпадает точно или больше — before;

Вот как-то так будет выглядеть настройка nginx conf:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

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