среда, 17 ноября 2021 г.

Установка расширения ssh2 для php7 в CentOS8

В CentOS8 по умолчанию устанавливается версия php – 7.2.
Данная версия языка php не содержит готового пакета расширения ssh2 в репозитариях CentOS8. Более того расширение не поддерживается официально для php7. В связи с этим нет возможности использовать директивы ssh2_connect, ssh2_exec, ssh2_scp_send в программах на php7.

Это ограничение можно обойти, установив расширение вручную.
1) Подготовим систему для сборки расширения ssh2
# yum install gcc php-devel libssh2 libssh2-devel

2) Скачиваем и собираем расширение
# cd /usr/src
# git clone https://github.com/php/pecl-networking-ssh2.git
# cd pecl-networking-ssh2
# phpize
# ./configure
# make

Сборка завершается сообщением:
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/src/pecl-networking-ssh2/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

3) Устанавливаем собранный пакет
# make install
Результат:
Installing shared extensions:     /usr/lib64/php/modules/

4) Информацию о новом модуле нужно задать в директории /etc/php.d
Создаем файл и заносим в него информацию о расширении:
# touch /etc/php.d/40-ssh2.ini
# nano /etc/php.d/40-ssh2.ini

Вписываем туда:
extension=ssh2

5) Проверить результат можно командой:
# php -i |grep ssh2
Для применения настроек в apache, web-сервер нужно перезагрузить







Повышение производительности WEB-сервера Apache 2.4

Для увеличения производительности WEB-сервера можно предпринять ряд шагов.

1)    При приходе запроса на web-сервер, он обращается к DNS для того что бы по IP адресу узнать сетевое имя и красиво сделать запись в логах. Для того что бы заставить apache прекратить это делать, нужно в конец файла /etc/httpd/conf/httpd.conf добавить строчку
HostnameLookups off

2)    В конфигурации сервера в разделе описывающий доступ к директориям <Directory …> есть директива, заставляющая сервер каждый раз прочитывать каталог и искать файл .htaccess для получения дополнительных инструкций из этого файла. Это поведение можно прекратить и глобально запретить искать файл .htaccess и считывать его содержимое. Для этого нужно установить значение директивы AllowOverride в None глобально и во всех настройках виртуальных хостов. Для установки директивы глобально в файле /etc/httpd/conf/httpd.conf в разделе <Directory "/var/www/html"> нужно установить
AllowOverride None
Для тех директорий, где использование файла .htaccess необходимо нужно создать отдельный раздел в файлах конфигурации и прописывать там:
<Directory "/var/www/html/">
      AllowOverride All
      Require all granted
</Directory>


3)    Web-сервер Apache, по умолчанию установленный в Linux, работает с применением многозадачного модуля PreFork. Этот модуль создает несколько процессов Apache на сервере. Каждый процесс обслуживает в единицу времени только один входящий запрос. В этом и плюс и минут данного решения.
Убедиться в том, что на сервере работает модуль PreFork можно так:
# apachectl -t -D DUMP_MODULES | grep mpm
Пример вывода
mpm_prefork_module (shared)
Для того что бы задействовать возможности PreFork по максимому нужно вручную задать его конфигурацию, рассчитываемую под каждый сервер индивидуально. Для этого в конец файла /etc/httpd/conf/httpd.conf нужно добавить блок:
KeepAlive off
<IfModule prefork.c>
   StartServers            6
   MinSpareServers         5
   MaxSpareServers         10
   MaxClients              XX
   ServerLimit             XX
   MaxRequestsPerChild     10000
</IfModule>

KeepAlive off – Директива отключает использование KeepAlive. При включенном KeepAlive в одном соединении с сервером клиент может сделать несколько запросов. Обычно это помогает загружать множественные картинки на странице сайта. Если картинок на странице сайта не много, то в режиме PreFork эта функция будет только мешать.
StartServers – количество процессов, которые Apache будет стартовать при запуске сервера. По умолчанию – 5.
MinSpareServers и MaxSpareServers  - это диапазон количества простаиваемых процессов, которые не обрабатывают запросы. Обычно значения оставляют теми, что заданы по умолчанию – 5 и 10 соответственно.
MaxClients и ServerLimit устанавливаются равными и рассчитывается как объем памяти для сервера деленное на объем памяти на один процесс.
Например, выделим для Apache 1024 Мбайт памяти. А один процесс занимает 25 МБ, тогда
MaxClients  = ServerLimit  = 1024 Мб / 25 МБ = 40
Оценить сколько потребляет весь сервер и один процесс нужно во время высокой нагрузки сервера так:
# ps -ylC httpd | awk '{x += $8;y += 1} END {print "Apache(MB): "x/1024; print "Proccess(MB): "x/((y-1)*1024)}'
Пример вывода:
Apache(MB): 660.219
Proccess(MB): 55.0182

