Архив рубрики: Web сервер

MySQL 5.7 на Rocky Linux

Бывают случаи когда на новом сервере необходимо установить старую версию MySQL 5.7. Не всегда можно перевести работающий ресурс на работу с новой версией или перевод требует больших трудов в изменении кода ресурса.

Вступление

С установкой старой версии PHP 5.6 всё гораздо проще и об этом рассказано в статье Нескольких версий PHP на сервере Linux.

Установку будем делать из бинарного дистрибутива. Перечень возможных бинарных дистрибутивов вы можете посмотреть по ссылке MySQL Community Downloads. Так же, можете ознакомиться с инструкцией по установке версии 5.7.

Можно одновременно установить несколько версий и трудностей с этим не возникнет. Важно указывать правильно пути и названия команд управления. Например, в нашем случае используется mysql-5.7. Кроме того, на одном из серверов мне необходима была только одна версия и всю настройку я сделал с учетом что будет использоваться только mysql.

При выполнении резервной копии базы данных и востановлении не забываем указывать правильное имя сервиса.

Более подробно об установке и настройке Rocky Linux вы можете в статье Rocky Linux 8 установка и настройка.

Предварительная подготовка

Установим необходимые пакеты которые нам могут потребоваться:

dnf install libaio  libaio-devel libncurses* tar wget

Создаём необходимую группу и пользователя:

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

Скачиваем исходник MySQL 5.7

Скачиваем необходимую версию:

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Распаковываем архив без вывода информации о процессе:

tar -zxf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Или с выводом информации:

tar zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Устанавливаем MySQL 5.7

Переименовываем и переносим папку в необходимое место:

mv mysql-5.7.37-linux-glibc2.12-x86_64 /opt/mysql-5.7

Создаём необходимые ссылки:

ln -s /opt/mysql-5.7/bin/mysql /usr/local/bin/mysql-5.7
ln -s /opt/mysql-5.7/bin/mysqldump /usr/local/bin/mysqldump-5.7

Переходим в папку и создаем папку под данные с назначением необходимых прав:

cd /opt/mysql-5.7
mkdir ./data
chown mysql:mysql ./data
chmod 755 ./data

Произведем начальную настройку сервера MySQL:

/opt/mysql-5.7 # ./bin/mysqld --initialize --user=mysql --basedir=./ --character-set-server=utf8
= вывод команды =
2022-02-02T06:37:58.431193Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp 
server option (see documentation for more details).
2022-02-02T06:38:00.706137Z 0 [Warning] InnoDB: New log files created, LSN=45790
2022-02-02T06:38:01.541332Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2022-02-02T06:38:01.967699Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: ab3a127b-83f2-11ec-a16b-0e4799458f07.
2022-02-02T06:38:02.022913Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2022-02-02T06:38:03.275737Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2022-02-02T06:38:03.275828Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2022-02-02T06:38:03.276874Z 0 [Warning] CA certificate ca.pem is self signed.
2022-02-02T06:38:03.592321Z 1 [Note] A temporary password is generated for root@localhost: zRD?OXe,5NsfvfgTI

В выводе присутствует пароль который потребуется нам позже.

Копируем в необходимое место:

cp support-files/mysql.server /etc/init.d/mysql-5.7

Открываем и приводим к коду указанному ниже в спойлере:

vim /etc/init.d/mysql-5.7
Необходимый код файла /etc/init.d/mysql-5.7
#!/bin/sh
# Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
# This file is public domain and comes with NO WARRANTY of any kind
 
# MySQL daemon start/stop script.
 
# Usually this is put in /etc/init.d (at least on machines SYSV R4 based
# systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
# When this is done the mysql server will be started when the machine is
# started and shut down when the systems goes down.
 
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine.
 
# Comments to support LSB init script conventions
### BEGIN INIT INFO
# Provides: mysql-5.7
# Required-Start: $local_fs $network $remote_fs
# Should-Start: ypbind nscd ldap ntpd xntpd
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop MySQL
# Description: MySQL is a very fast and reliable SQL database engine.
### END INIT INFO
 
# If you install MySQL on some other places than /usr/local/mysql, then you
# have to do one of the following things for this script to work:
#
# - Run this script from within the MySQL installation directory
# - Create a /etc/my.cnf file with the following information:
#   [mysqld]
#   basedir=<path-to-mysql-installation-directory>
# - Add the above to any other configuration file (for example ~/.my.ini)
#   and copy my_print_defaults to /usr/bin
# - Add the path to the mysql-installation-directory to the basedir variable
#   below.
#
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
 
# If you change base dir, you must also change datadir. These may get
# overwritten by settings in the MySQL configuration files.
 
basedir=/opt/mysql-5.7
datadir=
mycnf=/etc/mysql/5.7/my.cnf
 
# Default value, in seconds, afterwhich the script should timeout waiting
# for server start. 
# Value here is overriden by value in my.cnf. 
# 0 means don't wait at all
# Negative numbers mean to wait indefinitely
service_startup_timeout=900
 
# Lock directory for RedHat / SuSE.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"
 
# The following variables are only set for letting mysql.server find things.
 
# Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
then
  basedir=/usr/local/mysql
  bindir=/usr/local/mysql/bin
  if test -z "$datadir"
  then
    datadir=/usr/local/mysql/data
  fi
  sbindir=/usr/local/mysql/bin
  libexecdir=/usr/local/mysql/bin
else
  bindir="$basedir/bin"
  if test -z "$datadir"
  then
    datadir="$basedir/data"
  fi
  sbindir="$basedir/sbin"
  libexecdir="$basedir/libexec"
fi
 
# datadir_set is used to determine if datadir was set (and so should be
# *not* set inside of the --basedir= handler.)
datadir_set=
 
#
# Use LSB init script functions for printing messages, if possible
#
lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
  . $lsb_functions
else
  log_success_msg()
  {
    echo " SUCCESS! $@"
  }
  log_failure_msg()
  {
    echo " ERROR! $@"
  }
fi
 
PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"
export PATH
 
mode=$1    # start or stop
 
[ $# -ge 1 ] && shift
 
 
other_args="$*"   # uncommon, but needed when called from an RPM upgrade action
           # Expected: "--skip-networking --skip-grant-tables"
           # They are not checked here, intentionally, as it is the resposibility
           # of the "spec" file author to give correct arguments only.
 
case `echo "testing\c"`,`echo -n testing` in
    *c*,-n*) echo_n=   echo_c=     ;;
    *c*,*)   echo_n=-n echo_c=     ;;
    *)       echo_n=   echo_c='\c' ;;
esac
 
parse_server_arguments() {
  for arg do
    case "$arg" in
      --basedir=*)  basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
                    bindir="$basedir/bin"
		    if test -z "$datadir_set"; then
		      datadir="$basedir/data"
		    fi
		    sbindir="$basedir/sbin"
		    libexecdir="$basedir/libexec"
        ;;
      --datadir=*)  datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
		    datadir_set=1
	;;
      --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
      --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
    esac
  done
}
 
wait_for_pid () {
  verb="$1"           # created | removed
  pid="$2"            # process ID of the program operating on the pid-file
  pid_file_path="$3" # path to the PID file.
 
  i=0
  avoid_race_condition="by checking again"
 
  while test $i -ne $service_startup_timeout ; do
 
    case "$verb" in
      'created')
        # wait for a PID-file to pop into existence.
        test -s "$pid_file_path" && i='' && break
        ;;
      'removed')
        # wait for this PID-file to disappear
        test ! -s "$pid_file_path" && i='' && break
        ;;
      *)
        echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
        exit 1
        ;;
    esac
 
    # if server isn't running, then pid-file will never be updated
    if test -n "$pid"; then
      if kill -0 "$pid" 2>/dev/null; then
        :  # the server still runs
      else
        # The server may have exited between the last pid-file check and now.  
        if test -n "$avoid_race_condition"; then
          avoid_race_condition=""
          continue  # Check again.
        fi
 
        # there's nothing that will affect the file.
        log_failure_msg "The server quit without updating PID file ($pid_file_path)."
        return 1  # not waiting any more.
      fi
    fi
 
    echo $echo_n ".$echo_c"
    i=`expr $i + 1`
    sleep 1
 
  done
 
  if test -z "$i" ; then
    log_success_msg
    return 0
  else
    log_failure_msg
    return 1
  fi
}
 
# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x "$bindir/my_print_defaults";  then
  print_defaults="$bindir/my_print_defaults"
else
  # Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    for d in $dirs
    do
      d=`echo $d | sed -e 's/[ 	]//g'`
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
    done
  fi
 
  # Hope it's in the PATH ... but I doubt it
  test -z "$print_defaults" && print_defaults="my_print_defaults"
fi
 
#
# Read defaults file from 'basedir'.   If there is no defaults file there
# check if it's in the old (depricated) place (datadir) and read it from there
#
 
extra_args=""
if test -r "$basedir/my.cnf"
then
  extra_args="-e $basedir/my.cnf"
fi
 
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
 
#
# Set pid file if not given
#
if test -z "$mysqld_pid_file_path"
then
  mysqld_pid_file_path=$datadir/`hostname`.pid
