понедельник, 13 декабря 2021 г.

Debian10. Собственный unit systemd. Запуск скрипта при загрузке системы

В Debian10 нет удобного файла /etc/rc.local, в который можно поместить скрипт, выполняемый при загрузке системы.
Лучший способ запустить скрипт при запуске - это сделать собственный юнит системы systemd.

Создаем файл
# touch /etc/systemd/system/detail-make.service
Прописываем в него минимально необходимую информацию:
#  nano /etc/systemd/system/detail-make.service 

Пример файла:

[Unit]
Description=detail_make_cikl
After=networking.target postgresql.target
[Service]
Type=simple
ExecStart=nohup /home/write_in_file_cikl.sh >/dev/null &
[Install]
WantedBy=multi-user.target


Делаем файл юнита исполняемым:
# chmod +x /etc/systemd/system/detail-make.service

#chmod 777 /home/write_in_file_cikl.sh

Рестартуем демон system:
# systemctl daemon-reload
Запускаем сервис:
# systemctl start detail-make.service
Включаем автозагрузку:
# systemctl enable detail-make.service
Статус сервиса можно посмотерть так:
# systemctl status detail-make

Debian10 Ошибка при установке программ. apt install. apt update.

Иногда в Debian10 при выполнении простой команды установки получаем ошибку

# apt install mc
<......>
Получено 2 834 kB за 1с (3 187 kB/s)
E: Не удалось получить http://deb.debian.org/debian/pool/main/g/glib2.0/libglib2.0-0_2.58.3-2+deb10u2_amd64.deb  404  Not Found [IP: 199.232.138.132 80]
E: Не удалось получить http://deb.debian.org/debian/pool/main/g/glib2.0/libglib2.0-data_2.58.3-2+deb10u2_all.deb  404  Not Found [IP: 199.232.138.132 80]
E: Не удалось получить некоторые архивы; возможно, нужно запустить apt-get update или попытаться повторить запуск с ключом --fix-missing?

С некоторой долей вероятности это происходит из-за того, что данные базы apt обновились
и теперь указывают на неверные ссылки в репозитарии.
Для исправления ситуации выполняем команду:
# apt update

И тогда все опять начинает корректно работать



среда, 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

понедельник, 30 августа 2021 г.

Установка и настройка ProFTPd. Настройка авторизации пользователей через базу данных PostgeSQL.

Все действия приведены применительно к Debian 10.

Предполагается, что
PostgeSQL уже установлен в системе.
Создана папка для корня FTP сервера - /ftp
Созданы подпапки для пользователей, например - /ftp/nn и /ftp/saratov с правами 777

Установка сервиса ProFTPd:
$ sudo apt install proftpd
$ sudo systemctl enable proftpd
$ sudo systemctl start proftpd

Сервер работает под пользователем proftpd
Задаем пароль для этого пользователя (например, 12345) и оболочку (/bin/bash)
$sudo passwd proftpd
Новый пароль : 12345
Повторите ввод нового пароля : 12345
$sudo chsh -s /bin/bash proftpd


Установка расширения для proftpd, работающего с СУБД PostgeSQL
$ sudo apt install proftpd-mod-pgsql

Создаем базу данных для пользователя базы proftpd и выдалим привелегии этому пользователю для базы и таблицы:
$ sudo -u postgres psql
postgres=# CREATE USER proftpd;
postgres=# ALTER ROLE proftpd CREATEDB;
postgres=# ALTER USER proftpd with encrypted password 'pass123';
postgres=# CREATE DATABASE proftpddb;
postgres=# \c proftpddb;
postgres=# CREATE TABLE users (id serial PRIMARY KEY,username varchar(20),password varchar(20),groupname varchar(24),uid int,gid int,homedir varchar(70),shell varchar(20));
postgres=# GRANT ALL privileges ON DATABASE proftpddb TO proftpd;
postgres=# GRANT ALL ON users TO proftpd;


Создаем пользователей, которые будут подключаться к FTP серверу
Например, пользователя nn с паролем xxxzzz777 и домашним каталогом /ftp/nn
postgres=# INSERT INTO users (username, password, groupname, uid, gid, homedir,shell) VALUES ('nn','xxxzzz777','ftp',1010,1010, '/ftp/nn','/bin/sh');
Пользователи не смогут выходит за пределы "своих" каталогов.

Файл конфигурации сервера ProFTPd будет тут: /etc/proftpd/proftpd.conf
Вносим в него правки
$ sudo nano /etc/proftpd/proftpd.conf
Устанавливаем корень FTP сервера - для всех пользователей - свою домашнюю директорию
За ее пределы пользователи не смогу выходить
DefaultRoot                   ~
Раскомментируем строку, отключающаяю запрос реального shell для пользователя
RequireValidShell             off
Раскомментируем строку
Include /etc/proftpd/sql.conf

