Freebsd настройка php-fpm и nginx

Введение

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему 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 вы уже настроили и имеете некое представление о работе его компонентов, поэтому некоторые вещи я не разжевываю, а просто говорю, что делать.

Что такое 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
2
3
4

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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 по этому тесту.

Восстановление значения переменной

Чтобы восстановить значение переменной под администратором:

  1. Нажмите Настройки → Настройки PHP → Расширенные настройки → Восстановить.
  2. Изменённое значение удаляется из глобального конфигурационного файла PHP.
  3. Для каждого пользователя ISPmanager:
    1. Содержимое пользовательского конфигурационного файла полностью заменяется на содержимое глобального файла.
    2. Значения из конфигурационного файла изменённых параметров пользователя заменяют соответствующие значения в пользовательском конфигурационном файле.

Чтобы восстановить значение переменной под пользователем:

  1. Нажмите WWW → PHP → Расширенные настройки → Восстановить.
  2. Изменённое значение удаляется из пользовательского конфигурационного файла 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:

Параметры мониторинга 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 закончена. Идем дальше.

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

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