Введение
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
- Установка CentOS 8.
- Настройка CentOS 8.
- Установка и настройка zabbix сервера.
То же самое на Debian 10, если предпочитаете его:
- Установка Debian 10.
- Базовая настройка Debian.
- Установка и настройка zabbix на debian.
Я буду в своем примере настраивать все на CentOS 7, но в данном случае дистрибутив не имеет принципиального значения, все так же настраивается и на других linux системах с учетом их особенностей в установке пакетов и путей для конфигов и программ.
Мы будем использовать в качестве источника информации штатные возможности nginx, apache и php-fpm, затем передавать данные в zabbix сервер и там анализировать. Я подразумеваю, что nginx или apache вы уже настроили и имеете некое представление о работе его компонентов, поэтому некоторые вещи я не разжевываю, а просто говорю, что делать.
Что такое Monit
Monit — это система мониторинга за службами в Linux (Debian, Ubuntu, CentOS). Есть дистрибутивы под BSD (FreeBSD, OpenBSD), а также OS X и Solaris.
Возможности:
- Слежение за работоспособностью и доступностью MySQL, NGINX и другими подобными службами;
- При сбое в работе одного из подопечных (их недоступности) monit может, в зависимости от настроек, уведомить о проблеме по email и попытаться восстановить их работоспособность.
- Определение, что какая-служба (например, Apache) потребляет слишком много ресурсов (скажем, при DoS-атаке), и остановить или перезапустить эту службу, уведомив при этом администратора по email.
- Контроль за характеристиками процесса: сколько оперативной памяти или циклов процессора используется
- Вы можете использовать Monit для мониторинга процессов демона или аналогичных программ, запущенных на localhost. Monit особенно полезен для мониторинга процессов демона, например, запущенных при загрузке системы из / etc / init / Например sendmail, sshd, apache и mysql.
- Вы также можете использовать Монит для мониторинга файлов, каталогов и файловых систем на локальном хосте. Монит может контролировать эти элементы для изменений, таких как изменения временных меток, изменения контрольной суммы или изменения размера. Это также полезно по соображениям безопасности — вы можете контролировать контрольную сумму md5 или sha1, которые не должны меняться, получать предупреждение или выполнять действие, если они должны измениться.
- Контролируйте сетевые подключения к различным серверам, либо на локальном хосте, либо на удаленных хостах. Поддерживаются порты TCP, UDP и Unix. Сетевые тесты могут выполняться на уровне протокола; Монит имеет встроенные тесты для основных интернет-протоколов, таких как HTTP, SMTP и т.д. Даже если протокол не поддерживается, вы все равно можете протестировать сервер, так как вы можете настроить Monit для отправки любых данных и проверки ответа с сервера.
- Monit можно использовать для тестирования программ или сценариев в определенное время, например, cron, но, кроме того, вы можете проверить значение выхода программы и выполнить действие или отправить предупреждение, если значение выхода указывает на ошибку. Это означает, что вы можете использовать Monit для выполнения любого типа проверки, для которого вы можете написать сценарий.
- Наконец, Monit можно использовать для мониторинга общих системных ресурсов на локальном хосте, таких как общее использование процессора, оперативной памяти и Load Average.
На мой взгляд, самое важное для вебмастера, что может Monit — это обеспечение бесперебойной работы вебсервера (NGINX, MySQL, PHP-FPM). Эту систему и настроим далее
Для работы с консолью SSH используется Far Manager или putty
Тестирование системы
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-атаки, поэтому рекомендуется ограничить тестирование собственными сайтами.
Настройка Monit в Debian 9
После установки Monit создаётся каталог
- conf.d
- Тут располагаются рабочие файлы конфигурации
- conf-available
- Это директория содержит шаблоны файлов конфигурации
- conf-enabled
- Тут также могут располагаться рабочие файлы конфигурации
- templates
- Шаблоны для работы (оставляем как есть)
- monitrc
- Основной файл конфигурации
Нас интересуют NGINX, MySQL, PHP-FPM
Включаем монитор NGINX:
cp /etc/monit/conf-available/nginx /etc/monit/conf-enabled/nginx
Также включаем монитор MySQL:
cp /etc/monit/conf-available/mysql /etc/monit/conf-enabled/mysql
Как включить монитор — смотрите далее
После перезагружаем Monit
service monit restart
Установка phpmyadmin на web сервер Freebsd
# cd /usr/ports/databases/phpmyadmin # make install clean
Перемещаем файлы из установочной директории по-умолчанию в наш поддомен pma.site1.ru:
# mv /usr/local/www/phpMyAdmin/* /web/sites/pma.site1.ru/www # mv /usr/local/www/phpMyAdmin/.* /web/sites/pma.site1.ru/www
Меняем владельца:
# chown -R www:www /web/sites/pma.site1.ru/www
Настраиваем DNS записи на pma.site1.ru или просто добавляем в винде в файл hosts строку
192.168.1.21 pma.site1.ru
И заходим по адресу http://pma.site1.ru
У вас должно открыться окно приветствия phpmyadmin. Вводим сюда пользователя и пароль root, которые мы задали в самом начале настройки и попадаем в панель управления базами.
На этом настройка web сервера на базе Freebsd 10.1 и связки nginx + php-fpm закончена.
Just for Handy Use – Putting together
php-fpm.conf – php-fpm configuration 101
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10
events.mechanism = epoll
1 |
emergency_restart_threshold=10 emergency_restart_interval=1m process_control_timeout=10 events.mechanism=epoll |
Pool config (www.conf) – php-fpm configuration 101
listen = 127.0.0.1:9000
listen.backlog = -1
pm = dynamic
pm.max_children = 9
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 10000
request_slowlog_timeout = 5s
slowlog = /var/log/$pool.log.slow
request_terminate_timeout = 300s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env = $HOSTNAME
env = /tmp
env = /tmp
env = /tmp
1 |
listen=127.0.0.19000 listen.backlog=-1 pm=dynamic pm.max_children=9 pm.start_servers=3 pm.min_spare_servers=2 pm.max_spare_servers=4 pm.max_requests=10000 request_slowlog_timeout=5s slowlog=/var/log/$pool.log.slow request_terminate_timeout=300s rlimit_files=131072 rlimit_core=unlimited catch_workers_output=yes env=$HOSTNAME env=/tmp env=/tmp env=/tmp |
Reference: PHP-FPM Documentation and My Learning from Implementation.
Советы по настройке и оптимизации PHP-FPM
Совет №1 – Файлы конфигурации PHP-FPM
Обычно конфигурации PHP-FPM расположенны в файле и в каталоге. Весь пулл конфигов расопложен в дикертории . Чтобы это работало, вы должны добавить следующую строку в :
1 |
include=/etc/php-fpm.d/*.conf |
Совет №2 – Глобальная конфигурация PHP-FPM
Настройки , и по умолчанию выключены, но я считаю что их стоит влючить, например, со следующими значениями:
1
2 3 |
emergency_restart_threshold 10 emergency_restart_interval 1m process_control_timeout 10s |
Что это значит? Если 10 дочерних процессов PHP-FPM завршатся с помощью SIGSEGV илиSIGBUS, то PHP-FPM перезагрузится через 1 минуту. А также дочерним процессам установлен лимит времени реакции в 10 секунд на сигнал от мастера.
Совет №3 – Конфигурация пулов PHP-FPM
В PHP-FPM возможно использовать отденьные пулы для каждого сайта и точно распределять ресурсы, а также использовать разных пользователей и разные группы для каждого пула. Приведем примеры конфигураци трех различнх сайтов (или фактически три части одного сайта):
Примеры конфигурации каждого пула:/etc/php-fpm.d/site.conf
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
listen = 127.0.0.1:9000 user = site group = site request_slowlog_timeout = 5s slowlog = /var/log/php-fpm/slowlog-site.log listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 5 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 200 listen.backlog = -1 pm.status_path = /status request_terminate_timeout = 120s rlimit_files = 131072 rlimit_core = unlimited catch_workers_output = yes env = $HOSTNAME env = /tmp env = /tmp env = /tmp |
/etc/php-fpm.d/blog.conf
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
listen = 127.0.0.1:9001 user = blog group = blog request_slowlog_timeout = 5s slowlog = /var/log/php-fpm/slowlog-blog.log listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 4 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 pm.max_requests = 200 listen.backlog = -1 pm.status_path = /status request_terminate_timeout = 120s rlimit_files = 131072 rlimit_core = unlimited catch_workers_output = yes env = $HOSTNAME env = /tmp env = /tmp env = /tmp |
/etc/php-fpm.d/forums.conf
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
listen = 127.0.0.1:9002 user = forums group = forums request_slowlog_timeout = 5s slowlog = /var/log/php-fpm/slowlog-forums.log listen.allowed_clients = 127.0.0.1 pm = dynamic pm.max_children = 10 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 400 listen.backlog = -1 pm.status_path = /status request_terminate_timeout = 120s rlimit_files = 131072 rlimit_core = unlimited catch_workers_output = yes env = $HOSTNAME env = /tmp env = /tmp env = /tmp |
Это просто примеры как настроить несколько различных пулов.
Совет №4 – Конфигурация менеджера процессов (Pool Process Manager) PHP-FPM
Проверим сколько процессов PHP-FPM позволит легко справляться серверу с нагрузкой. Сначала запустим Nginx и PHP-FPM и загрузим несколько страниц PHP, желательно самые тяжелые. Затем проверим сколько использует памяти процесс PHP-FPM – в Linux можно воспользоваться утилитами или . Предположим что наш сервер имеет 512 Мб оперативной памяти и 220 Мб может быть использованно PHP-FPM, каждый процесс использует 24 Мб оператичной памяти (некоторые CMS с плагинами могут легко кушать 20-40 Мб на один запрос или даже больше). Затем просто вычислим значние для сервера:
Приемлемым значнием будет 9. Это значние основанно на среднем значении и возможно далее его необходимо будет изменить, когда вы заметите длительное время использования памяти процессом. После быстрого тестирования несложно выбрать значния , и .
Окончательная конфигурация нашего примера может выглядеть следующим образом:
1
2 3 4 5 |
pm.max_children = 9 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 200 |
Максималоное количество запросов на процесс по умолчанию не ограничено, но хорошо бы установить какое-нибудь небольшое значение, например 200, и избежать проблем с памятью. Такого вида настрока может обрабарывать большое количество запросов, даже если значение параметра невелико.
Установка и настройка PHP-FPM на Freebsd
Начиная с версии php 5.3 php-fpm идет как модуль, поэтому просто начинаем установку php и указываем в опциях fpm:
# cd /usr/ports/lang/php5 # make config-recursive
# make install clean
Ставим теперь дополнения php-extentions:
# cd /usr/ports/lang/php5-extensions # make config-recursive
Дополнений много, все ставить не обязательно, можно будет остальное доставить потом в случае необходимости. Я обычно выбираю наиболее популярные и необходимые:
BZ2, CTYPE, CURL, DOM, EXIF, FILTER, FTP, GD, GETTEXT, HASH, ICONV, JSON, MBSTRING, MCRYPT, MYSQL, MYSQLI, PDF, PDO, PDO_SQLITE, PHAR, POSIX, SESSION, SIMPLEXML, SQLITE3, YOKENIZER, XML, XMLREADER, XMLWRITER, ZIP
# make install clean
Добавляем php-fpm в автозагрузку:
# echo 'php_fpm_enable="YES"' >> /etc/rc.conf
Редактируем файл с настройками, приводим его к следующему виду:
# mcedit /usr/local/etc/php-fpm.conf pid = run/php-fpm.pid user = www group = www # работа через unix сокет, а не tcp, дает небольшой прирост производительности listen = /tmp/php-fpm.sock # права доступа к сокету listen.owner = www listen.group = www listen.mode = 0660 # как будут создаваться новые рабочие процессы pm = dynamic # максимальное оличество рабочих процессов pm.max_children = 10 # число запущенных процессов при старте сервера pm.start_servers = 2 # минимальное и максимальное количество процессов в простое pm.min_spare_servers = 1 pm.max_spare_servers = 3
Проверяем синтаксис настроек:
# php-fpm -t NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful
Стартуем php-fpm:
# /usr/local/etc/rc.d/php-fpm start
Проверяем запустился ли:
# sockstat | grep php-fpm www php-fpm 504 0 stream /tmp/php-fpm.sock www php-fpm 503 0 stream /tmp/php-fpm.sock root php-fpm 502 4 stream -> ?? root php-fpm 502 6 stream -> ?? root php-fpm 502 7 stream /tmp/php-fpm.sock
Все в порядке. Идем дальше.
Ротация логов веб сервера nginx
Последний штрих в настройке web сервера — ротация логов виртуальных хостов. Если этого не сделать, то через какое-то, обычно продолжительное, время возникает проблема в связи с огромным размером лог файла.
У нас уже будет файл конфигурации logrotate для nginx, который был создан во время установки — /etc/logrotate.d/nginx. Приведем его к следующему виду:
На этом все. Я рассмотрел все основные моменты, которые необходимы для установки и настройки производительного web сервера на основе nginx и php-fpm последних версий. При этом рассказал о некоторых вещах, которые повышают удобство и гибкость эксплуатации сервера.
Шаг 2 — Настройка Apache HTTP для использования диспетчера процессов FastCGI
На этом этапе вы изменили способ подключений процессов Apache HTTP, переключив MPM Pre-fork на Event. Однако вы также отключили модуль PHP, который соединял Apache HTTP со всеми программами, выполняемыми на PHP.
На этом этапе вы установите процессор PHP-FPM, чтобы Apache HTTP опять смог обрабатывать программы PHP. Также вы установите библиотеки зависимостей и активируйте модули, чтобы они могли работать более слаженно и быстро, чем ранее.
Вначале установите . Следующая команда установит пакет PHP-FPM, и он автоматически активирует службу , интегрированную с systemd, чтобы служба запускалась во время загрузки:
Для обмена данными для Apache HTTP и PHP потребуется библиотека, обеспечивающая эту возможность. Теперь вы установите , который может служить интерфейсом между программами с веб-серверами и является характерным для Apache HTTP. Этот обмен данными будет происходить через сокет UNIX.
Установите эту библиотеку:
Вы установили и , но они еще не активированы.
Вначале активируйте модуль с помощью следующей команды:
Затем активируйте модуль Apache HTTP:
Теперь активируйте модуль FastCGI в Apache HTTP:
Примечание. Вы можете прочитать конфигурацию этого взаимодействия между программами PHP и Apache HTTP через сокет UNIX с помощью следующего:
Теперь все готово, и можно запускать Apache HTTP. Сначала выполните проверку конфигурации:
После этого можно перейти к повторному запуску Apache HTTP, поскольку он был автоматически запущен при установке библиотеки FastCGI :
Вы установили модуль , настроили Apache HTTP для работы с ним, активировали необходимые модули для работы протокола FastCGI, а также запустили соответствующие службы.
Теперь Apache имеет активированный модуль MPM Event, присутствует и работает PHP-FPM, и сейчас самое время проверить, что все работает должным образом.
Кэширование Nginx и fastcgi
proxy_cache_path /home/vagrant/Code/ng-cache levels=1:2 keys_zone=ng_cache:10m max_size=10g inactive=60m; proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; fastcgi_cache_path /home/vagrant/Code/ngd-cache levels=1:2 keys_zone=ngd_cache:10m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_use_stale error timeout invalid_header http_500; fastcgi_ignore_headers Cache-Control Expires Set-Cookie; add_header NGINX_FASTCGI_CACHE $upstream_cache_status; server { listen 80; listen 443 ssl http2; server_name nginx-performance.app; root "/home/vagrant/Code/project-nginx/public"; index index.html index.htm index.php; charset utf-8; proxy_cache ng_cache; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; error_log /var/log/nginx/nginx-performance.app-error.log error; sendfile off; client_max_body_size 100m; location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors off; fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_cache ngd_cache; fastcgi_cache_valid 60m; } location ~ /.ht { deny all; } ssl_certificate /etc/nginx/ssl/nginx-performance.app.crt; ssl_certificate_key /etc/nginx/ssl/nginx-performance.app.key; }
Мы открыли файл виртуального хоста Nginx и добавили приведенные выше настройки. Давайте поясним их.
proxy_cache_path /home/vagrant/Code/ng-cache levels=1:2 keys_zone=ng_cache:10m max_size=10g inactive=60m;
Как объяснялось в статье производительность Apache и Nginx: методы оптимизации, proxy_cache_path используется для кеширования статических ресурсов. Таких как изображения, таблицы стилей, файлы JavaScript. Сам путь должен существовать, поэтому необходимо создать эти директории.
levels означает глубину директорий внутри этого пути/папки.
Keys zone – это имя. Каждый виртуальный хост должен использовать отдельное имя. max_size означает максимальный размер кэша, а inactive — что элементы времени будут храниться в кэше, даже если они не запрашиваются.
После этого времени простоя кэш для ресурса будет снова заполнен.
fastcgi_cache_purge
Это определяет запросы, которые смогут очистить кэш. Nginx (его модуль ngx_http_fastcgi_module) предоставляет полный комплект инструментов для кэширования. Пример использования указанной выше директивы:
fastcgi_cache_path /data/nginx/cache keys_zone=cache_zone:10m; map $request_method $purge_method { PURGE 1; default 0; } server { ... location / { fastcgi_pass backend; fastcgi_cache cache_zone; fastcgi_cache_key $uri; fastcgi_cache_purge $purge_method; } }
В этом случае запрос PURGE REST сможет удалить данные из кэша.
Мы добавили заголовки Nginx к ответам, чтобы можно было узнать, обслуживался ли ресурс из кэша или нет.
add_header NGINX_FASTCGI_CACHE $upstream_cache_status;
Затем можно проанализировать время загрузки нашей страницы, чтобы проверить, что работает, а что нет.
Метод fastcgi_cache_methods полезен для кеширования конкретных методов запроса, таких как POST. GET и HEAD.
Активировав приведенную выше конфигурацию, как для статического, так и для динамического контента, мы запустили Locust. Мы подключили к системе 100 параллельных пользователей. Разница в результатах была поразительной. Того напряжения, в котором раньше находился сервер, уже не ощущалось.
Кэширование Nginx принесло несколько значительных улучшений.
Мы видим, что нам удалось сократить время загрузки страницы. Теперь оно составляет меньше секунды!
Мы также протестировали одну страницу галереи, у которой есть дополнительный «багаж» похожих и новых галерей.
Отчет в файле HAR по этому тесту.
Восстановление значения переменной
Чтобы восстановить значение переменной под администратором:
- Нажмите Настройки → Настройки PHP → Расширенные настройки → Восстановить.
- Изменённое значение удаляется из глобального конфигурационного файла PHP.
- Для каждого пользователя ISPmanager:
- Содержимое пользовательского конфигурационного файла полностью заменяется на содержимое глобального файла.
- Значения из конфигурационного файла изменённых параметров пользователя заменяют соответствующие значения в пользовательском конфигурационном файле.
Чтобы восстановить значение переменной под пользователем:
- Нажмите WWW → PHP → Расширенные настройки → Восстановить.
- Изменённое значение удаляется из пользовательского конфигурационного файла PHP.
2: Настройка Apache для поддержки FastCGI
Только что мы изменили способ обработки соединений Apache HTTP, переключившись с Pre-fork MPM на Event. Однако при этом мы также отключили модуль PHP, который связывал Apache со всеми программами, работающими на PHP.
В этом разделе мы установим процессор PHP-FPM, чтобы Apache снова смог обслуживать программы PHP. Также мы установим зависимые библиотеки и включим модули, чтобы Apache и PHP могли взаимодействовать быстрее, чем раньше.
Сначала установите php-fpm. Следующая команда установит пакет PHP-FPM и автоматически включит сервис php7.2-fpm, интегрированный с systemd (поэтому сервис будет запускаться во время загрузки сервера):
Для связи Apache HTTP и PHP нужна библиотека, обеспечивающая их взаимодействие. Теперь давайте установим библиотеку libapache2-mod-fcgid, которая может служить интерфейсом между программами и веб-серверами. Эта связь будет происходить через UNIX-сокет. Установите ее:
Вы установили php-fpm и libapache2-mod-fcgid, но ни один из этих компонентов еще не включен.
Сначала мы включим модуль php-fpm:
Затем давайте модуль Apache HTTP под названием proxy:
А теперь можно включить FastCGI модуль proxy:
Примечание: Вы можете прочитать конфигурацию взаимодействия между программами PHP и Apache через UNIX сокет с помощью команды:
Теперь все готово, мы можем запустить Apache HTTP. Сначала выполните проверку конфигурации:
Вы должны получить такой вывод:
После этого можно приступать к перезапуску Apache HTTP – сервер автоматически запустился при установке FastCGI библиотеки libapache2-mod-fcgid:
Итак, мы установили модуль php-fpm, настроили Apache для его поддержки, включили необходимые модули для работы протокола FastCGI и запустили соответствующие сервисы.
Теперь в Apache включен MPM-модуль Event, а 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 умеет отдавать часть необходимой нам информации о своем состоянии. Для этого его надо соответствующим образом подготовить. Открываем конфиг сервера и добавляем туда следующую конструкцию:
server { listen localhost; server_name localhost; keepalive_timeout 0; allow 127.0.0.1; allow ::1; deny all; access_log off; location /nginx-status { stub_status on; }
Я обычно добавляю в самый конец основного конфига nginx.conf. Сохраняем и перечитываем конфигурацию, перед этим проверив его конфиг на ошибки:
# nginx -t # nginx -s reload
Проверяем, можем ли мы получить необходимую информацию для настройки мониторинга:
# curl http://localhost/nginx-status Active connections: 89 server accepts handled requests 1374661 1374661 9511381 Reading: 0 Writing: 1 Waiting: 87
Теперь проверим, сможет ли zabbix получать эту страницу.
# zabbix_agentd -t web.page.get
Если у вас так же, то все в порядке, можно двигаться дальше. Если что-то не получается, то проверяйте конфиги, смотрите логи. Это штатный функционал, он должен без проблем настраиваться и работать.
Сразу обращаю внимание на один важный момент, на котором я застрял на приличное время. Через curl я без проблем забирал страничку со статусом nginx, а вот через zabbix никак не получалось
Была ошибка:
:80]: Connection refused]
Я всю голову сломал, 10 раз перепроверил конфиги, никак не мог понять, почему не работает. Оказалось, дело было вот в чем. Zabbix-agent обращался к серверу Nginx по протоколу ipv6. Это при том, что как агент, так и nginx работали по ipv4. Я принудительно отключаю у служб ipv6, если он не используется.
Обнаружил это случайно, когда от безысходности запустил Nginx на всех интерфейсах и снял ограничения allow/deny в конфиге. Тогда запрос прошел нормально. Я посмотрел access лог и увидел, что zabbix-agent обращается с адреса ::1. И все стало ясно. Я так и не понял, как заставить агента ходить по ipv4. В итоге запустил nginx на обоих протоколах и разрешил забирать страницу статуса с адреса ::1. После этого заработало.
Самое неприятное в этой ситуации было то, что в логах нигде не было никаких ошибок, отклоненных запросов или чего-то еще, что могло бы дать зацепку. Zabbix agent просто писал, что подключение отклонено и все. О том, что он обращается по ipv6, не было никакого намека.
Настройка PHP-FPM для повышения производительности + Low Memory
Откройте файл конфигурации PHP-FPM для PHP 7.0.
sudo nano /etc/php/7.0/fpm/pool.d/www.conf
Настройте следующие значения, как показано ниже, обратите внимание на перед , и. означает, что дочерние процессы в PHP-FPM будут порождаться только при необходимости
означает, что дочерние процессы в PHP-FPM будут порождаться только при необходимости
это максимальное количество дочерних процессов, которые будут разрешены, 50 является достаточно либеральным, но если вы видите в своем архиве журналов что количество дочерних процессов превысило максимальное значение, то необходимо увеличить это значение
убивает дочерние процессы после того, как они бездействовали в течение 10 секунд
устанавливает максимальное количество запросов PHP для каждого дочернего процесса
pm = ondemand ; Число дочерних процессов, которые будет создано, когда pm установлен в 'static' и ; Максимальное число дочерних процессов, когда pm установлен в 'dynamic' и 'ondemand'. ; Это значение устанавливает ограничение на количество одновременных запросов, которые будут ; запускаться. Эквивалент директивы ApacheMaxClients в mpm_prefork. ; Эквивалентная переменная среды PHP_FCGI_CHILDREN в оригинальном PHP ; CGI. Ниже, по умолчанию основаны на сервере без использования значительных ресурсов. Не ; забудьте настройки часов.* чтобы соответствовать вашим потребностям. ; Примечание: используется, когда pm установлен в 'static', 'dynamic' или 'ondemand' ; Примечание: это значение является обязательным. pm.max_children = 50 ; Число дочерних процессов, созданных при запуске. ; Примечание: используется только тогда, когда pm установлен в "dynamic" ; Значение по умолчанию: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 ;pm.start_servers = 2 ; Требуемое минимальное число неактивных процессов сервера. ; Примечание: используется только тогда, когда pm установлен в "dynamic" ; Примечание: обязательное, когда pm установлен в "dynamic" ;pm.min_spare_servers = 1 ; Требуемое максимальное число неактивных процессов сервера. ; Примечание: используется только тогда, когда pm установлен в "dynamic" ; Примечание: обязательное, когда pm установлен в "dynamic" ;pm.max_spare_servers = 3 ; Число секунд, по истечении которых бездействующий процесс будет убит. ; Примечание: используется только тогда, когда pm установлен в 'ondemand' ; Значение по умолчанию: 10s pm.process_idle_timeout = 10s; ; Число запросов после которых дочерний процесс будет перезапущен. ; Это может быть полезно во избежания утечек памяти в 3-й партии библиотек. Для ; бесконечной обработки запроса укажите '0'. Эквивалент PHP_FCGI_MAX_REQUESTS. ; Значение по Умолчанию: 0 pm.max_requests = 500
Проверьте правильность вашего синтаксиса конфигурации PHP-FPM
php-fpm7.0 -t
Вы должны увидеть, что конфигурация действует
NOTICE: configuration file /etc/php/7.0/fpm/php-fpm.conf test is successful
Теперь вы можете перезапустить php7.0-FPM
sudo service php7.0-fpm restart
Вы можете увидеть, что объем оперативной памяти используется значительно меньше.
Установка и настройка mysql на Freebsd
Устанавливаем mysql:
# cd /usr/ports/databases/mysql55-server # make config-recursive # make install clean
Добавляем Mysql в автозагрузку:
echo 'mysql_enable="YES"' >> /etc/rc.conf
Создаем для него конфигурационный файл:
# touch /etc/my.cnf
Конфигурацию каждый под свои потребности может сделать, описаний настроек в интернете много. Я предлагаю свой универсальный вариант:
port = 3306 socket = /tmp/mysql.sock port = 3306 bind-address = 127.0.0.1 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 256 sort_buffer_size = 1M read_buffer_size = 1M read_rnd_buffer_size = 4M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size= 16M thread_concurrency = 8 log-bin=mysql-bin log=/var/log/mysql.log binlog_format=mixed server-id = 1 quick max_allowed_packet = 16M no-auto-rehash key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M interactive-timeout
В моем варианте сервер жестко привязан к локальному интерфейсу и удаленно с ним работать нельзя. Если вам нужны удаленные подключения, то в параметре bind-address добавьте внешний адрес сервера.
Создадим файл логов:
touch /var/log/mysql.log chown mysql:mysql /var/log/mysql.log
Запускаем Mysql:
# /usr/local/etc/rc.d/mysql-server start
Проверяем, все ли в порядке:
# sockstat | grep mysql mysql mysqld 46460 13 tcp4 127.0.0.1:3306 *:* mysql mysqld 46460 15 stream /tmp/mysql.sock
Демон запущен и слушает локальный интерфейс.
Теперь запустим скрипт для настройки безопасности:
# /usr/local/bin/mysql_secure_installation
Задаем пароль для root и далее на все вопросы отвечаем утвердительно:
На этом установка и настройка mysql закончена. Идем дальше.