В файле модулей proFFTPd (/etc/proftpd/modules.conf) подключаем модуль sql и postgres
$ sudo nano /etc/proftpd/modules.conf
Раскомментируем строку:
LoadModule mod_sql.c
и добавляем строку
LoadModule mod_sql_postgres.c

В файле модуля sql (/etc/proftpd/sql.conf) вносим настройки для доступа к базе данных с пользователями
$ sudo nano /etc/proftpd/sql.conf
<IfModule mod_sql.c>

# Определение режима работы - база PostgreSQL
SQLBackend      postgres
SQLEngine on

# Аутентификация по имени пользователя, юзера
SQLAuthenticate users
# Пароль будет передаваться в базу открытым текстом
SQLAuthTypes    Plaintext
# НазваниеБазы@Сервер Логин Пароль
SQLConnectInfo proftpddb@localhost proftpd pass123
# Имя таблицы (users) и последовательность полей таблицы users
SQLUserInfo users username password uid gid homedir shell
</IfModule>


Рестарт сервера для применения настроек:
$ sudo systemctl restart proftpd

Если потребуется отладка, то запуск proFTPd в отладочном режиме:
$ sudo /usr/sbin/proftpd -d 9 -n

понедельник, 12 июля 2021 г.

Запуск скрипта python без указания программы транслятора

Скрипт Python можно запустить из командной строки Linux, например, таким образом:
# python3 script.py 

При этом файл script.py должен находиться в директории в которой находиться пользователь. В начале команды указывается интерпретатор, который должен обработать файл с программой. Но можно сделать скрипт исполняемым (chmod +x script.py) и добавить в начало файла специальную строчку описывающую, как исполнять программу данного файла. Эта строка должна начинаться с символов #!, которые вместе называются shebang (шебанг) и содержит путь к программе интерпретатора.
Например, первая строка может быть такой: #!/usr/bin/python3.

В этом случае запуск скрипта может выполняться так:
# ./script.py

После запуска скрипта таким образом часто возникает ошибка:
-bash: ./script.py: /usr/bin/python3^M: неверный интерпретатор: Нет такого файла или каталога
Это связано с тем, что символы переноса строки были созданы в ОС, отличной от Linux. В Linux в редакторе MCEDIT они отображаются так:

В Sublime Text 3 при использовании расширения RawLineEdit символы завершения строки отображаются так:

Если стереть эти символы (по крайней мере в первой строке), то скрипт будет выполняться без ошибок.

Установка и подключение к PostgreSQL в Debian 10

По умолчанию в Debian 10 из стандартных репозитариев устанавливается 11 версия PostgreSQL
$ sudo apt install postgresql
При этом создается пользователь postgres, от имени которого будет инициироваться запуск приложения. Учетная запись postgres создается как заблокированная для аутентификации в самой ОС и поэтому пароля не имеет.
Добавление PostgreSQL в автозагрузку и запуск сервиса:
$ sudo systemctl enable postgresql
$ sudo systemctl start postgresql

Сервер баз по умолчанию слушает localhost на порту 5432.
Логи сервера будут в файле - /var/log/postgresql/

Заходим от имени postgres в командную строку сервера базы данных
$ sudo -u postgres psql
В этом режиме под пользователем postgres меняются глобальные настройки всей СУБД (создаются пользователи, базы, выполняется репликация и пр.)

Просмотр всех созданных пользователей:
postgres=# \du
Создание нового пользователя, выдача ему прав на создание базы данных, установка пароля для пользователя:
postgres=# CREATE USER korolev;
postgres=# ALTER ROLE korolev CREATEDB;
postgres=# ALTER USER korolev with encrypted password '******';

Выход из клиента psql - CTRL+D
По умолчанию все созданные локальные пользователи имеют метод аутентификации – peer, то есть выполняется аутентификация средствами ОС и при подключении к СУБД из под одноименного пользователя ОС не потребуется введение пароля.
Это регулируется в файле  - /etc/postgresql/11/main/pg_hba.conf

Из оболочки ОС под пользователем korolev создаем базу данных с именем tet
$ createdb tet
Теперь созданная база данных может быть использована пользователем korolev.
Подключение к базе выполняется так:
$ psql -d tet
psql (11.12 (Debian 11.12-0+deb10u1))
Введите "help", чтобы получить справку.
tet=>

Пользователь, создавший базу данных может делать с ней все что захочет.

К базе данных можно подключиться с использованием библиотек языков программирования, например, с помощью библиотеки psycopg2 и Python.
Установка библиотеки psycopg2 для взаимодействия с базой данных:
$ sudo apt install python3-psycopg2
$ sudo apt install libpq-dev


Теперь можно использовать скрипт на Python для выполнения команд

#!/usr/bin/python3
#-*-coding: utf-8-*-

import psycopg2
conn = psycopg2.connect(dbname='tet', user='korolev', password='******', host='localhost')
cursor = conn.cursor()