else
  case "$mysqld_pid_file_path" in
    /* ) ;;
    * )  mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
  esac
fi
 
case "$mode" in
  'start')
    # Start daemon
 
    # Safeguard (relative paths, core dumps..)
    cd $basedir
 
    echo $echo_n "Starting MySQL"
    if test -x $bindir/mysqld_safe
    then
      # Give extra arguments to mysqld with the my.cnf file. This script
      # may be overwritten at next upgrade.
      $bindir/mysqld_safe --defaults-file="$mycnf" --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
      wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
 
      # Make lock for RedHat / SuSE
      if test -w "$lockdir"
      then
        touch "$lock_file_path"
      fi
 
      exit $return_value
    else
      log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
    fi
    ;;
 
  'stop')
    # Stop daemon. We use a signal here to avoid having to know the
    # root password.
 
    if test -s "$mysqld_pid_file_path"
    then
      # signal mysqld_safe that it needs to stop
      touch "$mysqld_pid_file_path.shutdown"
 
      mysqld_pid=`cat "$mysqld_pid_file_path"`
 
      if (kill -0 $mysqld_pid 2>/dev/null)
      then
        echo $echo_n "Shutting down MySQL"
        kill $mysqld_pid
        # mysqld should remove the pid file when it exits, so wait for it.
        wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
      else
        log_failure_msg "MySQL server process #$mysqld_pid is not running!"
        rm "$mysqld_pid_file_path"
      fi
 
      # Delete lock for RedHat / SuSE
      if test -f "$lock_file_path"
      then
        rm -f "$lock_file_path"
      fi
      exit $return_value
    else
      log_failure_msg "MySQL server PID file could not be found!"
    fi
    ;;
 
  'restart')
    # Stop the service and regardless of whether it was
    # running or not, start it again.
    if $0 stop  $other_args; then
      $0 start $other_args
    else
      log_failure_msg "Failed to stop running server, so refusing to try to start."
      exit 1
    fi
    ;;
 
  'reload'|'force-reload')
    if test -s "$mysqld_pid_file_path" ; then
      read mysqld_pid <  "$mysqld_pid_file_path"
      kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
      touch "$mysqld_pid_file_path"
    else
      log_failure_msg "MySQL PID file could not be found!"
      exit 1
    fi
    ;;
  'status')
    # First, check to see if pid file exists
    if test -s "$mysqld_pid_file_path" ; then 
      read mysqld_pid < "$mysqld_pid_file_path"
      if kill -0 $mysqld_pid 2>/dev/null ; then 
        log_success_msg "MySQL running ($mysqld_pid)"
        exit 0
      else
        log_failure_msg "MySQL is not running, but PID file exists"
        exit 1
      fi
    else
      # Try to find appropriate mysqld process
      mysqld_pid=`pidof $libexecdir/mysqld`
 
      # test if multiple pids exist
      pid_count=`echo $mysqld_pid | wc -w`
      if test $pid_count -gt 1 ; then
        log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)"
        exit 5
      elif test -z $mysqld_pid ; then 
        if test -f "$lock_file_path" ; then 
          log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists"
          exit 2
        fi 
        log_failure_msg "MySQL is not running"
        exit 3
      else
        log_failure_msg "MySQL is running but PID file could not be found"
        exit 4
      fi
    fi
    ;;
    *)
      # usage
      basename=`basename "$0"`
      echo "Usage: $basename  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]"
      exit 1
    ;;
esac
 
exit 0

[свернуть]

Назначаем необходимые права:

chmod +x /etc/init.d/mysql-5.7

Создаем папку для конфигурации сервера и создаём файл конфигурации:

mkdir -p /etc/mysql/5.7
vim /etc/mysql/5.7/my.cnf
= необходимый код =
[client]
default-character-set = utf8
port = 3307
socket = /tmp/mysql-5.7.sock
 
[mysqld]
basedir = /opt/mysql-5.7
bind-address = 0.0.0.0
character-set-server = utf8
collation-server = utf8_general_ci
port = 3307
socket = /tmp/mysql-5.7.sock
default-authentication-plugin = mysql_native_password
server-id = 1
 
[mysqldump]
quick
max_allowed_packet = 16M
 
[mysql]
default-character-set = utf8
no-auto-rehash

Обращаю внимание что указывается не стандартный порт для работы сервиса. Можете указать стандартный порт 3306 для работы MySQL.

Добавляем в автозагрузку и запускаем:

systemctl enable mysql-5.7 
systemctl start mysql-5.7

= или одной командой =
systemctl enable --now mysql-5.7

Авторизуемся, меняем пароль и смотрим статус работы сервера MySQL:

/opt/mysql-5.7 # mysql-5.7 --defaults-file=/etc/mysql/5.7/my.cnf -u root -p
Enter password: вводим пароль от root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.37
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> STATUS;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
= вывод нам говорит что необходимо сменить пароль и мы его меняем =
mysql> SET PASSWORD = PASSWORD('пароль');
Query OK, 0 rows affected, 1 warning (0,00 sec)
= выходим =
mysql> \q
Bye
= авторизуемся с новым паролем =
/opt/mysql-5.7 # mysql-5.7 --defaults-file=/etc/mysql/5.7/my.cnf -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.37 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> STATUS;
= вывод команды =
--------------
mysql-5.7  Ver 14.14 Distrib 5.7.37, for linux-glibc2.12 (x86_64) using  EditLine wrapper
 
Connection id:		3
Current database:	
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.37 MySQL Community Server (GPL)
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/tmp/mysql-5.7.sock
Uptime:			2 min 15 sec
 
Threads: 1  Questions: 9  Slow queries: 0  Opens: 109  Flush tables: 1  Open tables: 102  Queries per second avg: 0.066
--------------
 
mysql> \q
Bye

Заключение

Поддерживать систему в актуальном состоянии важно и нужно. Все необходимые старые версии программного обеспечения вы всегда сможете установить с небольшими усилиями.

Нескольких версий PHP на сервере Linux

Несколько версий PHP на сервере Linux удобно в работе и последующем обслуживании.  В статье пример на базе Rocky Linux , но вы можете использовать его и для других систем использующих репозиторий RHEL.

Введение

Для любого системного администратора обновление версий PHP является задачей не простой и очень ответственной. При использовании на сервере одной версии php в процессе перехода на новую версию приходиться делать много действий необходимых для безотказной работы ресурса на период обновления. Сюрпризы могут подстерегать на любом моменте и спрогнозировать их крайне сложно.

В этой статье я описал механизм того как можно совершенно спокойно обновлять версии PHP не создавая проблем в работе пользователей с рабочим ресурсом.

Предварительная подготовка

Для работы с разными версиями php на одном сервере нам необходимо произвести предварительную настройку системы.

Установка и настройка сервера

При написании статьи учитывается что настройка сервера была произведена согласно статьи Rocky Linux 8 установка и настройка.

Команды которые дают доступ к серверу по 80 и 443 порту в случае использования FirewallD:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Из статьи FirewallD базовая настройка вы можете узнать более подробно как работать с этим сервисом.

Перед началом использования репозитория Remi (на базе которого мы и будем устанавливать разные версии PHP) необходимо подключить репозиторий Epel созданный группой специалистов операционной системы Fedora. Пакеты из Epel репозитория никогда не конфликтуют и не переустанавливают базовые пакеты RHEL.

Установка Epel для дистрибутивов на базе RHEL производится командой:

dnf install epel-release
dnf update

Установка и настройка Nginx

При написании статьи учитывается что настройка Nginx была произведена согласно статьи NGINX установка и настройка.

Установка базовой версии PHP

Про актуальность разных версий PHP можно узнать на сайте Supported Versions PHP.

Посмотрим какие варианты присутствуют в базовой версии:

# dnf module list php
Последняя проверка окончания срока действия метаданных: 1:27:39 назад, Ср 10 ноя 2021 11:34:45.
Rocky Linux 8 - AppStream
Name   Stream    Profiles                     Summary 
php    7.2 [d]   common [d], devel, minimal   PHP scripting language 
php    7.3       common [d], devel, minimal   PHP scripting language 
php    7.4       common [d], devel, minimal   PHP scripting language

Подсказка: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Видим что в базовой версии по умолчанию находится версия 7.2 её и будем устанавливать.

Установим php и наиболее популярные модули, которые могут пригодится в процессе эксплуатации веб сервера.

dnf install php php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache

Проверим установленную версию выполнив команду в консоли сервера:

php -v
= вывод команды =
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.24, Copyright (c) 1999-2018, by Zend Technologies

Для того чтобы связать nginx и php будем использовать мост php-fpm. Основной файл настройки находится по пути /etc/php-fpm.conf и там должен быть параметр include=/etc/php-fpm.d/*.conf говорящий о том где лежат настройки пулов.

Запускаем php-fpm и добавляем в автозагрузку:

systemctl enable --now php-fpm

Проверяем, запустился ли он.

systemctl status php-fpm
= вывод команды =
 php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2021-11-10 13:51:24 EST; 16s ago
Main PID: 7567 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 6 (limit: 23681)
Memory: 17.3M
CGroup: /system.slice/php-fpm.service
        ├─7567 php-fpm: master process (/etc/php-fpm.conf)
        ├─7568 php-fpm: pool www
        ├─7569 php-fpm: pool www
        ├─7570 php-fpm: pool www
        ├─7571 php-fpm: pool www
        └─7572 php-fpm: pool www

ноя 10 13:51:24 localhost.localdomain systemd[1]: Starting The PHP FastCGI Process Manager...
ноя 10 13:51:24 localhost.localdomain systemd[1]: Started The PHP FastCGI Process Manager.

Из вывода видно сервис успешно работает.

Настройки php находятся по стандартному пути /etc/php.ini а настройки пулов лежат в папке /etc/php-fpm.d/.

Использовать порт или сокет решать вам, но говорят что сокет использовать лучше. Запустим php-fpm через unix сокет. Для этого переименуем конфиг /etc/php-fpm.d/www.conf, создадим новый и приводим к следующему виду:

mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf_orig
vim /etc/php-fpm.d/www.conf
= необходимый код =
[www]
user = nginx
group = nginx
;listen = 127.0.0.1:9000
listen = /run/php-fpm/www.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
;pm.process_idle_timeout = 10s;
;pm.max_requests = 500

slowlog = /var/log/php-fpm/www-slow.log

;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
php_value[opcache.file_cache]  = /var/lib/php/opcache

Вы можете для каждого сайта создать свой пул и указать там все необходимые параметры. Например, для каждого сайта я создаю свой пул для гибкости настройки и благодаря этому я настраиваю корректный доступ к файлам по sftp. Более подробно про настройку доступа по SFTP прочтите в статье SFTP настройка для веб хостинга.

Назначим каталогу /var/lib/php правильное владение:

=== было ===
ls -l /var/lib/php
= вывод команды =
итого 0
drwxrwx--- 2 root apache  6 окт 22 12:08 opcache
drwxr-xr-x 2 root root   59 окт 28 10:05 peclxml
drwxrwx--- 2 root apache  6 окт 22 12:08 session
drwxrwx--- 2 root apache  6 окт 22 12:08 wsdlcache

=== Назначаем правильные права ===
chown -R root:nginx /var/lib/php

Перезапускаем php-fpm командой:

systemctl restart php-fpm

Проверяем, стартовал ли указанный сокет.

ll /run/php-fpm/www.sock 
srw-rw---- 1 nginx nginx 0 фев 13 10:35 /run/php-fpm/www.sock

Всё успешно настроено.

В настройках nginx для сайта необходимо указать требуемый пул.

Например, прописать код fastcgi_pass unix:/run/php-fpm/www.sock; в секции location ~ \.php$

Настройка базовой версии закончена и приступаем к установке других версий php.

Версии PHP от Remi

Есть замечательный человек Remi Collet, который создал репозиторий пользующийся огромной популярностью у пользователей операционных систем на базе RHEL. Познакомится с новостями репозитория можно на блоге Remi Collet.

Подключаем репозиторий Remi, выполнив следующую команду:

dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Посмотрим список всех доступных вариантов установки php:

dnf module list php
= вывод команды =
Safe Remi's RPM repository for Enterprise Linux 8 - x86_64 1.6 MB/s | 2.0 MB 00:01 
Rocky Linux 8 - AppStream
Name   Stream    Profiles                     Summary 
php    7.2 [d]   common [d], devel, minimal   PHP scripting language 
php    7.3       common [d], devel, minimal   PHP scripting language 
php    7.4       common [d], devel, minimal   PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name   Stream    Profiles                     Summary 
php    remi-7.2  common [d], devel, minimal   PHP scripting language 
php    remi-7.3  common [d], devel, minimal   PHP scripting language 
php    remi-7.4  common [d], devel, minimal   PHP scripting language 
php    remi-8.0  common [d], devel, minimal   PHP scripting language 
php    remi-8.1  common [d], devel, minimal   PHP scripting language

Подсказка: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Из вывода выше видно что появилась возможность установить версии от 7.2 до 8.1 из реппозитрия Remi.

В выводе нет информации о возможности установить PHP версии 5.6, но сделать это можно по аналогии как мы будем устанавливать версии ниже. Достаточно указать код #dnf install php56 php56-php-fpm

Для чистоты эксперимента и наглядности установим две версии 7.4 и 8.1

В результате мы получим на сервере 3 разных версии php.

Установка версий PHP от Remi

Активируем репу php remi-7.4, для этого выполняем команды:

dnf module reset php
dnf module enable php:remi-7.4

При желании можно убедится что версия выбрана правильно выполнив команду:

dnf module list php

Установим php remi-7.4 и все популярные модули следующей командой:

dnf install php74 php74-php-fpm php74-php-cli php74-php-mysqlnd php74-php-gd php74-php-ldap php74-php-odbc php74-php-pdo php74-php-pear php74-php-xml php74-php-xmlrpc php74-php-mbstring php74-php-snmp php74-php-soap php74-php-zip php74-php-opcache

Обращаю особое внимание на указание именно php74 перед требуемыми пакетами. Только при таком названии пакетов установятся необходимые и не возникнет путаницы.

Сразу установим версию php 8.1 из репозитория Remi и выключим активную версию:

dnf module reset php 
dnf module enable php:remi-8.1
dnf install php81 php81-php-fpm php81-php-cli php81-php-mysqlnd php81-php-gd php81-php-ldap php81-php-odbc php81-php-pdo php81-php-pear php81-php-xml php81-php-xmlrpc php81-php-mbstring php81-php-snmp php81-php-soap php81-php-zip php81-php-opcache
dnf module reset php

После установки обеих версий PHP запустим оба сервиса и включим его в автозагрузку с помощью следующих команд:

systemctl enable --now php74-php-fpm
systemctl enable --now php81-php-fpm

Проверим статус выполнив команду:

# systemctl status php74-php-fpm
 php74-php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php74-php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2021-11-10 15:00:54 EST; 24s ago
Main PID: 8787 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 6 (limit: 23681)
Memory: 16.2M
CGroup: /system.slice/php74-php-fpm.service
       ├─8787 php-fpm: master process (/etc/opt/remi/php74/php-fpm.conf)
       ├─8788 php-fpm: pool www
       ├─8789 php-fpm: pool www
       ├─8790 php-fpm: pool www
       ├─8791 php-fpm: pool www
       └─8792 php-fpm: pool www

ноя 10 15:00:54 localhost.localdomain systemd[1]: Starting The PHP FastCGI Process Manager...
ноя 10 15:00:54 localhost.localdomain systemd[1]: Started The PHP FastCGI Process Manager.

Показан вывод версии php74 для версии php81 будет аналогичный.

Покажу дальнейшую настройку только для версии php74, так как настройка для php81 будет аналогичной.

Настройки php74 находятся по пути /etc/opt/remi/php74/php.ini а настройки пулов лежат в папке /etc/opt/remi/php74/php-fpm.d/.

Запустим php74-php-fpm через unix сокет. Для этого скопируем конфиг /etc/opt/remi/php74/php-fpm.d/www.conf и приведем оригинал к следующему виду:

cp /etc/opt/remi/php74/php-fpm.d/www.conf /etc/opt/remi/php74/php-fpm.d/www.conf-orig
vim /etc/opt/remi/php74/php-fpm.d/www.conf
= необходимый код =
[www]
user = nginx
group = nginx

listen = /var/opt/remi/php74/run/php-fpm/www.sock

;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

listen.acl_users = nginx
listen.acl_groups = nginx

listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

slowlog = /var/opt/remi/php74/log/php-fpm/www-slow.log

php_admin_value[error_log] = /var/opt/remi/php74/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M

php_value[session.save_handler] = files
php_value[session.save_path] = /var/opt/remi/php74/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/opt/remi/php74/lib/php/wsdlcache
;php_value[opcache.file_cache] = /var/opt/remi/php74/lib/php/opcache

Назначим каталогу /var/opt/remi/php74/lib/php правильное владение:

=== было ===
ls -l /var/opt/remi/php74/lib/php
= вывод команды =
итого 0
drwxrwx--- 2 root apache 6 окт 20 02:01 opcache
drwxr-xr-x 2 root root 36 ноя 10 14:49 peclxml
drwxrwx--- 2 root apache 6 окт 20 02:01 session
drwxrwx--- 2 root apache 6 окт 20 02:01 wsdlcache
=== Назначаем правильные права ===
chown -R root:nginx /var/opt/remi/php74/lib/php

Перезапускаем php-fpm командой:

systemctl restart php74-php-fpm

Проверяем, стартовал ли указанный сокет.

ll /var/opt/remi/php74/run/php-fpm/www.sock
srw-rw----+ 1 root root 0 ноя 10 15:46 /var/opt/remi/php74/run/php-fpm/www.sock

Всё успешно настроено.

В настройках nginx для сайта необходимо указать требуемый пул.

Например, прописать код fastcgi_pass unix:/var/opt/remi/php74/run/php-fpm/www.sock; в секции location ~ \.php$

Создание структуры каталогов для сайтов

Создадим корневые каталоги для сайтов.  Каждый сайт будет использовать свою версию php:

mkdir /var/www/php72 
mkdir /var/www/php74
mkdir /var/www/php81

Назначим необходимые права собственности и доступа на корневые каталоги сайтов:

chown -R nginx:nginx /var/www/php72
chown -R nginx:nginx /var/www/php74
chown -R nginx:nginx /var/www/php81
chmod -R 755 /var/www/php72
chmod -R 755 /var/www/php74
chmod -R 755 /var/www/php81

Команда chown передает права на каталоги сайтов пользователю nginx и группе nginx. Команда chmod изменяет права доступа этого пользователя и группы.

В каждом корневом каталоге мы создадим файл info.php. Позже он поможет нам отобразить информацию о версии PHP каждого веб-сайта:

echo "<?php phpinfo(); ?>" > /var/www/php72/info.php
echo "<?php phpinfo(); ?>" > /var/www/php74/info.php
echo "<?php phpinfo(); ?>" > /var/www/php81/info.php

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

<?php
// Показывать всю информацию, по умолчанию INFO_ALL
//phpinfo();
// Показывать информацию только о загруженных модулях.
phpinfo(INFO_MODULES);
?>

Конфигурации NGIN для сайтов

Создадим для для каждого сайта свои конфигурационные файлы:

vim /etc/nginx/conf.d/php72.loc.conf
= необходимый код =
# php72.loc
server {
listen 80;
server_name php72.loc;

#access_log /var/www/php72/access_log main;
#error_log /var/www/php72/error_log info;
root /var/www/php72/;
index index.php;

    location ~ \.php$ {
    fastcgi_pass unix:/run/php-fpm/www.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    #fastcgi_param HTTPS on;
    
    # Свои параметры PHP  
    fastcgi_param PHP_VALUE "cgi.fix_pathinfo = 0";
    fastcgi_param PHP_VALUE "max_execution_time = 300"; 
    fastcgi_param PHP_VALUE "short_open_tag = On";
    fastcgi_param PHP_VALUE "post_max_size = 12M";
    fastcgi_param PHP_VALUE "upload_max_filesize = 12M";
    fastcgi_param PHP_VALUE "max_input_time = 300";
    #fastcgi_param PHP_VALUE "date.timezone = Europe/Moscow";

    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }
}
vim /etc/nginx/conf.d/php74.loc.conf
= необходимый код =
# php74.loc
server {
listen 80;
server_name php74.loc;

#access_log /var/www/php74/access_log main;
#error_log /var/www/php74/error_log info;

root /var/www/php74/;
index index.php;

    location ~ \.php$ {
    fastcgi_pass unix:/var/opt/remi/php74/run/php-fpm/www.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    #fastcgi_param HTTPS on;
    
    # Свои параметры PHP  
    fastcgi_param PHP_VALUE "cgi.fix_pathinfo = 0";
    fastcgi_param PHP_VALUE "max_execution_time = 300"; 
    fastcgi_param PHP_VALUE "short_open_tag = On";
    fastcgi_param PHP_VALUE "post_max_size = 12M";
    fastcgi_param PHP_VALUE "upload_max_filesize = 12M";
    fastcgi_param PHP_VALUE "max_input_time = 300";
    fastcgi_param PHP_VALUE "date.timezone = Europe/Moscow";

    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }
}
vim /etc/nginx/conf.d/php81.loc.conf
= необходимый код =
# php81.loc
server {
listen 80;
server_name php81.loc;

#access_log /var/www/php81/access_log main;
#error_log /var/www/php81/error_log info;

root /var/www/php81/;
index index.php;

    location ~ \.php$ {
    fastcgi_pass unix:/var/opt/remi/php81/run/php-fpm/www.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    #fastcgi_param HTTPS on;
    
    # Свои параметры PHP  
    fastcgi_param PHP_VALUE "cgi.fix_pathinfo = 0";
    fastcgi_param PHP_VALUE "max_execution_time = 300"; 
    fastcgi_param PHP_VALUE "short_open_tag = On";
    fastcgi_param PHP_VALUE "post_max_size = 12M";
    fastcgi_param PHP_VALUE "upload_max_filesize = 12M";
    fastcgi_param PHP_VALUE "max_input_time = 300";
    fastcgi_param PHP_VALUE "date.timezone = Europe/Minsk";

    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }
}

Во всех файлах выделены строчки в которых делались изменения.

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

# Свои параметры PHP 
fastcgi_param PHP_VALUE "cgi.fix_pathinfo = 0"; 
fastcgi_param PHP_VALUE "max_execution_time = 300"; 
fastcgi_param PHP_VALUE "short_open_tag = On"; 
fastcgi_param PHP_VALUE "post_max_size = 12M"; 
fastcgi_param PHP_VALUE "upload_max_filesize = 12M"; 
fastcgi_param PHP_VALUE "max_input_time = 300"; 
fastcgi_param PHP_VALUE "date.timezone = Europe/Moscow";

Используя этот код можно использовать различные ресурсы с разными параметрами php использующими одну версию php.

Проверка работы

Для проверки нам необходимо или прописать для каждого тестируемого ресурса DNS или на компьютере с которого производим проверку внести необходимые правки. В нашем случае система с которой проводится проверка работает на базе Linux и там необходимо внести следующие правки:

vim /etc/hosts
= необходимые добавления =
192.168.0.206 php72.loc
192.168.0.206 php74.loc
192.168.0.206 php81.loc

Для проверки необходимо в строке браузера вписать путь http://ДОМЕН/info.php.

Вот так выглядит вывод для разных сайтов:

 

 

Обновление версий PHP

Обновление версий происходит обычным механизмом обновления и последующим перезапуском необходимых сервисов.

Для нашего случая команды будут иметь такую последовательность:

dnf update

nginx -s reload

systemctl restart php-fpm
systemctl restart php74-php-fpm
systemctl restart php81-php-fpm

Используя разные версии php на одном ресурсе можно спокойно перевести работу ресурса на новую версию и в случае проблем в работе оперативно вернутся на старую.

При использовании не сервере одной версии при переходе на другую версию необходимо было выполнять следующие действия:

  • Остановка php-fpm,
  • Вывод и удаление всех имеющихся пакетов php,
  • Удаление старого и активирование нового репозитория требуемой версии php,
  • Установка новой версии,
  • Проверка настрое из старой версии,
  • Запуск php-fpm и проверка сервиса.

Если ресурс рабочий выполнять все действия приходится оперативно и очень аккуратно для минимизирования простоя в работе ресурса.

Заключение

Данный вариант работы с разными версиями меня вполне устраивает и не вызывает проблем. В статье я специально сделал установку версии как с базовых репозиториев так и с репозитория Remi. На практике использовать базовый репозиторий не удобно, так как не удобно просматривать какие именно пакеты установлены в базовой версии. Запрос   # rpm -qa | grep php выведет все имеющиеся версии.

Рекомендую использовать версии PHP от Remi это удобно и вызывает меньше путаницы.

Гораздо удобней смотреть вывод такой команды:

# rpm -qa | grep php81
php81-php-fpm-8.1.0~rc6-1.el8.remi.x86_64
php81-php-pecl-zip-1.20.0-1.el8.remi.x86_64
php81-php-soap-8.1.0~rc6-1.el8.remi.x86_64
php81-runtime-8.1-2.el8.remi.x86_64
php81-php-process-8.1.0~rc6-1.el8.remi.x86_64
php81-php-mysqlnd-8.1.0~rc6-1.el8.remi.x86_64
php81-php-xml-8.1.0~rc6-1.el8.remi.x86_64
php81-php-opcache-8.1.0~rc6-1.el8.remi.x86_64
php81-php-sodium-8.1.0~rc6-1.el8.remi.x86_64
php81-php-pecl-xmlrpc-1.0.0~rc2-3.el8.remi.x86_64
php81-php-ldap-8.1.0~rc6-1.el8.remi.x86_64
php81-php-pdo-8.1.0~rc6-1.el8.remi.x86_64
php81-php-mbstring-8.1.0~rc6-1.el8.remi.x86_64
php81-php-pear-1.10.13-1.el8.remi.noarch
php81-php-gd-8.1.0~rc6-1.el8.remi.x86_64
php81-php-common-8.1.0~rc6-1.el8.remi.x86_64
php81-libzip-1.8.0-1.el8.remi.x86_64
php81-php-odbc-8.1.0~rc6-1.el8.remi.x86_64
php81-php-cli-8.1.0~rc6-1.el8.remi.x86_64
php81-8.1-2.el8.remi.x86_64
php81-php-snmp-8.1.0~rc6-1.el8.remi.x86_64

В любом случае какие версии использовать и с какими параметрами использовать необходимо смотреть в каждом конкретном случае. Нормальные разработчики ресурсов всегда указывают какие необходимо использовать версии php и с какими параметрами.

Регистрация домена и его управление

Регистрация домена и его управление процедура не сложная, но имеет некоторые нюансы.  Существует возможность зарегистрировать домен у разных регистраторов, но я нашел самый выгодный и удобный вариант по регистрации и продлению доменов.

Введение

В статье расскажу как на практике произвожу регистрацию и управление доменом когда клиенты просят зарегистрировать домен.

Требования предъявляются следующие:

  • Минимальная цена регистрации и продления;
  • Управление доменом без привязки к компаниям оказывающим услуги хостинга;
  • Удобное и понятное управление доменом;
  • Простая передача прав владельцу домена.

Схема проста и имеет несколько шагов:

  1. Регистрация почты на Yandex;
  2. Регистрация домена у регистратора RuWEB;
  3. Делегирование прав на Reg.ru
  4. Добавление домена в Yandex Коннект;
  5. Подтверждение прав с помощью Reg.ru.

Теперь обо всём расскажу по порядку.

Регистрация почты на Yandex

Регистрация почты на Yandex обусловлена тем что зарегистрированный домен будет подключен к сервису Yandex Коннект. Откуда можно создавать и контролировать почтовые ящики по типу имя@домен и управлять DNS записями домена.

При желании можно воспользоваться и другими услугами. Например, я создаю отдельный почтовый ящик куда в Yandex Диск кладу резервные копии данных сайта.

Внешний вид и все настройки для почтового ящика будут соответствовать всем возможностям почтового сервиса Yandex.

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

Действия у регистратора RuWEB

Были времена когда регистрация домена и его продление имели одинаковую стоимость, но это время прошло и теперь один и тот же домен можно зарегистрировать за разную цену.

Может кому конечно и нужны такие тарифы на продление, но в большинстве случаев это просто навязанные услуги.

У регистратора RuWEB цены на регистрацию и продление остались стабильными и по разговору со службой поддержки я понял что они не планируют повышать цены.

Например, был один домен цена продления которого была в районе 1000 рублей. Переведя его на управление в RuWEB я был приятно удивлен что у них цена продления будет 330 рублей.

Для регистрации на RuWEB просьба использовать ссылку https://ruweb.net/?from=11370.

В ссылке добавлен партнерской код. В случае если вы зарегистрируйтесь в системе по этой ссылке мне будут приходить небольшие суммы с каждой вашей оплаты. Цена для вас что по моей ссылке что без неё будет одинаковая.

Скажу сразу такая схема сотрудничества очень распространена и частенько ради этих вознаграждений люди рекламируют продукты которые этого совсем не заслуживают.

Например, ребята с adminvps.ru сделали очень хитрых ход по продвижению своих услуг. Мне на почту пришло сообщение что им понравился мой сайт и они хотят повесить баннер за выгодное мне вознаграждение. После не долгих переговоров я повесил баннер в надежде на выгодное мне сотрудничество. Ребята предлагали и бесплатный хостинг и помесячную оплату, но дальше разговоров ничего не пошло. В результате когда прошел месяц и я обратился с вопросом об оплате они еще раз предложили бесплатный хостинг с минимальным тарифом а когда я отказался сказали что не будут у меня рекламировать. Компания такая прошла у них на ура, так как в течении нескольких месяцев я встречал их баннер на большом количестве сайтов, но спустя время народ просек фишку и больше такого большого количества баннеров на тематических сайтах вы не увидите.

Для меня не приемлемо рекламировать продукт если заведомо знаю что есть варианты лучше.

Главное при регистрации на RuWEB укажите почту которую специально создали в Yandex.

Сравнение цен у разных регистраторов доменов

Например, возьмем домен slavna44.ru и посмотрим сколько будет стоить регистрация домена и его продление у разных регистраторов.

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

Вот что предлагает reg.ru:

Вот что предлагает nic.ru:

Вот какие варианты предлагает ruweb.net:

Вы всё еще думайте где регистрировать и продлевать домен? Я нет.

Если домен уже зарегистрирован вы можете его перенести и платить меньше.

Упускаю моё недовольство что у других регистраторов цена продления спрятана и не так то просто сразу найти её. RuWEB в простом и понятном виде показывает всю информацию о возможных вариантах регистрации и сразу показывает цену продления.

Регистрация домена

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

Желательно указать свою рабочую почту при регистрации домена на которую будут приходить сообщения о том что пора продлевать домен. Бывали случаи когда указанная почта клиентом не контролируется и домен просто перестает работать :).

Делегирование прав на REG.RU

В последствии нам понадобится сделать подтверждение владения доменом при подключении к Yandex Коннект и делать это мы будем через записи DNS на сайте reg.ru.

Разрешаем управлять доменом с сайта регистратора Регру:

Указываем имя профиля куда будет представлена возможность управления:

При успешном выполнении операции вы увидите:

Обращаю внимание на то что вы не передаете полностью управление на reg.ru а только разрешаете управлять доменом.

Оплату с сайта reg.ru производить не надо!

Подключение домена к Yandex Коннект

Заходим в специально созданную почту Yandex и переходим по ссылке https://connect.yandex.ru

Увидим такую страницу на которой жмем «Попробовать»:

Увидите страницу с разными возможными Yandex. Выбираем раздел «Админка»:

Выбрав «Админка» мы увидим следующую страницу:

Жмем «Домены» и добавляем необходимый домен:

После добавления домена попадем на страницу где сказано что домен необходимо подтвердить:

Выбираем вариант подтверждения по DNS и переходим на сайт регистратора reg.ru, где мы укажем необходимый параметр.

Подтверждение прав на домен

Авторизуемся на сайте reg.ru и переходим на наш сайт:

Нажимаем «Изменить» и выбрав DNS серверы reg.ru должны увидеть следующую картинку:

Теперь мы сможем добавить необходимую TXT запись.

Нажимаем «Добавить запись» и добавляем TXT:

Вносим необходимые данные:

В результате мы должны получить:

Теперь на следующий день переходим в панель Yandex Коннект и периодически нажимая «Проверить» ждем пока не увидим страницу:
Видим что проверка пройдена, но нет необходимой MX записи.
Обычно проверка проходит в течении суток, хотя может длится и трое суток.
Идем опять на сайт reg.ru и указываем DNS сервера Yandex:
На этом все процедуры по передаче управления доменом переданы на Yandex Коннект и осталось подождать еще немного (примерно сутки) пока окончательно не получим страницу вида:
Права полностью переданы и можно управлять доменом.
О том как работать со своим Web сервером на операционной системе Linux вы можете в разделе Сервисы — Web сервер.

Управление DNS домена

Например, так добавляются записи:

В результате мы указали что основной сайт работает на сервере с ip 1.1.1.1. Добавили под домен forum.slavna44.ru  который будет работать на этом же адресе.

В результате нам не надо будет скакать по управлению DNS в разных панелях управления. Перенесли сайт на другой хостинг, поменяли значение записи IP домена и задача выполнена.

Создание почтового ящика

На главной странице «Админка» добавляем нового пользователя:

Указываем Имя Фамилия и название почтового ящика по шаблону какой вас устраивает.

В результате получим:

Авторизация проходит со страницы сервиса почты Yandex. Логин указывается полный и при первом заходе необходимо поставить галочку согласившись с лицензией:

Вот так выглядит главная страница почты:

Подключение к почте со сторонних программ осуществляется по тем же правилам что и у стандартной почты Yandex.

Заключение

После всех этих действий для передачи прав владельцу домена вам достаточно передать данные от почты и аккаунта регистратора хозяину домена.

Пользуюсь этой схемой уже давно и улучшения которые делает Yandex только радуют.

PHP от Remi для CentOS

Версии PHP от Remi являются самыми популярными и стабильными при использовании на Web серверах. Расскажу основные моменты работы с репозиторием. Рассмотрим как сменить версию PHP. Один из самых популярных репозиториев для CentOS.

Введение

Есть замечательный человек Remi Collet, который создал репозиторий пользующийся огромной популярностью у пользователей операционной системы CentOS. Познакомится с новостями репозитория можно на блоге Remi Collet.

В статье будет рассказано про использование репозитория на системах CentOS 7 и 8.

Les RPM de Remi repository поддерживает последние версии MySQL и PHP (бэкпорты федоровских rpm). Пакеты этого репозитория необходимо использовать с осторожностью, так как они заменяют базовые пакеты.

В другой статье вы можете узнать как использовать репозиторий WebtaticEL для CentOS 7. В нем так же используются последние версии PHP, но к сожалению там нет многих удобств которые есть у Remi. Например, используя репозиторий Remi можно всегда иметь последнюю версию phpMyAdmin.

Предварительная подготовка

Перед началом использования репозитория Remi необходимо подключить репозиторий Epel созданный группой специалистов операционной системы Fedora. Пакеты из Epel репозитория никогда не конфликтуют и не переустанавливают базовые пакеты RHEL.

Установка Epel в CetnOS 7 производится командой:

yum install epel-release

Установка Epel в CetnOS 8 производится командой:

dnf install epel-release

Подключение репозитория от Remi

для CentOS 7

Для установки репозитория Remi в CentOS 7 достаточно выполнить команду:

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

Посмотреть активные репозитории можно следующей командой:

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.corbina.net
 * epel: mirror.logol.ru
 * extras: mirror.reconn.ru
 * remi-safe: mirror.reconn.ru
 * updates: mirror.corbina.net   
remi-safe    Safe Remi's RPM repository for Enterprise Linux 7 - x86_64     3 144

По умолчанию установлен репозиторий remi-safe который имеет только дополнительные пакеты для базового хранилища и коллекций программного обеспечения. Например, при попытке установить phpMyAdmin будет установлена старая версии. Для установки последних версий надо активировать репозиторий remi.

Посмотрим репозитории что у нас есть в системе выполнив команду:

ls /etc/yum.repos.d/ -l
итого 92
-rw-r--r-- 1 root root 1664 ноя 23 16:16 CentOS-Base.repo
-rw-r--r-- 1 root root 1309 ноя 23 16:16 CentOS-CR.repo
-rw-r--r-- 1 root root 649 ноя 23 16:16 CentOS-Debuginfo.repo
-rw-r--r-- 1 root root 314 ноя 23 16:16 CentOS-fasttrack.repo
-rw-r--r-- 1 root root 630 ноя 23 16:16 CentOS-Media.repo
-rw-r--r-- 1 root root 1331 ноя 23 16:16 CentOS-Sources.repo
-rw-r--r-- 1 root root 5701 ноя 23 16:16 CentOS-Vault.repo
-rw-r--r-- 1 root root 951 окт 2 2017 epel.repo
-rw-r--r-- 1 root root 1050 окт 2 2017 epel-testing.repo
-rw-r--r-- 1 root root 261 фев 8 15:23 mariadb.repo
-rw-r--r-- 1 root root 113 июл 15 2014 nginx.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi91.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi92.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi93.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi94.repo
-rw-r--r-- 1 root root 456 дек 21 20:50 remi-php54.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php70.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php71.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php72.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php73.repo
-rw-r--r-- 1 root root 2605 дек 21 20:50 remi.repo
-rw-r--r-- 1 root root 750 дек 21 20:50 remi-safe.repo

Надеюсь, вы заметили что есть репозитории glpi.

GLPI — это программный инструмент ITSM, который помогает вам легко планировать и управлять изменениями в ИТ структуре предприятия, эффективно решать возникающие проблемы используя систему заявок, так же позволяет вам получить контроль над ИТ-бюджетом и расходами вашей компании. В будущем я расскажу как работать с этим замечательным проектом. Кроме того, то что Remi Collet поддерживает репозиторий меня очень радует.

Перед работой с репозиториями Remi необходимо установите пакет yum-utils, что бы не получать ошибку «bash: yum-config-manager: command not found».  Установим yum-utils выполнив необходимую команду:

yum install yum-utils

Сейчас у нас активирован remi-safe. Для активации remi надо вначале отключить remi-safe а потом активировать remi выполнив команды:

yum-config-manager --disable remi-safe
yum-config-manager --enable remi

Перед тем как определится какую версию PHP использовать я всегда смотрю на сайте Supported Versions PHP.

В списке имеющихся репозиториев нет версии php5.6, так как он входит в состав remi.repo. Для установки достаточно в команде указать remi-php56.

для CentOS 8

В 8 версии CentOS используется версия php 7.2 которая уже может удовлетворять требования множества новых сайтов, но если вам нужны версии новее подключайте Remi.

Подключаем репозиторий Remi, выполнив следующую команду:

dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Посмотрим список всех доступных вариантов установки php:

dnf module list php
= вывод команды =
Последняя проверка окончания срока действия метаданных: 1:41:10 назад, Пн 28 окт 2019 08:05:09.
CentOS-8 - AppStream
Name Stream Profiles Summary 
php 7.2 [d] common [d], devel, minimal PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name Stream Profiles Summary 
php remi-7.2 common [d], devel, minimal PHP scripting language 
php remi-7.3 common [d], devel, minimal PHP scripting language 
php remi-7.4 common [d], devel, minimal PHP scripting language

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Из вывода выше видно что по умолчанию стоит базовая версия CentOS 7.2 и имена она будет установлена.

Установка версии PHP от Remi

для CentOS 7

Активируем репу remi-php72, для этого выполняем команду:

# yum-config-manager --enable remi-php72

Устанавливаем php7.2 выполнив команду:

yum install php72

Лучше указывать php72 и тогда пакеты будут установлены только из репозитория remi. Например, я всегда внимательно смотрю какая версия php будет установлена в списке устанавливаемых пакетов.

Установим php-fpm и наиболее популярные модули, которые могут пригодится в процессе эксплуатации веб сервера.

yum install php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache php-imap

Проверим установленную версию выполнив команду в консоли сервера:

php -v
= вывод команды =
PHP 7.2.16 (cli) (built: Mar 5 2019 14:45:10) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.16, Copyright (c) 1999-2018, by Zend Technologies

для CentOS 8

Активируем репу php remi-7.2, для этого выполняем команды:

dnf module reset php
dnf module enable php:remi-7.2
= вывод команды =
Последняя проверка окончания срока действия метаданных: 1:53:36 назад, Пн 28 окт 2019 08:05:09.
Зависимости разрешены.
====================================================================================================
 Пакет                  Архитектура           Версия                   Репозиторий            Размер
====================================================================================================
Enabling module streams:
 httpd                                        2.4                                                  
 php                                          remi-7.2                                             

Результат транзакции
====================================================================================================

Продолжить? [д/Н]: д
Выполнено!

Switching module streams does not alter installed packages (see 'module enable' in dnf(8) for details)

Убедимся что версия выбрана правильно:

dnf module list php
= вывод команды =
Последняя проверка окончания срока действия метаданных: 1:55:03 назад, Пн 28 окт 2019 08:05:09.
CentOS-8 - AppStream
Name Stream Profiles Summary 
php 7.2 [d] common [d], devel, minimal PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name Stream Profiles Summary 
php remi-7.2 [e] common [d], devel, minimal PHP scripting language 
php remi-7.3 common [d], devel, minimal PHP scripting language 
php remi-7.4 common [d], devel, minimal PHP scripting language

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Всё правильно.

Установим php remi-7.2 и все популярные модули следующей командой:

dnf install php php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache php-imap

Файл конфигурации php.ini

Внесем необходимые изменения в файл настроек php.ini:

vim /etc/php.ini
= необходимые изменения = 
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Необходимая временная зона
date.timezone = "Europe/Moscow"

Настройка Php-fpm для Nginx

Для того чтобы связать nginx и php будем использовать мост php-fpm. Основной файл настройки находится по пути /etc/php-fpm.conf и там должен быть параметр include=/etc/php-fpm.d/*.conf говорящий о том где лежат настройки пулов.

Запускаем php-fpm и добавляем в автозагрузку:

systemctl start php-fpm
systemctl enable php-fpm

=== Для CentOS 8 можно выполнить одну команду ===
systemctl enable --now php-fpm

Проверяем, запустился ли он.

systemctl status php-fpm
= вывод команды =
 php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-10-28 10:09:25 MSK; 1min 1s ago
 Main PID: 463 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
    Tasks: 6 (limit: 11524)
   Memory: 25.7M
   CGroup: /system.slice/php-fpm.service
           ├─463 php-fpm: master process (/etc/php-fpm.conf)
           ├─464 php-fpm: pool www
           ├─465 php-fpm: pool www
           ├─466 php-fpm: pool www
           ├─467 php-fpm: pool www
           └─468 php-fpm: pool www

окт 28 10:09:24 wp-lxc_pro-php7_sevo44_loc systemd[1]: Starting The PHP FastCGI Process Manager...
окт 28 10:09:25 wp-lxc_pro-php7_sevo44_loc systemd[1]: Started The PHP FastCGI Process Manager.

Все в порядке, сервис работает и находится в автозагрузке.

Использовать порт или сокет решать вам, но говорят что сокет использовать лучше. Запустим php-fpm через unix сокет. Для этого переименуем конфиг /etc/php-fpm.d/www.conf, создадим новый и приводим к следующему виду:

mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf_orig
vim /etc/php-fpm.d/www.conf
= необходимый код =
[www]
user = nginx
group = nginx
;listen = 127.0.0.1:9000
listen = /run/php-fpm/www.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
;pm.process_idle_timeout = 10s;
;pm.max_requests = 500

slowlog = /var/log/php-fpm/www-slow.log

;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M
php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session
;php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
;php_value[opcache.file_cache]  = /var/lib/php/opcache

Вы можете для каждого сайта созать свой пул и указать там все необходимые параметры. Например, для каждого сайта я создаю свой пул для гибкости настройки и благодаря этому я настраиваю корректный доступ к файлам по sftp.

Более подробно прочтите в статье SFTP настройка для веб хостинга.

Назначим каталогу /var/lib/php правильное владение:

=== было ===
ls -l /var/lib/php
= вывод команды =
итого 0
drwxrwx--- 2 root apache  6 окт 22 12:08 opcache
drwxr-xr-x 2 root root   59 окт 28 10:05 peclxml
drwxrwx--- 2 root apache  6 окт 22 12:08 session
drwxrwx--- 2 root apache  6 окт 22 12:08 wsdlcache

=== Назначаем правильные права ===
chown -R root:nginx /var/lib/php

Перезапускаем php-fpm командой:

systemctl restart php-fpm

Проверяем, стартовал ли указанный сокет.

ll /run/php-fpm/www.sock 
srw-rw---- 1 nginx nginx 0 фев 13 10:35 /run/php-fpm/www.sock

Всё успешно настроено.

В настройках nginx для сайта необходимо указать требуемый пул. Например, прописать код fastcgi_pass unix:/run/php-fpm/www.sock; в секции location ~ \.php$

Обновление версий PHP от Remi

Схема обновления универсальна и подойдет как для всех версий CentOS. В примере ниже расмотрен вариант обновления для версии 7.

Обновление состоит из нескольких действий:

  • Остановка php-fpm,
  • Вывод и удаление всех имеющихся пакетов php,
  • Удаление старого и активирование нового репозитория требуемой версии php,
  • Установка новой версии,
  • Проверка настрое из старой версии,
  • Запуск php-fpm и проверка сервиса.

Выполним обновление PHP до версии 7.3 в системе CentOS 7.

Останавливаем php-fpm командой:

systemctl stop php-fpm

Выводим список всех установленных пакетов php:

rpm -qa | grep php
= вывод команды =
php-json-7.2.16-1.el7.remi.x86_64
php-process-7.2.16-1.el7.remi.x86_64
php-odbc-7.2.16-1.el7.remi.x86_64
php-soap-7.2.16-1.el7.remi.x86_64
php-fpm-7.2.16-1.el7.remi.x86_64
php-xml-7.2.16-1.el7.remi.x86_64
php-xmlrpc-7.2.16-1.el7.remi.x86_64
php-pecl-memcache-3.0.9-0.9.20170802.e702b5f.el7.remi.7.2.x86_64
php-gd-7.2.16-1.el7.remi.x86_64
php-mbstring-7.2.16-1.el7.remi.x86_64
php-pdo-7.2.16-1.el7.remi.x86_64
php-pear-1.10.8-1.el7.remi.noarch
php-snmp-7.2.16-1.el7.remi.x86_64
php-opcache-7.2.16-1.el7.remi.x86_64
php-ldap-7.2.16-1.el7.remi.x86_64
php-common-7.2.16-1.el7.remi.x86_64
php-cli-7.2.16-1.el7.remi.x86_64
php-7.2.16-1.el7.remi.x86_64
php-fedora-autoloader-1.0.0-1.el7.remi.noarch
php-mysqlnd-7.2.16-1.el7.remi.x86_64
php-pecl-zip-1.15.4-1.el7.remi.7.2.x86_64
php-imap-7.2.16-1.el7.remi.x86_6

Произведём удаление всех выведенных пакетов необходимой командой:

yum remove php-json php-process php-odbc php-soap php-fpm php-xml php-xmlrpc php-pecl-memcache php-gd php-mbstring php-pdo php-pear php-snmp php-opcache php-ldap php-common php-cli php php-fedora-autoloader php-mysqlnd php-pecl-zip php-imap

Внимательно смотрим вывод команды при удалении! В выводе вы должны увидеть примерно такие строки:

предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave

предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave

Удалим старый репозиторий php7.2 и установим новый php7.3 выполнив команды:

yum-config-manager --disable remi-php72
yum-config-manager --enable remi-php73

Проверяем правильность установки нужного репозитория выполнив команду:

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.sale-dedic.com
* epel: mirrors.colocall.net
* extras: mirror.sale-dedic.com
* remi: mirror.23media.de
* remi-php73: mirror.23media.de
* updates: centos-mirror.rbc.ru
remi-php73 Remi's PHP 7.2 RPM repository for Enterprise Linux 7 - x86_64   362

Устанавливаем пакеты аналогичные удаленным:

yum install php-json php-process php-odbc php-soap php-fpm php-xml php-xmlrpc php-pecl-memcache php-gd php-mbstring php-pdo php-pear php-snmp php-opcache php-ldap php-common php-cli php php-fedora-autoloader php-mysqlnd php-pecl-zip php-imap

Обязательно смотрим версию и репозиторий откуда будут ставится пакеты.

Осталось проверить файлы что выдала команда при удалении старой версии php:

предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave
предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave

В заключение, запустим сервис php-fpm и проверим статус:

systemctl start php-fpm
systemctl status php-fpm
 php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
Active: active (running) since Ср 2019-03-13 21:16:12 MSK; 7s ago
Main PID: 1392 (php-fpm)
Status: "Ready to handle connections"
CGroup: /lxc/php7-lxc/system.slice/php-fpm.service
├─1392 php-fpm: master process (/etc/php-fpm.conf)
├─1393 php-fpm: pool www
├─1394 php-fpm: pool www
├─1395 php-fpm: pool www
├─1396 php-fpm: pool www
└─1397 php-fpm: pool www

мар 13 21:16:11 php7-lxc-lemp.sevo44.loc systemd[1]: Starting The PHP FastCGI Process Manager...
мар 13 21:16:12 php7-lxc-lemp.sevo44.loc systemd[1]: Started The PHP FastCGI Process Manager.

Из вывода видно что сервис не стартует при загрузке. Добавим сервис в автозагрузку выполнив команду:

systemctl enable php-fpm

Вывод

В статье рассказано про основные моменты работы с репозиторием Remi Collet. Репозиторий активно обновляется и мой выбор остановился на использовании именно его при работе с PHP.

NGINX установка и настройка

Установим и настроим Nginx на системе Rocky Linuxи или любого дистрибутива семейства RHEL. Рассмотрим разные варианты использования сервиса. Использование Nginx для web проектов работающих на бюджетных хостингах или железе — лучший вариант.

Введение

Из этой статьи вы узнаете про основные моменты работы с Nginx на системах CentOS, Rocky Linux и любого дистрибутива семейства любое семейство RHEL. Более подробно о работе с Nginx можно узнать на сайте разработчика в разделе документации. Долгое время лидирующие позиции занимал Apach, но новый продукт кардинально изменил подход к обработке команд и позволяет обслуживать высоко нагруженные сайты на бюджетном железе. Более детально узнать про автора Игоря Сысоева и ознакомится с принципами работы вы можете на просторах сети интернет. От себя лишь скажу что теперь это моя основная и любимая связка при организации веб сервера по причине быстроты и удобства работы.

Установка NGINX

Для установки будем использовать репозиторий разработчика NGINX.

Для установки самой свежей стабильной версии Nginx на СentOS или Rocky Linux (любое семейство RHEL) подключим родной репозиторий выполнив следующие действия:

= Установим необходимую зависимость =
dnf install yum-utils

= Создадим файл с репозиторием и обновим систему = 
vim /etc/yum.repos.d/nginx.repo
=== Необходимый код для внесения ===
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

= Обновим систему =
dnf update

Установим выполнив команду:

dnf install nginx

Перед установкой убеждаемся что установка идет с репозитория nginx.

Запустим и добавим в автозагрузку:

systemctl start nginx
systemctl enable nginx

= Можно одной командой =
systemctl enable --now nginx

Для проверки выполним команду в консоли:

curl http://localhost
= вывод команды =
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Видим код страницы. NGINX работает.

Например, мне не удобно видеть такую страницу по умолчанию и я привожу её к следующему виду:

vim /usr/share/nginx/html/index.html
= необходимый код =
<!DOCTYPE html>
<html>
<head>
<title>Welcome!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working.</p>

<p><em>lemp.sevo44.loc</em></p>
</body>
</html>

Используя такую страницу я всегда понимаю на какой сервер я попадаю.

Настройка NGINX

Вся прелесть настройки сводится к тому что вы всегда можете проверить правильность своих настроек выполнив команду:

nginx -t

Варианты конфигурации для сайтов

Дальше надо определится как будем работать с настройкой сайтов.
Существует два пути:

  • редактирование всё в одном файле;
  • для каждого сайта сделать свой файл настроек.

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

Главный конфигурационный файл

Переименуем оригинальный конфигурационный фал Nginx и создадим новый внеся необходимый код:

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig
vim /etc/nginx/nginx.conf
= необходимый код =
user nginx;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 30000;
pid /var/run/nginx.pid;
pcre_jit on;

events {
worker_connections 8192;
multi_accept on;
}

http {
# Basic #######################
sendfile on;
tcp_nopush on;
tcp_nodelay on;
reset_timedout_connection on;
keepalive_timeout 120;
keepalive_requests 1000;
types_hash_max_size 2048;
server_tokens off;
send_timeout 30;
client_body_timeout 30;
client_header_timeout 30;
server_names_hash_max_size 4096;

# Limits ######################
client_max_body_size 10m;
client_body_buffer_size 128k;
client_body_temp_path /var/cache/nginx/client_temp;

proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /var/cache/nginx/proxy_temp;

include /etc/nginx/mime.types;
default_type application/octet-stream;

# Logs ########################
log_format main '$remote_addr - $host [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'rt=$request_time ut=$upstream_response_time '
'cs=$upstream_cache_status';
log_format full '$remote_addr - $host [$time_local] "$request" '
'request_length=$request_length '
'status=$status bytes_sent=$bytes_sent '
'body_bytes_sent=$body_bytes_sent '
'referer=$http_referer '
'user_agent="$http_user_agent" '
'upstream_status=$upstream_status '
'request_time=$request_time '
'upstream_response_time=$upstream_response_time '
'upstream_connect_time=$upstream_connect_time '
'upstream_header_time=$upstream_header_time';

access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;

# Gzip ########################
gzip on; 
gzip_static on; 
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
gzip_comp_level 9;
gzip_proxied any;
gzip_min_length 1000;
gzip_disable "msie6";
gzip_vary on;

etag off;

# Cache #######################
#proxy_cache_valid 1m;
#proxy_cache_key $scheme$proxy_host$request_uri$cookie_US;
#proxy_cache_path /web/sites/nginx_cache levels=1:2 keys_zone=main:1000m;

# Zone limits ################
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_req_zone $binary_remote_addr zone=lim_5r:10m rate=5r/s; # lim for dynamic page
limit_req_zone $binary_remote_addr zone=lim_1r:10m rate=1r/s; # lim for search page
limit_req_zone $binary_remote_addr zone=lim_10r:10m rate=10r/s;

# SSL #########################
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets on;
ssl_protocols TLSv1.2 TLSv1.3;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:ECDHE:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
resolver 8.8.8.8;

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

# For monitoring ###########
#server {
#listen 127.0.0.1:80;
#server_name status.localhost;
#keepalive_timeout 0;
#allow 127.0.0.1;
#deny all;
#access_log off;

#location /server-status {
#stub_status on;
#}

#location /status {
#access_log off;
#allow 127.0.0.1;
#deny all;
#include fastcgi_params;
#fastcgi_pass unix:/run/php-fpm/www.sock;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#}
#}
}

Это мой базовый вариант который подходит практически для всех моих ресурсов где необходимо настраивать Nginx.

Конфигурации Nginx для сайтов

Связка c PHP осуществляется с использованием php-fpm. Узнать более подробно можно из статьи PHP от Remi для CentOS 7.

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

#pma.sevo44.loc
server {
listen 80;
server_name pma.sevo44.loc www.pma.sevo44.loc;

access_log /var/www/pma.sevo44.loc/log/pma.sevo44.loc-access_log main;
error_log /var/www/pma.sevo44.loc/log/pma.sevo44.loc-error_log info;

root /var/www/pma.sevo44.loc/www/;
index index.php;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.socket;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
}

Запросы на ресурс будут осуществятся с проксирующего сервира Nginx. О том как перевести ресурс на работу по https вы узнаете ниже.

Доступ по IP адресу

Бывают случаи когда необходимо помимо домена попадать на ресурс по ip адресу и для этого достаточно добавить один параметр в файл настройки для ресурса.

= часть кода с примером =
server { 
listen 80 default_server; 
server_name pma.sevo44.loc www.pma.sevo44.loc;

Доступ к ресурсу по паролю

Иногда для безопасности необходимо закрыть ресурс на пароль. Сделаем это средствами Nginx используя механизм basic auth.

Добавим в секцию server необходимого сайта код:

= необходимый код =
### Авторизация по паролю используя basic auth
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;

Создаем файл с логином и паролем для доступа:

=== Команда которая создаст пользователя pma ===
sh -c "echo -n 'pma:' >> /etc/nginx/.htpasswd"

=== Команда для создания пароля пользователю pma ===
sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

= Вывод команды с пояснениями =
Password: пароль
Verifying - Password: повтор пароля

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

cat /etc/nginx/.htpasswd 
= вывод команды =
pma:$apr1$7xGrtwfB$fZNKV9J5fjr%fbvfMuhPvSFS0

Можно добавлять любое количество пользователей меняя только имя создаваемого пользователя.

Для смены текущего пароля пользователя достаточно выполнить команду по созданию пароля без добавления пользователя а потом зайти в файл и последнюю строчку вида $apr1$7xG6owfB$fZNKV9J5gjjj^YfMuhPvSFSв заменить пользователю которому меняем пароль.

После обновления конфигурации Nginx при попытке зайти на ресурс мы увидим простую форму где необходимо внести наши данные.

Параметры php для сайта

На одном сервере может быть разное количество сайтов которые используют одну версию php, но для каждого нужны своим определённые параметры. С решением этой задачи легко справляется Nginx. Например, я не редактирую базовый файл с настройками версии php а для каждого ресурса создаю свои персональные настройки. Кроме того, иногда нет возможно подправить базовый файл так чтобы он удовлетворял условиям всех сайтов.

Для просмотра действующих параметров php необходимо создать файл на требуемом ресурсе и добавить туда следующий код:

vim info.php
= необходимый код =
<?php
phpinfo();
?>

Теперь с учетом того что файл создали в корне сайте необходимо открыть его https://ваш домен/info.php и увидеть все реально действующие параметры для данного ресурса.

Смотрим те параметры что нам надо и добавляем их по аналогии к существующим в коде ниже.

Значения для параметров которые возможны всегда можно посмотреть в комментариях базового файла php.ini

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

location ~ \.php$ {
fastcgi_pass unix:/var/opt/remi/php80/run/php-fpm/sevo44.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param HTTPS on;
fastcgi_param PHP_VALUE "
# max_execution_time = 300
# short_open_tag = On
post_max_size = 12M
upload_max_filesize = 12M
# max_input_time = 300
date.timezone = Europe/Moscow
";
}

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

nginx -t
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginx -s reload

При переходе с одной версии php на другую этот вариант очень актуален. В новой версии могут меняться некоторые параметры и их с легкостью можно применить в этом файле.

Команды управления

Обновление параметров без перезагрузки сервиса (рекомендуемый вариант):

nginx -s reload
= или =
systemctl reload nginx

Полная перезагрузка сервиса

systemctl restart nginx

Остановка и запуск соответственно:

systemctl stop nginx
systemctl start nginx

Проксирования запросов на удаленный сервер

В локальной сети может работать множество сайтов. Самый лучший способ это настроить одну точку входа и оттуда переправлять запросы на ресурсы в локальной сети. Nginx прекрасно с этим справляется используя модуль ngx_http_proxy_module. Более подробно о том как можно настраивать проксирование запросов вы можете в документации разработчика.

Мне нравится использовать эту технологию так как она позволяет:

  • Работа всех ресурсов по https. На проксирующем сервере мы получаем сертификаты для всех ресурсов а перенапровление запросов идет по http. Контролировать получение сертификатов SSL в одном месте для всех сайтов локальной сети очень удобно;
  • Смена мест размещения ресурсов. Перевозить сервер на новое место не вызывает проблем. Достаточно настроить сайт на новом месте а потом просто поменять ip адресс на проксирующем Nginx.
  • Проксирование папок или фалов. Для оптимизации работы ресурса можно распределять нагрузку на разные ресурсы. Например, перенести загрузку определенных фалов (фотографии) или папок на другие сервера.

Для примера, так же будем использовать проксирование запросов для phpMyAdmin.

Параметры в используемом примере следующие:

  • pma.sevo44.ru — домен ресурса;
  • 10.10.0.1 — ip адрес ресурса с которого пересылается запрос. Проксирующий сервер работает на сервера в котором проксирование проходит на контейнеры LXC которые работают в своей сети 10.10.0.0/24;
  • 10.10.0.4 — ip ресурса на который происходит проксирование сигналов.

Настройка на проксирующем Nginx

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

Из приведенного примера ниже вы узнаете:

  • Как осуществлять редирект с http на https;
  • Включение сжатия GZIP для ресурса;
  • Настройки для работы https. Узнать более подробно о том как получать сертификат SSl можно из статьи «SSL бесплатный для сайта Nginx«;
  • Работа ресурса по http2;
  • Команды переправляющие ip адрес для правильного отображения в логах;
  • Настройка размера файлов которые можно загружать на проксируемый ресурс;
  • Папка которая будет использована для получения сертификата ssl.
### ssl pma.sevo44.ru
### Перенаправление с http на https
#server {
#listen 80;
#server_name pma.sevo44.ru www.pma.sevo44.ru;
#rewrite ^ https://$server_name$request_uri? permanent;
#}
server {
### Перевод работы ресурса на https c http2
#listen 443 ssl http2;
listen 80;
server_name pma.sevo44.ru www.pma.sevo44.ru;
### Включение сжатия GZIP
### Если используется NGINX proxy надо настраивать на нём!!!
#gzip on;
#gzip_static on;
#gzip_types text/plain text/css application/json application/x-#javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
#gzip_comp_level 6;
#gzip_proxied any;
#gzip_min_length 1000;
#gzip_disable "msie6";
#gzip_vary on;
### ssl
#ssl on;
#ssl_certificate /etc/letsencrypt/live/pma.sevo44.ru/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/pma.sevo44.ru/privkey.pem;
#ssl_session_timeout 5m;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_dhparam /etc/letsencrypt/dhparam.pem;
#ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
#ssl_prefer_server_ciphers on;
#ssl_session_cache shared:SSL:10m;
### Папка используемая для получения сертификата ssl
location /.well-known/acme-challenge/ {
root /var/www/ssl/pma.sevo44.ru/;
}
location / {
### Ip адрес проксируемого ресурса
proxy_pass http://10.10.0.4:80;
### Настройки для передачи в логи проксируемых ресурсов реальных ip
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
### Код для указания размера максимальной зугрузки файлов 10 M
### так же нужна строчка в файле настройки сайта
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

Настройка на проксируемом ресурсе

Исходя из настроек на проксируещем сервере конфурационный файл проксируемого ресурса имеет следующий вид:

### pma.sevo44.ru
server {
listen 80;
server_name pma.sevo44.ru www.pma.sevo44.ru;

access_log /usr/share/phpMyAdmin/log/pma.sevo44.ru-access_log main;
error_log /usr/share/phpMyAdmin/log/pma.sevo44.ru-error_log info;

root /usr/share/phpMyAdmin/;
index index.php;

### Для записи в log реальных ip
set_real_ip_from 10.10.0.1;
real_ip_header X-Real-IP;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param HTTPS on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
} 
}

Проксирование директории или файлов

Секции должны входить в блок server.

Например, проксируем папку foto находящуюся на другом ресурсе:

location /foto/ {
proxy_pass http://192.168.0.200:80; 
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect default;
}

Для проксирования файлов с форматом gif,jpg,png код будет иметь следующий вид:

location / {
proxy_pass http://192.168.0.200:80; 
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}

location ~ \.(gif|jpg|png)$ { 
root /web/sites/blog.zeroxzed.ru/www/images; 
}

Вывод

Каждый ресурс индивидуален. В статье приведены только самые основы и для того чтобы настроить работу ресурса максимально оптимально для работы вам придется используя документацию разработчика. Особое внимание следует уделить директивам кэширования proxy_cache так как они очень сильно могут влиять на скорость работы ресурса.

MariaDB оптимизация и установка

Правильная оптимизация MariaDB после установки одна из важнейших задач с которыми сталкиваешься при обслуживании серверов LEMP. Расскажу свой подход к решении этой задачи. Зная информацию вы всегда сможете правильно настроить его работу.

Введение

В этой статье я постарался описать все основные моменты в работе с базами данных MariaDB. Основной задачей было расказать как выполняется оптимизация MariaDB. Тема очень обширная и имеющая много нюансов.  Давать конкретные рекомендации не имеет смысла, так как вариант установки и оптимизации сильно зависит от того какие технические параметры у сервера и какое программное обеспечение будет использоваться.

О том как работать с базами данных в консоли вы можете узнать из статьи MariaDB работа из консоли.

Установка MariaDB

В каждом дистрибутиве присутствует mariadb, но версия может быть старая. Для установки свежей версии любой программы я всегда стараюсь использовать репозиториями разработчиков. Серьезные разработчики держать версии под все популярные операционные системы.

Репозиторий разработчика

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

Рекомендую воспользоваться ссылкой выше и использовать код репозитория и команды установки исходя из вашей системы.

Например, для системы CentOS 8 с выбором версии 10.4 я получил код который размещу в необходимый файл:

vim /etc/yum.repos.d/mariadb.repo
= необходимый код =
# MariaDB 10.4 CentOS repository list - created 2019-10-24 18:16 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos8-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Установка MariaDB

На странице, где указан код присутствует и команда которую необходимо выполнить для установки исходя из выбранного дистрибутива. Для CentOS 8 команда имеет такой вид:

dnf install boost-program-options
dnf install MariaDB-server MariaDB-client --disablerepo=AppStream

Перед продолжением установки смотрим чтобы репозиторий был mariadb!

После установки запустим и добавим в автозагрузку выполнив команды:

systemctl start mariadb
systemctl enable mariadb

Проверим статус выполнив команду:

systemctl status mariadb
= вывод команды =
 mariadb.service - MariaDB 10.4.8 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: active (running) since Thu 2019-10-24 21:27:02 MSK; 40s ago
     Docs: man:mysqld(8)
           https://mariadb.com/kb/en/library/systemd/
 Main PID: 1798 (mysqld)
   Status: "Taking your SQL requests now..."
    Tasks: 30 (limit: 11524)
   Memory: 74.3M
   CGroup: /system.slice/mariadb.service
           └─1798 /usr/sbin/mysqld

окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] InnoDB: Buffer pool(s) load completed at 191024 21:27:02
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Plugin 'FEEDBACK' is disabled.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Server socket created on IP: '::'.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Reading of all Master_info entries succeeded
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Added new Master_info '' to hash table
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] /usr/sbin/mysqld: ready for connections.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: Version: '10.4.8-MariaDB'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MariaDB Server
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc systemd[1]: Started MariaDB 10.4.8 database server.
окт 24 21:27:14 wp-lxc.pro-php7.sevo44.loc systemd[1]: mariadb.service: Failed to reset devices.list: Operation not permitted

Из вывода видно что все хорошо. Стараюсь всегда проверять статус после установки и запуска сервисов, так как это дает уверенность в том что все работает как надо.

Начальная конфигурация mysql

Для начальной конфигурации необходимо запустить скрипт и ответить на все вопросы исходя из ваших требований. Например, обычно я задаю пароль пользователя root и оставляю остальные параметры по-умолчанию.

/usr/bin/mysql_secure_installation
= вывод команды с пояснениями (перевод) =
Примечание: запуск всех частей этого сценария рекомендуется для всех MariaDB
СЕРВЕРА В ЭКСПЛУАТАЦИЮ! ПОЖАЛУЙСТА, ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ КАЖДЫЙ ШАГ!

1. Для того, чтобы войти в MariaDB обеспечения его, нам понадобится текущий пароль для пользователя root. Если вы только что установили MariaDB и вы еще не установили пароль root, пароль будет пустым, поэтому вы должны просто нажать здесь.
Введите текущий пароль для root (enter for none):

2. Установка пароля root гарантирует, что никто не может войти в MariaDB пользователь root без надлежащего разрешения.
Задать пароль пользователя root? [Y / n]

3. По умолчанию, установка MariaDB имеет анонимного пользователя, что позволяет любому чтобы войти в MariaDB без необходимости иметь учетную запись пользователя, созданную для их. Это предназначено только для испытывать, и сделать установку пойти немного более гладким. Вы должны удалить их перед перемещением в производственная среда.
Удалить анонимных пользователей? [Y / n]

4. Обычно, root должно быть позволено подключаться от "localhost". Этот гарантирует, что кто-то не может угадать пароль.
Запретить root подключаться удаленно? [Y / n]

5. По умолчанию, MariaDB поставляется с базой данных с именем "test", что любой может доступ. Это также предназначено только для тестирования и должно быть удалено перед переходом в производственную среду.
Удалить тестовую базу данных и доступ к ней? [Y / n]

6. Перезагрузить таблицы привилегий обеспечит, что все изменения, сделанные до сих пор вступит в силу немедленно.
Перезагрузить таблицы привилегий сейчас? [Y / n]

Все сделано! Если вы выполнили все вышеперечисленные шаги, ваш MariaDB теперь установка должна быть безопасной.
Спасибо за использование MariaDB!

Информация о действующих параметрах

Для просмотра всех возможных параметров и настойках по умолчанию можно посмотреть выполнив команду:

mysqld --verbose --help
= часть вывода команды с пояснениями =
!!! в консоли у меня не показывается первая часть вывода и как её увидеть я сказу ниже!!!
= в верхней части вы увидите где находится файл настойки =
mysqld Ver 10.3.12-MariaDB-log for Linux on x86_64 (MariaDB Server)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Starts the MariaDB database server.

Usage: mysqld [OPTIONS]

Default options are read from the following files in the given order:
/etc/my.cnf ~/.my.cnf

= в этой части увидите вывод всех возможных параметров = 
--thread-handling=name 
                      Define threads usage for handling queries. One of: 
                      one-thread-per-connection, no-threads, pool-of-threads
  --thread-pool-idle-timeout=# 
                      Timeout in seconds for an idle thread in the thread
                      pool.Worker thread will be shut down after timeout
  --thread-pool-max-threads=# 
                      Maximum allowed number of worker threads in the thread
                      pool

= в этой части параметры которые используются по умолчанию =
Variables (--variable-name=value)
and boolean options {FALSE|TRUE}                           Value (after reading options)
---------------------------------------------------------- ---------------
allow-suspicious-udfs                                      FALSE
alter-algorithm                                            DEFAULT
aria                                                       ON
aria-block-size                                            8192
aria-checkpoint-interval                                   30
aria-checkpoint-log-activity                               1048576
aria-encrypt-tables                                        FALSE
aria-force-start-after-recovery-failures                   0
aria-group-commit                                          none
aria-group-commit-interval                                 0
aria-log-dir-path                                          /var/lib/mysql/
aria-log-file-size                                         1073741824
aria-log-purge-type                                        immediate
= в конце информация о том как посмотреть текущие параметры =

To see what values a running MySQL server is using, type
'mysqladmin variables' instead of 'mysqld --verbose --help'.

перевод
Чтобы увидеть, какие значения использует работающий сервер MySQL, введите 'mysqladmin variables' вместо 'mysqld --verbose --help'.

Вся информация в консоли не покажется поэтому лучше вывод сделать в файл:

 mysqld --verbose --help > mysqld--verbose--help.txt

Какие значения использует работающий сервер тоже лучше вывести в файл:

mysqladmin variables -u root -p > mysqladmin-variables.txt
Enter password: 

Правильная оптимизация MariaDB возможно только при использовании правильных параметров исходя из вашей версии!

Файл настройки MariaDB

В фале /etc/my.cnf присутствует строка !includedir /etc/my.cnf.d говорящая о том что все настройки находятся в папке /etc/my.cnf.d

Все основные настройки необходимо вносить в раздел [mysqld] файла server.cnf.

Аналитика работы MariaDB

Без аналитики работы сервера проводить оптимизацию MariaDB сложно и очень неудобно. Самый важный момент который необходим при анализе работы, это медленные запросы к базе данных.

Включим отображение медленных запросов добавив следующие строки в /etc/my.cnf.d/server.cnf, в секцию [mysqld]:

vim /etc/my.cnf.d/server.cnf
= необходимые параметры в секцию [mysqld] =
# запись лога медленных запросов
slow_query_log=ON
# путь к файлу 
slow_query_log_file=/var/lib/mysql/slow_queries.log
# минимальное время запроса для внесения
long_query_time=2
# включить в лог запросы, которые не используют индексы
#log-queries-not-using-indexes=1

Последний параметр отключен, так как используется больше для отладки кода и правильности создания таблиц.

Перезапустим сервер баз данных и посмотрим лог медленных запросов:

systemctl restart mariadb
tail -f /var/lib/mysql/slow_queries.log
= вывод команды =
Time		    Id Command	Argument
/usr/sbin/mysqld, Version: 10.3.12-MariaDB-log (MariaDB Server). started with:
Tcp port: 0  Unix socket: (null)
= для выхода ctrl+c =

В нашем случае медленных запросов нет.

Оптимизация MariaDB

Подходите очень ответственно. Неправильные действия могут вызвать неприятные последствия!

Для правильной оптимизации необходимо владеть всей необходимой информацией. Например, для меня это:

  • Информация о действующих параметрах — перед тем как вносить изменения необходимо смотреть какой параметр действует на данный момент ,
  • Аналитика работы — без аналитики работы вообще бессмысленно производить оптимизацию,
  • Требование к базе данных — у разных движков сайтов существует разное требование для работы с базой данных и это надо учитывать.

Работа с MySQLTunner

Существует perl-скрипт Mysqltuner, который анализирует статистику работы Mysql и выдает свои рекомендации что бы была проведена правильная оптимизация MariaDB.

Установка

Создадим папку, перейдем в неё и скачаем скрипт следующим образом:

mkdir mysqltuner
cd mysqltuner
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl

Если возникает ошибка вида:

ERROR: cannot verify raw.githubusercontent.com’s certificate, issued by ‘/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA’:
Unable to locally verify the issuer’s authority.
To connect to raw.githubusercontent.com insecurely, use `—no-check-certificate’.

Запускаем с ключом —no-check-certificate:

# wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl --no-check-certificate

Можно скачать базы данных простых паролей и уязвимостей. Скачаем обе базы:

= База простых паролей =
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt -O basic_passwords.txt

= База уязвимостей =
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv -O vulnerabilities.csv

Базы простых паролей и уязвимостей будут использоваться только при запуске скрипта!

Также, можно произвести установку из репозиториев:

Debian/Ubuntu:

apt install mysqltuner

CentOS:

yum install mysqltuner

Оптимизация

Чтобы данные анализа и статистика были корректными, сервер Mysql должен проработать без смены параметров конфигурации и без перезагрузок, по рекомендации самого Mysqltuner не менее 24 часов.

Обращаю внимание на то что правильная оптимизация MariaDB возможно при рабочих базах данных. Перед внесением изменений не ленитесь смотреть какие имеются текущие настройки базы. Скрипт может давать ошибочные выводы!

Если производилось скачивание скрипта находясь в папке со скриптом необходимо выполнить команду:

perl mysqltuner.pl

Если производилась установка:

mysqltuner

После введения данных пользователя root для MariaDB вы увидите примерно такой вывод:

mysqltuner
= вывод команды =
>> MySQLTuner 1.7.13 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering

[--] Skipped version check for MySQLTuner script
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: [OK] Currently running supported MySQL version 10.3.12-MariaDB
[OK] Operating on 64-bit architecture

-------- Log file Recommendations
[--] Log file: /var/lib/mysql/mysql_error.log(0B)
[!!] Log file /var/lib/mysql/mysql_error.log doesn't exist
[!!] Log file /var/lib/mysql/mysql_error.log isn't readable.

-------- Storage Engine Statistics
[--] Status: +Aria +CSV +InnoDB +MEMORY +MRG_MyISAM +MyISAM +PERFORMANCE_SCHEMA +SEQUENCE 
[!!] InnoDB is enabled but isn't being used
[OK] Total fragmented tables: 0

-------- Analysis Performance Metrics
[--] innodb_stats_on_metadata: OFF
[OK] No stat updates during querying INFORMATION_SCHEMA.

-------- Security Recommendations
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] There is no basic password file list!

-------- CVE Security Recommendations
[--] Skipped due to --cvefile option undefined

-------- Performance Metrics
[--] Up for: 28s (10 q [0.357 qps], 14 conn, TX: 56K, RX: 1K)
[--] Reads / Writes: 100% / 0%
[--] Binary logging is disabled
[--] Physical Memory : 1.8G
[--] Max MySQL memory : 856.4M
[--] Other process memory: 33.7M
[--] Total buffers: 417.0M global + 2.9M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 419.9M (22.84% of installed RAM)
[OK] Maximum possible memory usage: 856.4M (46.59% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/10)
[OK] Highest usage of available connections: 0% (1/151)
[!!] Aborted connections: 7.14% (1/14)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[!!] Query cache may be disabled by default due to mutex contention.
[!!] Query cache efficiency: 0.0% (0 cached / 1 selects)
[OK] Query cache prunes per day: 0
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] Temporary tables created on disk: 0% (0 on disk / 4 total)
[OK] Thread cache hit rate: 92% (1 created / 14 connections)
[OK] Table cache hit rate: 64% (11 open / 17 opened)
[OK] Open file limit used: 0% (25/16K)
[OK] Table locks acquired immediately: 100% (18 immediate / 18 locks)

-------- Performance schema
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B
[--] Sys schema isn't installed.

-------- ThreadPool Metrics
[--] ThreadPool stat is enabled.
[--] Thread Pool Size: 1 thread(s).
[--] Using default value is good enough for your version (10.3.12-MariaDB)

-------- MyISAM Metrics
[!!] Key buffer used: 18.2% (24M used / 134M cache)
[OK] Key buffer size / total MyISAM indexes: 128.0M/123.0K

-------- InnoDB Metrics
[--] InnoDB is disabled.
[!!] InnoDB Storage engine is disabled. InnoDB is the default storage engine

-------- AriaDB Metrics
[--] AriaDB is enabled.
[OK] Aria pagecache size / total Aria indexes: 128.0M/1B

-------- TokuDB Metrics
[--] TokuDB is disabled.

-------- XtraDB Metrics
[--] XtraDB is disabled.

-------- Galera Metrics
[--] Galera is disabled.

-------- Replication Metrics
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: MIXED
[--] XA support enabled: ON
[--] Semi synchronous replication Master: OFF
[--] Semi synchronous replication Slave: OFF
[--] This is a standalone server

-------- Recommendations
General recommendations:
Add skip-innodb to MySQL configuration to disable InnoDB
MySQL was started within the last 24 hours - recommendations may be inaccurate
Reduce or eliminate unclosed connections and network issues
Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
Performance schema should be activated for better diagnostics
Consider installing Sys schema from https://github.com/mysql/mysql-sys
Variables to adjust:
query_cache_size (=0)
query_cache_type (=0)
query_cache_limit (> 1M, or use smaller result sets)
performance_schema = ON enable PFS

Так выглядит вывод команды после 48 часов работы MariaDB без рабочих баз.

Обращать внимание надо на параметры с восклицательными знаками.

Для того чтобы была информация в разделе Log file Recommendations необходимо добавить следующий код:

vim /etc/my.cnf.d/server.cnf
= необходимые дополнения в [mysqld] =
# необходимо для mysqltuner
log_error=/var/lib/mysql/mysql_error.log

В самом конце вывода утилита предоставит список рекомендаций как исправить ситуацию.

  • query_cache_size (=0)
  • query_cache_type (=0)
  • query_cache_limit (> 1M, or use smaller result sets)

Скрипт рекомендует отключить кэш запросов. Query Cache — это кэш вызовов SELECT. Когда базе данных отправляется запрос, она выполняет его и сохраняет сам запрос и результат в этом кэше. При использовании его вместе с InnoDB при любом изменении совпадающих данных кэш будет перестраиваться, что влечет за собой потерю производительности. И чем больше объем кэша, тем больше потери. Кроме того при обновлении кэша могут возникать блокировки запросов. Таким образом, если данные часто пишутся в базу данных — его надежнее отключить добавив следующий код:

vim /etc/my.cnf.d/server.cnf
= необходимые дополнения [mysqld] =
# рекомендации mysqltuner
query_cache_size=0
query_cache_type=0
query_cache_limit=1M
  • performance_schema = ON enable PFS

Performance Schema это механизм для мониторинга производительности MySQL сервера который по умолчанию выключен. Система позволяет делать многое, но её настройка сложна и надо обладать хорошими знаниями в плане работы баз данных MySQL. Возможно, в будущем я добавлю сюда информацию о том как с ней работать.

После внесения изменений выполним перезапуск MariaDB:

systemctl restart mariadb

Теперь вывод примет вид:

mysqltuner
= вывод команды =
>> MySQLTuner 1.7.13 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering

[--] Skipped version check for MySQLTuner script
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: [OK] Currently running supported MySQL version 10.3.12-MariaDB-log
[OK] Operating on 64-bit architecture

-------- Log file Recommendations
[--] Log file: /var/lib/mysql/mysql_error.log(35K)
[OK] Log file /var/lib/mysql/mysql_error.log exists
[OK] Log file /var/lib/mysql/mysql_error.log is readable.
[OK] Log file /var/lib/mysql/mysql_error.log is not empty
[OK] Log file /var/lib/mysql/mysql_error.log is smaller than 32 Mb
[!!] /var/lib/mysql/mysql_error.log contains 0 warning(s).
[!!] /var/lib/mysql/mysql_error.log contains 0 error(s).
[--] 12 start(s) detected in /var/lib/mysql/mysql_error.log
[--] 1) 2019-02-11 23:07:41 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 2) 2019-02-11 0:19:06 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 3) 2019-02-11 0:01:53 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 4) 2019-02-10 23:45:22 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 5) 2019-02-10 23:42:20 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 6) 2019-02-10 23:40:37 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 7) 2019-02-10 23:36:16 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 8) 2019-02-10 23:33:53 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 9) 2019-02-10 23:16:12 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 10) 2019-02-10 23:05:08 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 11 shutdown(s) detected in /var/lib/mysql/mysql_error.log
[--] 1) 2019-02-11 9:12:02 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 2) 2019-02-11 0:19:06 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 3) 2019-02-11 0:01:53 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 4) 2019-02-10 23:45:21 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 5) 2019-02-10 23:42:19 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 6) 2019-02-10 23:40:37 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 7) 2019-02-10 23:36:16 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 8) 2019-02-10 23:28:06 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 9) 2019-02-10 23:16:12 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 10) 2019-02-10 23:05:07 0 [Note] /usr/sbin/mysqld: Shutdown complete

-------- Storage Engine Statistics
[--] Status: +Aria +CSV +InnoDB +MEMORY +MRG_MyISAM +MyISAM +PERFORMANCE_SCHEMA +SEQUENCE 
[!!] InnoDB is enabled but isn't being used
[OK] Total fragmented tables: 0

-------- Analysis Performance Metrics
[--] innodb_stats_on_metadata: OFF
[OK] No stat updates during querying INFORMATION_SCHEMA.

-------- Security Recommendations
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] There is no basic password file list!

-------- CVE Security Recommendations
[--] Skipped due to --cvefile option undefined

-------- Performance Metrics
[--] Up for: 58s (10 q [0.172 qps], 14 conn, TX: 56K, RX: 1K)
[--] Reads / Writes: 100% / 0%
[--] Binary logging is disabled
[--] Physical Memory : 1.8G
[--] Max MySQL memory : 1.5G
[--] Other process memory: 59.2M
[--] Total buffers: 1.0G global + 2.9M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 1.0G (57.61% of installed RAM)
[OK] Maximum possible memory usage: 1.5G (81.36% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/10)
[OK] Highest usage of available connections: 0% (1/151)
[!!] Aborted connections: 7.14% (1/14)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[OK] Query cache is disabled by default due to mutex contention on multiprocessor machines.
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] Temporary tables created on disk: 0% (0 on disk / 4 total)
[OK] Thread cache hit rate: 92% (1 created / 14 connections)
[OK] Table cache hit rate: 64% (11 open / 17 opened)
[OK] Open file limit used: 0% (26/16K)
[OK] Table locks acquired immediately: 100% (18 immediate / 18 locks)

-------- Performance schema
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B
[--] Sys schema isn't installed.

-------- ThreadPool Metrics
[--] ThreadPool stat is enabled.
[--] Thread Pool Size: 1 thread(s).
[--] Using default value is good enough for your version (10.3.12-MariaDB-log)

-------- MyISAM Metrics
[!!] Key buffer used: 18.2% (24M used / 134M cache)
[OK] Key buffer size / total MyISAM indexes: 128.0M/123.0K

-------- InnoDB Metrics
[--] InnoDB is disabled.
[!!] InnoDB Storage engine is disabled. InnoDB is the default storage engine

-------- AriaDB Metrics
[--] AriaDB is enabled.
[OK] Aria pagecache size / total Aria indexes: 128.0M/1B

-------- TokuDB Metrics
[--] TokuDB is disabled.

-------- XtraDB Metrics
[--] XtraDB is disabled.

-------- Galera Metrics
[--] Galera is disabled.

-------- Replication Metrics
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: MIXED
[--] XA support enabled: ON
[--] Semi synchronous replication Master: OFF
[--] Semi synchronous replication Slave: OFF
[--] This is a standalone server

-------- Recommendations
General recommendations:
Control warning line(s) into /var/lib/mysql/mysql_error.log file
Control error line(s) into /var/lib/mysql/mysql_error.log file
Add skip-innodb to MySQL configuration to disable InnoDB
MySQL was started within the last 24 hours - recommendations may be inaccurate
Reduce or eliminate unclosed connections and network issues
Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
Performance schema should be activated for better diagnostics
Consider installing Sys schema from https://github.com/mysql/mysql-sys
Variables to adjust:
performance_schema = ON enable PFS

Базовые параметры

Обычно я добавляю следующие параметры по умолчанию в свои сервера:

vim /etc/my.cnf.d/server.cnf 
= необходимые дополнения [mysqld] =
# базовые настройки
character_set_server=utf8
collation-server=utf8_bin
init_connect="SET NAMES utf8 collate utf8_bin"

innodb_file_per_table=1
innodb_buffer_pool_size = 800M # внимание на параметр! установить примерно в 2 раза меньше объема оперативной памяти сервера
innodb_log_file_size = 200M # размер файла лога innodb должен составлять 25% от размера буфера
innodb_buffer_pool_instances=1 # увеличивать на 1 каждый GB innodb_buffer_pool_size
innodb_flush_log_at_trx_commit = 0
innodb_log_files_in_group = 3

Обязательно после всех работ с настройкой баз данных выполняйте проверку статуса на предмет ошибок выполняя команду:

# systemctl status mariadb -l

Ротация логов MariaDB

Откроем необходимый файл и сделаем необходимые изменения:

vim /etc/logrotate.d/mysql
= часть вывода с необходимыми изменениями =
/var/lib/mysql/*log {
        # create 600 mysql mysql
        notifempty
        daily
        size 5M
        rotate 7
        missingok
        compress
    postrotate
        # just if mysqld is really running
        if test -x /usr/bin/mysqladmin && \
           /usr/bin/mysqladmin ping &>/dev/null
        then
           /usr/bin/mysqladmin --local flush-error-log \
              flush-engine-log flush-general-log flush-slow-log
        fi
    endscript
}

Мы указали что надо ротировать все логи и хранить 7 дней при условии что размер файла 5 Mегабайт.

Сохраним и применим изменения без перезагрузки:

logrotate /etc/logrotate.conf

Проверим правильность выполнив тестирование (опция -d):

logrotate -d /etc/logrotate.d/mysql
= вывод команды =
reading config file /etc/logrotate.d/mysql
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/lib/mysql/*log  5242880 bytes (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/lib/mysql/mysql_error.log
  log does not need rotating (log size is below the 'size' threshold)
considering log /var/lib/mysql/slow_queries.log
  log does not need rotating (log size is below the 'size' threshold)
considering log /var/lib/mysql/tc.log
  log does not need rotating (log size is below the 'size' threshold)

Все логи не имеют необходимого размера для выполнения ротации.

Вывод

Постарался изложить основные момента по работе с базой данных MariaDB. Настройка и оптимизация MariaDB для каждого ресурса может сильно отличатся и поэтому нет смысла описывать каждый параметр.

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

Исходя из статьи вы теперь знаете откуда брать информацию о всех параметрах вашего сервера баз данных.

Для желающих дополнить или подправить ниже есть комментарии.

SFTP настройка для веб хостинга

SFTP удобное и безопасное подключение к файлам ресурса используя ssh. Инструкцию можно использовать для любых систем Linux. Отличие только в командах на перезапуск сервисов Nginx, Php-fpm, SSH и путях к файлам настройки.

Введение

Ранее я использовал для работы с файлами сайтов программу ProFTP, но отказался в пользу SFTP из за более стабильной работы и простоты настройки. Настройка показана на примере CentOS 7.

С статье на сайте можете узнать про настройку доступа по FTP к сайтам на сервере VDS под управлением CentOS 7 используя программу ProFTPd. Создание файловой базы пользователей для авторизации с правами от Nginx. Подключение с использованием сертификата для TLS.

Добавление пользователя

Создадим пользователя которому дадим права на файлы ресурса. Удобно использовать имя пользователя пересекающееся с названием сайта.

В нашем случае мы настраиваем доступ к сайту sevo44.ru. Добавим пользователя с нужными параметрами и создадим ему пароль:

useradd -s /sbin/nologin sevo44.ru 
passwd sevo44.ru

Добавляем пользователя nginx в группу sevo44.ru.

usermod -aG sevo44.ru nginx

Настройка SSH для SFTP

Открываем конфигурационный файл ssh находящийся по пути /etc/ssh/sshd_config. Комментируем один параметр и добавим необходимый код:

vim /etc/ssh/sshd_config
= необходимые изменения и добавления =
# Закоментируем параметр
#Subsystem sftp /usr/lib64/misc/sftp-server

# Для работы sftp
Subsystem sftp internal-sftp
# Для sevo44.ru
Match User sevo44.ru
 X11Forwarding no
 AllowTcpForwarding no
 AllowAgentForwarding no
 PermitTunnel no
 ForceCommand internal-sftp
 ChrootDirectory /var/www/sevo44.ru
# /sevo44.ru

Перезапускаем службу sshd:

systemctl restart sshd

Доступ к файлам ресурса уже есть и можно подключатся, но могут возникнуть проблемы с правами. Ниже я расскажу как избежать проблем связанных с правами на файлы.

Настройка прав на данные

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

chown -R sevo44.ru:sevo44.ru /var/www/sevo44.ru/

Возвращаем обратно рута владельцем корня chroot:

chown root. /var/www/sevo44.ru/
chown root. /var/www/sevo44.ru/log/

Внимание! Сначала мы рекурсивно назначаем права на все содержимое директорий, а потом возвращаем владельца root на корень сайта.

Все папки в пути /var/www/sevo44.ru/ должны быть пользователя root!

Только в таком варианте все будет корректно работать!

Для безопасности запретим пользователю редактировать папку log.

Редактирование будет возможно только в папке WWW где находятся все файлы сайта!

Перед выполнением следующего этапа лучше проверить подключение. В случае проблем с подключением смотрим лог выведя последние 10 строчек:

tail -n 10 /var/log/secure

Настройка Logrotate для сайтов

Для просмотра логом сайтов используя подключение по sftp необходимо создать файл со следующим кодом (на основе скопированного файла nginx):

cp /etc/logrotate.d/nginx /etc/logrotate.d/site
vim /etc/logrotate.d/site
= необходимый код =
/var/www/sevo44.ru/log/*.log
{
        daily
        missingok
        rotate 15
        compress
        delaycompress
        notifempty
        #create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

Сохраним и применим изменения без перезагрузки:

logrotate /etc/logrotate.conf

Настройка PHP-FPM

Создадим отдельный pool для php-fpm, который будет обслуживать сайт sevo44.ru. Использование отдельного пула для сайта так же может быть обусловлено специфическими настройками для ресурса. Удобно когда для каждого сайта используется независимый пул в котором можно выставить необходимые значения. Переходим в нужную папку, копируем существующий конфигурационный файл и делаем необходимые изменения:

cd /etc/php-fpm.d/
cp www.conf sevo44.ru.conf
vim /etc/php-fpm.d/sevo44.ru.conf
= необходимые параметры =
[sevo44.ru]
 user = sevo44.ru
 group = sevo44.ru
 listen = /run/php-fpm/php-fpm-sevo44.sock
 listen.owner = sevo44.ru
 listen.group = sevo44.ru
 pm = dynamic
 pm.max_children = 20
 pm.start_servers = 2
 pm.min_spare_servers = 1
 pm.max_spare_servers = 3

Осталось указать нужный параметр в настройки хоста для nginx.

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

vim /etc/nginx/conf.d/sevo44.ru.conf
= необходимый параметр =
fastcgi_pass unix:/run/php-fpm/php-fpm-sevo44.sock;

Проверим правильность настройки Nginx и перезагрузим необходимые сервисы:

nginx -t
systemctl reload nginx
systemctl restart php-fpm

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

Заключение

В результате настроек мы получаем защищённый и удобный доступ для работы с файлами ресурса. Для работы я использую программу FileZilla. Кроме того, из статьи RSA или авторизация SSH по ключу вы можете узнать как используя программу FileZilla можно подключатся по файлу с ключом расширения ppk.

LEMP сервер на Calculate Linux

Настроим веб-сервер LEMP использующий службы Nginx, MariaDB и PHP на сборке CSS от Calculate Linux (Gentoo). Давно успешно использую версии Calculate Linux на рабочих компьютерах и прошло время применения на рабочих серверах.

Введение

На своем рабочем компьютере я уже давно использую дистрибутивы Calculate Linux и вот добрались руки до внедрения этого дистрибутива на рабочие сервера. Работать с системой Gentoo без большого опыта в системах Linux очень сложно, но разработчики Calculate Linux сильно упростили установку и работу с системой и постоянно ведут работы по улучшению своих утилит. Пакеты как правило используются свежие что не может не радовать. Настроим первый рабочий сервер на сборке CSS на котором будут работать интернет ресурсы. СSS это самый минимальный набор очень похожий на то как выглядит дистрибутивы c понятием minimall в CentOS или netinst в Debian.

Настройка времени на LEMP сервере

За правильность времени отвечает локализация в системе. Смена локализации в дистрибутивах Calculate Linux выполняется командой:

cl-setup-locale --timezone Europe/Moscow 
= вывод команды =
 * Настройка локализации и времени ... [ ok ] 
 * Система настроена!

Проверим время на сервере lepm:

date
=вывод команды =
Пн ноя 13 19:14:56 MSK 2017

Время отстаёт на 3 часа. Посмотрим время UTC:

date -u
= вывод команды =
Пн ноя 13 16:15:04 UTC 2017

Видим что разница в 3 часа а значит локализация работает правильно остается только правильно настроить время UTC.

Установим пакет с помощью которого мы исправим время на правильное:

emerge -av net-misc/ntp

При установке любого пакета на lepm сервер добавляйте команду —ask! Команда выведет всю информацию перед установкой и ознакомившись с ней вам надо будет принять решение.

Произведем синхронизацию с сервером времени:

ntpdate pool.ntp.org

Настройка Iptables скриптом

По умолчанию iptables работает и полностью открыт в чем можно убедиться выполнив команду:

iptables -L -v -n
= вывод команды =
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination

Добавим скрипт в котором укажем правила для lemp сервреа и сохраним их чтобы после перезагрузки они остались:

vim /root/iptables.sh
= необходимые добавления =
#!/bin/bash 
# Очистка всех цепочек iptables
iptables -F 
iptables -X 
iptables -Z 
# Политики для трафика, не соответствующего ни одному правилу
iptables -P INPUT DROP 
iptables -P FORWARD DROP 
iptables -P OUTPUT ACCEPT 
# Разрешаем Ping
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Прочие настройки
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT 
iptables -A INPUT -p tcp --syn --dport 113 -j REJECT --reject-with tcp-reset 
# Доступ по ssh 
iptables -A INPUT -p TCP --dport 22 -j ACCEPT 
# Доступ к webserver по http и https
iptables -A INPUT -p TCP --dport 80 -j ACCEPT 
iptables -A INPUT -p TCP --dport 443 -j ACCEPT 
# Сохраняем правила 
#Calculate/Gentoo хранит в /var/lib/iptables/rules-save 
rc-service iptables save

Сохраняем и даем скрипту права на запуск:

chmod +x /root/iptables.sh

Осталось выполнить скрипт для внесения правил:

Будьте очень внимательны при составлении скрипта дабы не потерять доступ к серверу! Убедитесь что порт для доступа к ssh в скрипте соответствует работающему на сервере!

sh /root/iptables.sh     
= вывод команды =
iptables          | * Saving iptables state ...       [ ok ]

Просмотр правил iptables

Посмотрим правильность применения правил:

iptables -L -v -n 
= вывод команды =
Chain INPUT (policy DROP 31 packets, 2260 bytes) 
 pkts bytes target     prot opt in     out     source               destination          
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 0 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11 
    6   504 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 
   91  8220 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED 
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0            
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 12 
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:113 flags:0x17/0x02 reject-with tcp-reset 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 
 
Chain FORWARD (policy DROP 0 packets, 0 bytes) 
 pkts bytes target     prot opt in     out     source               destination          
 
Chain OUTPUT (policy ACCEPT 80 packets, 9864 bytes) 
 pkts bytes target     prot opt in     out     source               destination

Видим что все правила что нам надо выполнились.

Смена порта SSH сервера

Один из лучших вариантов защиты lemp сервера это смена порта службы которая делается в два этапа.

  • Меняется порт в файле настройки
vim /etc/ssh/sshd_config
= вывод команды с необходимыми изменениями =
#Port 22
Port 20000
  • Перезапускается сервис SSH
/etc/init.d/sshd restart 
= вывод команды =
sshd         | * Caching service dependencies ...     [ ok ] 
sshd         | * Stopping sshd ...                    [ ok ] 
sshd         | * Starting sshd ...                    [ ok ]

Для доступа в команде необходимо добавить указанный порт

ssh -p 20000 root@192.168.0.100

Установка и настройка Nginx на Calculate Linux

Хорошую альтернативу Apach придумал Игорь Сысоев. Работать одно удовольствие, а главное все быстро и идеально подходит для высоко нагруженных сайтов. Для мало нагруженных увеличение скорости тоже очень важно. После перехода с Apach на Nginx скорость работы ресурсов приятно радует. Стараюсь везде использовать Lemp сервер в замену старому Lamp работающему на Apach.

За основу взяли инструкция с Wiki Gentoo. Всё на русском и очень подробно описано.

Установка Nginx

Установим главный компонент Lemp сервера:

emerge -av www-servers/nginx
= вывод команды =
Local copy of remote index is up-to-date and will be used.

* IMPORTANT: 2 news items need reading for repository 'gentoo'.
* Use eselect news read to view new items.

These are the packages that would be merged, in order:

Calculating dependencies... done!
[binary N ] www-servers/nginx-1.12.1 USE="http http-cache http2 ipv6 pcre ssl threads -aio -debug -libatomic (-libressl) -luajit -pcre-jit -rtmp (-selinux) -vim-syntax" NGINX_MODULES_HTTP="access auth_basic autoindex browser charset empty_gif fastcgi geo gzip limit_conn limit_req map memcached proxy referer rewrite scgi split_clients ssi upstream_hash upstream_ip_hash upstream_keepalive upstream_least_conn upstream_zone userid uwsgi -addition -auth_ldap -auth_pam -auth_request -cache_purge -dav -dav_ext -degradation -echo -fancyindex -flv -geoip -gunzip -gzip_static -headers_more -image_filter -lua -memc -metrics -mogilefs -mp4 -naxsi -perl -push_stream -random_index -realip -secure_link -security -slice -slowfs_cache -spdy -sticky -stub_status -sub -upload_progress -upstream_check -xslt" NGINX_MODULES_MAIL="-imap -pop3 -smtp" NGINX_MODULES_STREAM="-access -geo -geoip -limit_conn -map -realip -return -split_clients -ssl_preread -upstream_hash -upstream_least_conn -upstream_zone"

Would you like to merge these packages? [Yes/No] yes
>>> Emerging binary (1 of 1) www-servers/nginx-1.12.1::gentoo
>>> Installing (1 of 1) www-servers/nginx-1.12.1::gentoo
>>> Recording www-servers/nginx in "world" favorites file...
>>> Jobs: 1 of 1 complete Load avg: 0.49, 0.16, 0.06

* Messages for package www-servers/nginx-1.12.1:

*
* This nginx installation comes with a mitigation for the HTTPoxy
* vulnerability for FastCGI, SCGI and uWSGI applications by setting
* the HTTP_PROXY parameter to an empty string per default when you
* are sourcing one of the default
*
* - 'fastcgi_params' or 'fastcgi.conf'
* - 'scgi_params'
* - 'uwsgi_params'
*
* files in your server block(s).
*
* If this is causing any problems for you make sure that you are sourcing the
* default parameters _before_ you set your own values.
* If you are relying on user-supplied proxy values you have to remove the
* correlating lines from the file(s) mentioned above.
*
>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.

* IMPORTANT: 2 news items need reading for repository 'gentoo'.
* Use eselect news read to view new items.

Запуск и проверка работы

Стандартная конфигурация nginx предполагает работу с корневым каталогом в /var/www/localhost/htdocs. Установка создаёт только каталог /var/www/localhost, без папки htdocs и индексного файла.

Тут вам решать или сделать свои пути или использовать стандарт разработчика на своем сервере lemp. В моем случае я оставляю стандарт разработчика с небольшими изменениями касающиеся размещения логом виртуальных ресурсов.

mkdir /var/www/localhost/htdocs
 echo 'Hello, sevo44!' > /var/www/localhost/htdocs/index.html

Пакет nginx включает в себя init-скрипт, позволяющий останавливать, запуска и перезапускать службу веб-сервера. Для запуска службы nginx выполним следующую команду:

/etc/init.d/nginx start
= вывод команды =
nginx  | * Checking nginx' configuration ...            [ ok ] 
nginx  | * Starting nginx ...                           [ ok ]

Добавим nginx в автозагрузку:

rc-update add nginx default

Чтобы проверить, что nginx работает и есть доступ, в консоли сервера выполним команду которая откроет страницу сайта воспользовавшись консольным веб-клиентом curl:

curl http://localhost
= вывод команды =
Hello, sevo44!

На сервере все работает, но если мы захотим соединиться с машины в локальной сети то ip адресу то получим ошибку:

curl: (7) Failed to connect to 192.168.0.141 port 80: В соединении отказано

Чтобы исправить ошибку необходимо внести исправления параметра listen для сайта. Вместо 127.0.0.1 указать порт 80 на котором работает ресурс.

Конечно лучше в сети иметь DNS сервер куда прописать пути для всех ресурсов работающих на lemp сервере. Если этого нет, то достаточно добавить код в нужный файл на локальном компьютере и доступ будет осуществлять по требуемому имени. Вот пример как будет выглядеть строка для моего PhpMyAdmin который будет работать по адресу pmalempcss.sevo44.loc на машине с ip адресов 192.168.0.141:

vim /etc/hosts
= необходимое добавление =
192.168.0.141 pmalempcss.sevo44.loc

Главный конфигурационный файл NGINX

Все настройки как самого Nginx так и ресурсов которые на нем работают прописываются в файле /etc/nginx/nginx.conf.

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

Скопируем оригинал и откроем его для изменения необходимых параметров параметры:

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig
vim /etc/nginx/nginx.conf
= часть вывода команды с пояснениями =
 user nginx nginx;
 worker_processes 4; --- выставляем по количеству процессоров

Варианты конфигурации для сайтов

Дальше надо определится как будем работать с настройкой сайтов.
Существует два пути:

  • редактирование всё в одном файле,
  • для каждого сайта сделать свой файл настроек.

По умолчанию после усатновке настрока сделана для настройки в одном файле. Мне не удобно работать с одним файлом я разобью настройку по ресурсам.

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

cat /etc/nginx/nginx.conf 
= вывод команды с информацией он необходимых изменениях =
user nginx nginx; 
worker_processes 4; 
 
error_log /var/log/nginx/error_log info; 
 
events { 
        worker_connections 1024; 
        use epoll; 
} 
 
http { 
        include /etc/nginx/mime.types; 
        default_type application/octet-stream; 
 
        log_format main 
                '$remote_addr - $remote_user [$time_local] ' 
                '"$request" $status $bytes_sent ' 
                '"$http_referer" "$http_user_agent" ' 
                '"$gzip_ratio"'; 
 
        client_header_timeout 10m; 
        client_body_timeout 10m; 
        send_timeout 10m; 
 
        connection_pool_size 256; 
        client_header_buffer_size 1k; 
        large_client_header_buffers 4 2k; 
        request_pool_size 4k; 
 
        gzip off; 

        # Скрываем версию nginx
        server_tokens off;
 
        output_buffers 1 32k; 
        postpone_output 1460; 
 
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
 
        keepalive_timeout 75 20; 
 
        ignore_invalid_headers on; 
 
        index index.html; 
 
        include /etc/nginx/conf.d/*.conf; 
 
}

Создадим папку где будет лежать файлы настройки для сайтов:

mkdir /etc/nginx/conf.d

Создадим файл настроек для localhost:

vim /etc/nginx/conf.d/local.conf
= необходимые добавления c комментариями =
 server {
# Порт на котором работает ресурс
 listen 80;
# Название ресурса по которому будет осуществляться доступ
 server_name localhost;
# Пути куда будут писаться логи
access_log /var/log/nginx/localhost.access_log main;
error_log /var/log/nginx/localhost.error_log info;
# Корневая папка ресурса
root /var/www/localhost/htdocs;
}

Перед тем как перезапускать службу nginx всегда выполняйте проверку правильности сделанных изменений в настройках выполнив команду nginx -t.

Проверим и произведем применение изменений:

nginx -t 
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 
nginx: configuration file /etc/nginx/nginx.conf test is successful 

/etc/init.d/nginx reload 
= вывод команды =
nginx  | * Checking nginx' configuration ...             [ ok ] 
nginx  | * Refreshing nginx' configuration ...           [ ok ]

Команды управления Nginx

/etc/init.d/nginx stop - остановка
/etc/init.d/nginx start - запуск
/etc/init.d/nginx restart - перезагрузка
nginx -t - проверка изменений в файлах настройки
/etc/init.d/nginx reload - применение изменений

Предпочтительней использовать команду reload после изменения файлов настройки, так как в отличии от restart не обрывается доступ к ресурсам которые находятся в работе.

Установка PHP для NGINX

Для поддержки php в конфигурацию сайта работающего под nginx необходимо добавить определенный код. В данном примере nginx обменивается информацией с процессом PHP через UNIX-сокет. В блок server надо добавить блок location в котором и будут описаны правила работы с php.

 http {
 ...
 server {
 ...
 location ~ \.php$ {
 try_files $uri =404;
 include /etc/nginx/fastcgi.conf;
 fastcgi_pass unix:/run/php-fpm.socket;
 }
 }
 }

Установка  PHP

Перед установкой посмотрим какие версии PHP могут быть установлены:

eix dev-lang/php
= вывод команды =
* dev-lang/php
 Доступные версии: 
 (5.6) 5.6.33 5.6.34 ~5.6.35
 (7.0) 7.0.27 7.0.28 ~7.0.29
 (7.1) 7.1.13 ~7.1.14 7.1.15 ~7.1.16
 (7.2) ~7.2.4

Зелёным цветом помечены версии которые могут быть установлены и являются стабильными. Версии с тильдой являются не стабильными и замаскированы.

Версия PHP очень важна и лучше сделать так что бы при обновлениях вы не получили неожиданных проблем от установки новой версии.

Добавим в необходимый файл параметр который запретит установку новых версий:

vim /etc/portage/package.mask/custom
= необходимые данные =
>dev-lang/php-7.1

Согласно этого параметра установка версий выше 7.1 запрещена.

Для такой конфигурации Lepm сервера необходимо собрать PHP с поддержкой менеджера процессов FastCGI (dev-lang/php), включив USE-флаг fpm. Для дистрибутива Calculate Linux необходимо выполнить команду:

echo "dev-lang/php fpm" >> /etc/portage/package.use/custom

Советую сразу добавить флаг dev-lang/php mysqli иначе не будет работать PhpMyAdmin из за ошибки «Расширение mysqli не найдено. Пожалуйста, проверьте ваши настройки PHP.» и флагdev-lang/php postgres если планируйте работать с базами PostresQL. Сборка PHP не быстрая имейте это ввиду.

echo "dev-lang/php mysqli postgres" » /etc/portage/package.use/custom

В случае если нам необходимо исключить какой то параметр достаточно добавить его с тире:

echo "dev-lang/php mysqli -postgres" » /etc/portage/package.use/custom

Состояние флагов может меняться и поэтому вначале необходимо запустить установку и посмотреть какие параметры будут использованы при установке и только после этого принимать решение об добавлении или удалении параметров.

Установим PHP с включенными USE-флагоми:

emerge -av dev-lang/php
= вывод части команды =
[binary N ] dev-lang/php-7.0.28:7.1::gentoo USE="acl berkdb bzip2 cgi cli crypt ctype curl exif fileinfo filter fpm ftp gd gdbm hash iconv intl ipv6 json mysql mysqli nls opcache pdo phar posix postgres readline session simplexml sockets ssl threads tokenizer truetype unicode webp xml xmlreader xmlwriter zip zlib -apache2 -bcmath -calendar -cdb -cjk -coverage -debug -embed -enchant (-firebird) -flatfile -gmp -imap -inifile -iodbc -kerberos -ldap -ldap-sasl -libedit -libressl -mhash -mssql -oci8-instant-client -odbc -pcntl -phpdbg -qdbm -recode (-selinux) -session-mm -sharedmem -snmp -soap -spell -sqlite (-systemd) -sysvipc {-test} -tidy -wddx -xmlrpc -xpm -xslt" 

Проверяем усатнавливаемую версию и правильность устанавливаемых параметров и если все верно запускам усатновку.
Процесс долгий! У меня длится в районе 1 часа!

Использование UNIX-сокета для взаимодействия Nginx c PHP является предпочтительным и рекомендуемым вариантом!

Информации о версии PHP

php -v
= вывод команды =
PHP 7.2.2 (cli) (built: Feb 19 2018 03:15:04) ( ZTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
 with Zend OPcache v7.2.2, Copyright (c) 1999-2018, by Zend Technologies

Информация о расширениях PHP

Вывод информации о всех имеющихся и работающих расширениях можно командой:

php -m 
= вывод команды =
[PHP Modules] 
bz2 
Core 
ctype 
curl 
date 
dba 
dom 
exif 
fileinfo 
filter 
ftp 
gd 
gettext 
hash 
iconv 
json 
libxml 
mbstring 
mcrypt 
mysqli 
mysqlnd 
openssl 
pcre 
PDO 
pdo_mysql 
pdo_sqlite 
Phar 
posix 
pspell 
readline 
Reflection 
session 
SimpleXML 
sockets 
SPL 
sqlite3 
standard 
tokenizer 
xml 
xmlreader 
xmlwriter 
Zend OPcache 
zip 
zlib 
 
[Zend Modules] 
Zend OPcache

Настройка php-fpm для Nginx

Главные настройки находятся в файле php-fpm.conf нам необходимо проверить только наличие необходимой строки:

cat /etc/php/fpm-php7.0/php-fpm.conf 
= необходимый параметр =
include=/etc/php/fpm-php7.0/fpm.d/*.conf

Скопируем и внесем изменения в файл настроек php.ini:

cp /etc/php/fpm-php7.0/php.ini /etc/php/fpm-php7.0/php.ini_orig
vim /etc/php/fpm-php7.0/php.ini
= необходимые изменения = 
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Необходимая временная зона
date.timezone = "Europe/Moscow"

Перед запуском php-fpm на lemp сервере нам осталось скопировать оригинал и провести редактирование пула (pool) который будет обслуживать все сайты:

cp /etc/php/fpm-php7.0/fpm.d/www.conf /etc/php/fpm-php7.0/fpm.d/www.conf_orig
vim /etc/php/fpm-php7.0/fpm.d/www.conf
= результат после редактирования =
[www]
user = nginx
group = nginx
;Запуск PHP с поддержкой UNIX-сокета
listen = /run/php-fpm.socket
listen.owner = nginx
listen.group = nginx
pm = dynamic
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Параметры для работы с сокетом добавляем в пулы так как в последствии нам будет проще работать с необходимыми параметрами для работы разных ресурсов.

Запустим службу php-fpm:

/etc/init.d/php-fpm start 
= вывод команды =
php-fpm           | * Testing PHP FastCGI Process Manager configuration ...   [ ok ] 
php-fpm           | * Starting PHP FastCGI Process Manager ...                [ ok ]

Добавим php-fpm в автозагрузку:

rc-update add php-fpm default

Перезагрузим nginx с измененной конфигурацией:

/etc/init.d/nginx reload

Проверка работы php-fpm для Nginx

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

vim /var/www/localhost/htdocs/info.php
= необходимый код для добавления =
<?php phpinfo(); ?>

Теперь в браузере наберем нужный путь http://localhost/info.php и в случае успешной настройки увидим страницу с выводом обо всех параметрах php.

Установка и настройка MariaDB

За основу взята инструкция с Wiki Gentoo.

Обычно я маскирую версию MariaDB по аналогии с версией PHP. У каждого ресурса использующего PHP и базу данных MySQL есть требования к версиям. Чтобы избежать проблемы после обновления лучше обновлять эти версии вручную.

Установим на Lemp сервер MariaDB командой:

emerge -av mariadb

После установки сервиса необходимо произвести начальную настройку выполнив команду:

emerge --config dev-db/mariadb
= вывод команды с пояснениями =
Configuring pkg... 
 
 * Trying to get password for mysql 'root' user from 'mysql' section ... 
 * Trying to get password for mysql 'root' user from 'client' section ... 
 * Please provide a password for the mysql 'root' user now 
 * or through the /root/.my.cnf file. 
 * Avoid ["'\_%] characters in the password 
    > вводим пароль для root
 * Retype the password 
    > повторяем пароль
 * Creating the mysql database and setting proper permissions on it ... 
 = часть вывода не показана =

Добавим в автозагрузку:

rc-update add mysql default
= вывод команды =
* service mysql added to runlevel default

Запустим:

rc-service mysql start
= вывод команды =
mysql  | * Checking mysqld configuration for mysql ...    [ ok ] 
mysql  | * Starting mysql ...                             [ ok ]

 Правила доступа к серверу MariaDB

Обычно в настройках стоит параметр который блокирует подключение к базе кроме локального. Изменим необходимый параметр для доступа:

vim /etc/mysql/my.cnf
= необходимое изминение =
# Доступ со всех компьютеров
bind-address = 0.0.0.0
# Доступ только с определеного компьютера
#bind-address = 10.10.0.2

Удаление бинарных лог-файлов MySQL

Очень быстро вы заметите что размер папки /var/lib/mysql с базами будет сильно увеликиватся. Увеличение размера дают бинарные лог-файлы MySQL (mysql-bin.000001, mysql-bin.000002 и тд.) для организации репликации, когда несколько баз данных и для восстановления данных в случае сбоя.

Решим эту проблемму очисткой данных свыше 5 дней добавив в секцию [mysqld] конфигурационного файла /etc/mysql/my.cnf, следующие параметры:

vim /etc/mysql/my.cnf
= необходимые параметры =
# Активируем бинарные логи.
log-bin
# Время хранения логов 5 дней
expire_logs_days = 5

После внесения всех изминений перезагрузим MariaDB выполнив команду:

rc-service mysql restart

Варианты работы с базами MariaDB

Возможно несколько вариантов работы с базами на сервере Lemp. Рассмотрим вариант работы с базами с помощью программы PhpMyAdmin работающую в любом браузере и работу с базами в консоли.

Установка и настройка PhpMyAdmin

Ранее я описывал установку PhpMyAdmin для дистрибутива CentOS. Статья подойдет и для установки на любой другой дистрибутив.

Вначале я произвел установку командой emerge phpmyadmin но мне не понравился этот вариант и я установил всё руками.

Причины по которым я не стал устанавливать используя emerge:

  • Папка с файлами устанавливается без папки setup в которой лежат файлы для создания конфигурационного файла PhpMyAdmin,
  • Инструкция описывает настройку для Apach,
  • Файл настройки для Nginx не создается.

Создадим необходимые папки:

mkdir -p /var/www/pma/{logs,backup}

Перейдем в нужную папку и скачаем архив с последней версией PhpMyAdmin с сайта разработчика:

cd /var/www/pma
wget https://files.phpmyadmin.net/phpMyAdmin/4.7.5/phpMyAdmin-4.7.5-all-languages.zip

Установим пакет необходимый для распаковки zip архивов:

emerge -av unzip

Распакуем архив zip:

unzip /var/www/pma/phpMyAdmin-4.7.5-all-languages.zip -d /var/www/pma

Переименуем папку phpMyAdmin-4.7.5-all-languages в www:

mv /var/www/pma/phpMyAdmin-4.7.5-all-languages /var/www/pma/www

Дадим необходимые права на папку pma и все файлы и папки внутри:

chown -R nginx:nginx /var/www/pma

Создадим файл настроек для ресурса под управлением Nginx:

vim /etc/nginx/conf.d/pma.conf  
= вывод команды =
# pmalempcss.sevo44.loc
server { 
        listen 80; 
        server_name pmalempcss.sevo44.loc; 
 
        access_log /var/www/pma/logs/pma.access_log main; 
        error_log /var/www/pma/logs/pma.error_log info; 
 
        root /var/www/pma/www/; 
 
        index index.php index.html index.htm; 
 
 
        location ~ \.php$ { 
               try_files $uri =404; 
               include /etc/nginx/fastcgi.conf; 
               fastcgi_pass unix:/run/php-fpm.socket; 
           } 
 
}

Запустим http://pmalempcss.sevo44.loc/setup откроется страница с выбором параметров и последующим сохранением файла настроек phpmyadmin.

После того как файл настроек config.inc.php будет добавлен в корень сайта доступ к этой папке будет закрыт!

Создадим файл с необходимыми нам настройками PhpMyAdmin:

vim /var/www/pma/www/config.inc.php
= необходимый код для добавления =
<?php
/*
 * Generated configuration file
 * Generated by: phpMyAdmin 4.7.5 setup script
 * Date: Sat, 18 Nov 2017 15:51:14 +0000
 */