MaxRequestsPerChild – тут задается большое число, которое ограничивает количество запросов, отработанных одним процессом. Когда процесс выполнит это количество запросов, процесс перезапуститься. Ноль в этой директиве запретит перезапуск процессов. Обычно тут нужно устанавливать большое число, что бы процессы перезапускались не часто. Но установка в 0 может вызвать неконтролируемые утечки памяти при сбое в процессе.

4)    Для мониторинга того, какой запрос на сервере выполняется медленно, на сервере Apache нужно настроить логирование времени выполнения каждого запроса. Это делается в глобальном файле конфигурации и в файлах конфигурации виртуальных хостов.
За это отвечают две директивы – LogFormat и CustomLog. В глобальном файле конфигурации /etc/httpd/conf/httpd.conf директивы прописываются в разделе <IfModule log_config_module>.
Первой директивой добавляем новый формат вывода логов и устанавливаем ему псевдоним, например, servetime
LogFormat "%h %t \"%r\" %D" servetime
В строке формата "%h %t \"%r\" %D"
%h - IP адрес, с которого пришел запрос
%t - время запроса
\"%r\" – строка самого запрос к серверу
%D -время в микросекундах, которое потребовалось apache для     обслуживания запроса
Другие возможные параметры форматирования лога описаны тут - http://httpd.apache.org/docs/2.2/mod/mod_log_config.html
Вторая директива определяет файл куда будет записываться лог требуемого формата с псевдонимом servetime. Существующую директиву, которая обычно выглядит так
CustomLog /var/log/httpd/access_log combined
меняем на
CustomLog "logs/access_log " servetime
Для создания отдельного файла логов с новым форматом нужно добавить новую строчку CustomLog, например:
CustomLog "logs/access_log_servetime" servetime
После применения изменений конфигурации сервера, логи с вычисленным значением длительности отработки запросов будут складываться в файл /var/log/httpd/access_log_servetime.
Вот так потом можно отфильтровывать запросы, длительностью более 10 миллисекунд:
# cat /var/log/httpd/access_log_servetime | awk -F'"' '{if ($3 > 10000) print $2, $3/1000}'
Пример лога из файла access_log_servetime:
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /logo-uhotool-2.jpg HTTP/1.1" 200 326
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /index-foto-01.jpg HTTP/1.1" 200 224
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /index-foto-02.jpg HTTP/1.1" 200 256
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /loader.gif HTTP/1.1" 200 201
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /index-foto-03.jpg HTTP/1.1" 304 330
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /favicon.ico HTTP/1.1" 200 165
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /background/getVoIPoperator.php HTTP/1.1" 200 6442
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /background/getListSMSChannel.php HTTP/1.1" 200 7055
10.10.50.240 [12/Nov/2021:13:06:27 +0300] "GET /background/getListTftp.php HTTP/1.1" 200 9045
::1 [12/Nov/2021:13:06:33 +0300] "OPTIONS * HTTP/1.0" 200 493

Пример вывода запросов более 10 миллисекунд
GET / HTTP/1.1 10.901
GET /index-foto-02.jpg HTTP/1.1 16.727
GET /background/getListTftp.php HTTP/1.1 10.349


5)    Рестартуем сервер для применения настроек по всем описанным выше пунктам:
# systemctl http restart


четверг, 11 ноября 2021 г.

Включение логирования медленных SQL запросов в базе данных MariaDB (MySQL) без перезагрузки сервиса

Создаем файл, в котоырй будут записываться медленные SQL запросы к базе:
touch /tmp/mysql-slow.log
chown mysql:mysql /tmp/callpeg-mysql-slow.log
chmod 666 /tmp/callpeg-mysql-slow.log


Подключаемся к консоли MySQL
mysql -uroot -p
Просмотр текущих настроек по медленным SQL запросам
MariaDB [(none)]> SHOW VARIABLES LIKE '%slow%';

Включение медленных запросов (задержки более 3 секунд):
MariaDB [(none)]> SET GLOBAL slow_query_log = 'ON';
MariaDB [(none)]> SET GLOBAL slow_launch_time = 3;
MariaDB [(none)]> SET GLOBAL slow_query_log_file = '/tmp/callpeg-mysql-slow.log';
MariaDB [(none)]> FLUSH LOGS;


Просмотр медленных запросов:
# tail -f /tmp/callpeg-mysql-slow.log
или через утилиту mysqldumpslow (установлена по умолчанию вместе с MySQL)
# mysqldumpslow /tmp/callpeg-mysql-slow.log
Показ 10 самых медленных запросов по среднему времени запроса
# mysqldumpslow -s at -t 10 /tmp/callpeg-mysql-slow.log