cursor.execute('SELECT * FROM ats')
for row in cursor:
    print(row)

cursor.close()
conn.close()


понедельник, 21 июня 2021 г.

Debian10. Установка MariaDB, Apache, PHP7 и PHPMYADMIN

1. Установка MariaDB
# apt install mariadb-server
Добавляем в автозапуск и запускаем сервис:
# systemctl enable mariadb
# systemctl start mariadb

Задаем пароль root для сервера MySQL
# mysql_secure_installation
Пароль для root следует ввести ответом на вопрос
    Enter current password for root (enter for none):
Затем отказываемся от смены пароля (Change the root password? [Y/n]) введя «n».
На следующие вопросы отвечаем Да (Y)
    Remove anonymous users? [Y/n] Y
    Disallow root login remotely? [Y/n] Y
    Reload privilege tables now? [Y/n] Y


Затем в тестовом режиме пытаемся подключиться к базе данных:
# mysql -uroot –p
Должны увидеть приглашение
    MariaDB [(none)]>

2.    Установка Web-сервера APACHE
# apt install apache2
Исправляем настройки сервера по умолчанию:
# nano /etc/apache2/sites-available/000-default.conf
Задаем имея серверу используя директиву
ServerName rossyp.su
При необходимости меняем корневую директорию WEB-сервера
DocumentRoot /mnt/www-rossyp
<Directory /mnt/www-rossyp>
         Options FollowSymLinks
         AllowOverride All
         Require all granted
</Directory>

Добавляем сервер Apache в скрипт автозапуска и запускам сервис
# systemctl enable apache2
# systemctl start apache2

Проверяем работу Apache обратившись к серверу через http и убеждаемся, что через браузер сервер отвечает (http://<IP-сервера>)

Для того что бы сам сервер знал всегда свое имя, добавляем это имя в файл hosts
# nano /etc/hosts
Вписываем строку в конец:
127.0.0.1 www.rossyp.su rossyp.ru

Логи у Apache будут в каталоге /var/log/apache2/

3.    Устанавка PHP (7 версия)
# apt install php
Перезапускаем web-сервер
# systemctl restart apache2

Создаем файл для проверки работы PHP
# nano /mnt/www-rossyp/info.php
вписываем туда
<?php phpinfo(); ?>
Теперь при запросе страницы Info.php (http://<IP-сервера>/info.php ) можно увидеть информацию о модуле PHP

4.    Установка PHPMYADMIN
Для работы phpmyadmin нужны несколько пакетов php
# apt install php-mysqli php-xml
# systemctl restart apache2

Примечание: Если этих пакетов не будет, phpmyadmin не запуститься и выдаст ошибку:
Composer detected issues in your platform: Your Composer dependencies require the following PHP extensions to be installed: mysqli, xml
Заходим на страницу проекта https://www.phpmyadmin.net/downloads/ и копируем ссылку на свежий стабильный релиз. В моем случае – это phpMyAdmin-5.1.1-all-languages.tar.gz
# wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.tar.gz
Распаковываем архив и удаляем скаченный ранее файл
# tar xvf phpMyAdmin-5.0.2-all-languages.tar.gz
# rm phpMyAdmin-*.tar.gz

Перемещаем весь архив в папку /mnt/www-phpmyadmin и определяем пользователем директории – www-data
# mkdir /mnt/www-phpmyadmin
# mv phpMyAdmin-5.1.1-all-languages/* /mnt/www-phpmyadmin
# chown -R www-data:www-data /mnt/www-phpmyadmin/

Далее нужно создать файл конфигурации phpmyadmin  - config.inc.php
Создаем файл конфигурации из типового:
# cp /mnt/www-phpmyadmin/config.sample.inc.php /mnt/www-phpmyadmin/config.inc.php
Редактируем созданный файл конфигурации:
# nano /mnt/www-phpmyadmin/config.inc.php
В переменную $cfg['blowfish_secret'] необходимо вписать 32 символа, которые будут использоваться для шифрования пароля в cookies. Например:
$cfg['blowfish_secret'] = 'YTRE137dfgsbvqewdsca6eblfjhsgdye';

Добавляем конфигурацию Apache для phpmyadmin
Для этого в конфиг виртуального хоста (/etc/apache2/sites-available/000-default.conf) добавляем строки после блока описания основной директории:
        <Directory /mnt/www-rossyp>
        …
        </Directory>

       Alias /_pma /mnt/www-phpmyadmin

       <Directory /mnt/www-phpmyadmin>
         AddDefaultCharset UTF-8
         <RequireAny>
          Require all granted
         </RequireAny>
       </Directory>


Перезапускаем сервер Apache
# systemctl restart apache2
Теперь к странице phpmyadmin можно обратиться так:
http://<IP-сервера или доменное имя>/_pma