/* Servers configuration */
$i = 0;

/* Server: localhost [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = '';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';

/* End of servers configuration */

$cfg['DefaultLang'] = 'ru';
$cfg['blowfish_secret'] = '5"+y<2TqP+qrobW`%c!!9"BRYdIVZGIL';
$cfg['ServerDefault'] = 1;
$cfg['UploadDir'] = '/var/www/pma/backup';
$cfg['SaveDir'] = '/var/www/pma/backup';
?>

Дадим необходимые права для файла настроек:

chown nginx:nginx /var/www/pma/www/config.inc.php

Подключение к удаленному MariaDB серверу

PhpMyAdmin c легкостью позволяет подключатся к другим серверам баз данных. Необходимо добавить необходимые настройки в конфигурационный файл и не забыть дать доступ на сервере к которому подключемся. Добавим необходимый блок:

vim /var/www/pma/www/config.inc.php 
= необходимый код для добавления =
/* Server: glpi [2] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'glpi';
$cfg['Servers'][$i]['host'] = '10.10.0.6';
$cfg['Servers'][$i]['port'] = '';
#$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['socket'] = '';
#$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';

Колличество блоков может быть не ограниченно.

Работа с базами в консоли

Ранее я писал статью как работать с базами в консоли. Материал подойдет для любой версии дистрибутива.

Ротация логов сайтов

Перед настройкой убедитесь что установлен пакет app-admin/logrotate отвечающий за ротацию!

Проверка наличия

eix app-admin/logrotate
eix logrotate 
* app-admin/logrotate 
     Доступные версии:      3.9.1 3.12.3-r1 ~3.12.3-r2 3.13.0 {acl +cron selinux} 
     Домашняя страница:     https://github.com/logrotate/logrotate 
     Описание:              Rotates, compresses, and mails system logs 
 
Найдено 1 совпадение.

Видим что в версии CSS его нет. Установим:

emerge -av app-admin/logrotate

Настроим ротацию логов PhpMyAdmin раз в сутки и будем хранить 60 дней. По аналогии я настраиваю так же ротацию и для других веб ресурсов.

vim /etc/logrotate.d/sites
= необходимые параметры =
# Указываем в каждой строчке необходимый сайт
/var/www/pma/logs/*log
{
create 0644 nginx nginx
daily
rotate 60
missingok
notifempty
compress
sharedscripts
postrotate
test -r /run/nginx.pid && kill -USR1 `cat /run/nginx.pid`
 endscript
}

Для проверки можно запустить ротацию руками выполнив команду:

logrotate -f /etc/logrotate.conf

После выполнения команды смотрите необходимые вам лог файлы.

Настройка Cron

После установки app-admin/logrotate для работы устанавливается cronie работу которого можно проверить выполнив команду:

/etc/init.d/cronie status
= вывод команды =
 * status: started

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

Определили выполнив несколько действий. Определим что у нас установлено и отвечает за логи ротации:

eix -Ic app-admin/
= вывод команды =
[I] app-admin/apache-tools (2.4.27{tbz2}@10.08.2017): Useful Apache tools - htdigest, htpasswd, ab, htdbm
[I] app-admin/eselect (1.4.8@23.03.2017): Gentoo's multi-purpose configuration and management tool
[I] app-admin/logrotate (3.13.0{tbz2}@22.11.2017): Rotates, compresses, and mails system logs
[I] app-admin/metalog (3-r2{tbz2}@21.11.2017): A highly configurable replacement for syslogd/klogd
[I] app-admin/perl-cleaner (2.25@06.04.2017): User land tool for cleaning up old perl installs
Найдено 5 совпадение.

Выясняется что установлен app-admin/metalog. Проверим его состояние:

/etc/init.d/metalog status
= вывод команды =
 * status: stopped

Добавим его в автозагрузку и запустим:

rc-update add metalog default
/etc/init.d/metalog start

Теперь мы увидели папку /var/log/cron в которой находится файл где пишутся логи заданий cron. В моем случае файл выглядит так:

cat /var/log/cron/current
= часть вывода команды =
Nov 30 23:00:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:00:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:00:01 [run-crons] (root) CMD (/etc/cron.hourly/clocksync)
Nov 30 23:10:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:10:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:20:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:20:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:23:01 [CROND] (root) CMD (/usr/bin/nice -n19 /usr/bin/ionice -c3 /usr/sbin/cl-core --method update --schedule -p --wait-another-update off &>/dev/null)
Nov 30 23:30:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:30:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:40:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:40:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
 - Last output repeated twice -
Nov 30 23:50:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)

Лог быстро будет расти поэтому сразу сделаем ему ротацию создав необходимый файл с параметрами:

vim /etc/logrotate.d/cron
= необходимый код =
/var/log/cron/current
{
daily
rotate 60
missingok
notifempty
compress
}

Результат

Базовая настройка lemp сервера произведена без особых сложностей в системе Calculate Linux полностью совместимой с Gentoo . Основная задача настройки сводилась к тому чтобы в будущем установить облачное хранилище NextCloud на этом веб-сервере. В следующей статье NextCloud установка на Nginx будет рассказано про установку NextCloud. Расскажу как подключить бесплатный сертификат SSL. Настроим работу облачного хранилища как в локальной сети так и с интернета. Настроим дополнительные расширения которые сильно улучшают функционал облачного хранилища.