Архив метки: mysql

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

Заключение

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

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 для каждого ресурса может сильно отличатся и поэтому нет смысла описывать каждый параметр.

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

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

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

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. Настроим работу облачного хранилища как в локальной сети так и с интернета. Настроим дополнительные расширения которые сильно улучшают функционал облачного хранилища.

MariaDB работа из консоли

Основные моменты работы с базами данных MariaDB из консоли. Не всегда под рукой имеется PhpMyAdmin, который удобен в работе а произвести необходимые работы с базами необходимо. Будьте внимательность при работе в консоли!

Введение

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

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

Просмотр из консоли баз MariaDB

Подключение к серверу баз

mysql -u root -p
= вывод команды =
Enter password: указываем пароль root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 100985
Server version: 5.5.50-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Вывод списка имеющихся баз

MariaDB [(none)]> SHOW DATABASES;
= вывод команды =
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wiki_sevo44 |

+--------------------+
4 rows in set (0.01 sec)

Просмотр базы с выводом параметров

MariaDB [(none)]> SHOW CREATE DATABASE `wiki_sevo44`;
= вывод команды =
+-----------+--------------------------------------------------------------------+
| Database | Create Database |
+-----------+--------------------------------------------------------------------+
| wiki_sevo44 | CREATE DATABASE `wiki_sevo44` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)

Подключение к необходимой базе

MariаDB [(none)]> USE wiki_sevo44;
= вывод команды =
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariаDB [wiki-sevo44]>

Просмотр всех таблиц из базы

MariаDB [wiki-sevo44]> SHOW tables;
= вывод команды =
+-----------------------+
| Tables_in_wiki_sevo44 |
+-----------------------+
| l10n_cache |
| langlinks |
| log_search |
| logging |
| module_deps |
| objectcache |
| user_former_groups |
| user_groups |
| user_newtalk |
| user_properties |
| valid_tag |
| watchlist |
+-----------------------+
12 rows in set (0.00 sec)

Просмотр содержания нужной таблицы

MariаDB [wiki-sevo44]> SELECT * FROM page;
= вывод команды =
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
| page_id | page_namespace | page_title | page_restrictions | page_is_redirect | page_is_new | page_random | page_touched | page_links_updated | page_latest | page_len | page_content_model | page_lang |
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
| 1 | 0 | Заглавная_страница | | 0 | 1 | 0.6843282599 | 20170826182609 | NULL | 1 | 1035 | wikitext | NULL |
| 2 | 0 | Тестовая 3 | | 0 | 1 | 0.485584249082 | 20170830191050 | 20170830191052 | 2 | 20 | wikitext | NULL |
| 3 | 0 | Тестовая | | 0 | 1 | 0.027751067675 | 20170831130200 | 20170831130201 | 3 | 19 | wikitext | NULL |
| 4 | 0 | Тестовая 2 | | 0 | 0 | 0.213026978763 | 20170831131024 | 20170831131025 | 6 | 1120 | wikitext | NULL |
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
4 rows in set (0.00 sec)

Добавление базы в MariaDB

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

Добавление базы с параметрами

MariаDB [(none)]> CREATE DATABASE `base` CHARACTER SET utf8 COLLATE utf8_general_ci;
= вывод команды =
Query OK, 1 row affected (0.00 sec)

Удаление базы

MariaDB [(none)]> DROP DATABASE `base`;
= вывод команды =
Query OK, 0 rows affected (0.01 sec)

Просмотр пользователей с выводом их прав

MariaDB [(none)]> SELECT User,Host FROM mysql.user;
= вывод команды =
+--------+-----------+
| User   | Host      |
+--------+-----------+
| root   | localhost         |
| mysql  | localhost |
+--------+-----------+
2 rows in set (0.005 sec)

Права пользователя баз данных MariaDB

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

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

  1. Параметр bind-address=0.0.0.0 в конфигурационном файле самого сервера баз MariaDB разрешающий подключатся с любого адреса (или укажите конкретный IP) в разделе [mysqld] ;
  2. Права пользователя на возможность удаленного подключения к базе данных.

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

Менять права пользователя root не желательно, но можно создать пользователя и дать ему полные права. Держать ещё одного пользователя с полными правами не разумно, но иногда необходимо. Добавляются пользователю полные права командой:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* to 'имя пользователя'@'%';

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

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

mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.8-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE USER `sevo44`@`%` IDENTIFIED BY 'ПАРОЛЬ';
Query OK, 0 rows affected (0.008 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* to 'sevo44'@'%';
Query OK, 0 rows affected (0.017 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> exit
Bye

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

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

# Команда смены прав доступа пользователя на подключение с любого адреса (параметр %)
MariaDB [(none)]> UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='имя_пользователя';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

# Команда смены прав доступа на базы
MariaDB [(none)]> UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='имя_пользователя';
Query OK, 0 rows affected (0.03 sec)
Rows matched: 0 Changed: 0 Warnings: 0

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

# Права на доступ только с localhost
MariаDB [(none)]> CREATE USER `base_user`@localhost IDENTIFIED BY 'ПАРОЛЬ';

# Права на доступ с любого адреса (при использовании знаков в названиях код заключается в кавычки! 
MariаDB [(none)]> CREATE USER `base_user`@`%` IDENTIFIED BY 'ПАРОЛЬ';

# Права на доступ с адреса 10.10.0.2 (при использовании знаков в названиях код заключается в кавычки!
MariаDB [(none)]> CREATE USER `base_user`@`10.10.0.2` IDENTIFIED BY 'ПАРОЛЬ';

= правильный вывод команды для любой команды =
Query OK, 0 rows affected (0.10 sec)

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

# При назначении прав выставляем пользователя с нужными правами!
MariaDB [(none)]> GRANT ALL PRIVILEGES ON base.* to base_user@localhost;
= вывод команды =
Query OK, 0 rows affected (0.04 sec)

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

MariаDB [(none)]> FLUSH PRIVILEGES;
= вывод команды =
Query OK, 0 rows affected (0.02 sec)

Выход с сервера MariaDB

Выход производиться командой

MariаDB [(none)]> exit
= вывод команды =
Bye

Резервное копирование и восстановление баз MariaDB

Создадим необходимую папку для бэкапов и перейдем в неё

mkdir backup
cd backup

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

mysqldump -u base_user -p base > base-dump_10092017.sql
= вывод команды =
Enter password: вводим пароль пользователя базы и жмем Enter

Восстановление резервной копии базы

mysql -u base_user -p base < base-dump_10092017.sql
= вывод команды =
Enter password: вводим пароль пользователя базы и жмем Enter

Вывод

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

PhpMyAdmin на Nginx

Рассмотрим как установить и настроить последнюю версию PhpMyAdmin из исходных данных. Web сервер работает под управлением Nginx. Пожалуй это самый востребованный сервис для веб разработчиков.

Введение

В этой статье мы установим из исходников PhpMyAdmin работающий на веб сервере под управлением Nginx.

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

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

Перед тем как устанавливать PhpMyAdmin необходимо что бы в системе были установлены сервисы Nginx, PHP и MariaDB.

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

Исходники PhpMyAdmin

Устанавливать будем с официального сайта PhpMyAdmin, где вы всегда сможете взять последнюю версию.

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

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

Создадим необходимую структуру каталогов использую стандартное местоположение web ресурсов на системах Linux:

mkdir -p /var/www/pma.sevo44.ru/{www,log,UploadDir,SaveDir}

-p -- команда которая создат всю структуру каталогов.

Выполнив эту команду мы создали структуру каталогов:

  • pma.sevo44.ru  — общая папку для всех файлов web сервера;
  • www — папка в которой будет находится рабочие файлы;
  • log — папка куда будем писать логи;
  • UploadDir — папка куда можно ложить базы для загрузки;
  • SaveDir — папка куда можно сохранять бэкапы.

Скачивание и распаковка архива

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

yum -y install wget

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

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

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

yum install -y unzip

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

unzip /var/www/pma.sevo44.ru/phpMyAdmin-4.9.1-all-languages.zip -d /var/www/pma.sevo44.ru/

Скопируем все файлы из папки phpMyAdmin-4.9.1-all-languages в папку www:

cp -rp /var/www/pma.sevo44.ru/phpMyAdmin-4.9.1-all-languages/* /var/www/pma.sevo44.ru/www/

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

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

Все данные готовы! Дальше необходимо настроить Nginx для работы PhpMyAdmin.

Настройка Nginx для PhpMyAdmin

Конфигурационый фал Nginx показан с учетом настройки сервисов PHP и Nginx описаных на данном сайте.

Для начала нам необходимо определится с доменным именем, на котором будет работать наша система управления базами данных. В нашем случае используется домен sevo44, где по адресу pma.sevo44.ru и будет работать PhpMyAdmin.

Конфигурационный файл pma.sevo44.ru.conf, для домена третьего уровня создаем в папке /etc/nginx/conf.d/ со следующим содержанием:

vim /etc/nginx/conf.d/pma.sevo44.ru.conf
= необходимые данные для внесения =
### ssl pma.sevo44.ru
#server {
#listen 80;
#server_name pma.sevo44.ru www.pma.sevo44.ru;
#return 301 https://$server_name$request_uri; # редирект обычных запросов на https
#}

server { 
        listen 80;
	#listen 443 ssl http2; 
        server_name pma.sevo44.ru www.pma.sevo44.ru; 
 
        access_log /var/www/pma.sevo44.ru/log/pma-joomla.sevo44.ru-access_log main; 
        error_log /var/www/pma.sevo44.ru/log/pma-joomla.sevo44.ru-error_log info; 
 
        root /var/www/pma.sevo44.ru/www/; 

	index index.php; 

	### Включение сжатия 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_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/ssl/certs/dhparam.pem;
	#ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
	#ssl_prefer_server_ciphers on;
	#ssl_session_cache shared:SSL:10m;

	#location /.well-known/acme-challenge/ {
		#root /var/www/ssl/pma.sevo44.ru/;
	#} 
        
        ### Авторизация по паролю используя basic auth
        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;

        location ~ \.php$ { 
		fastcgi_pass unix:/run/php-fpm/www.sock;
		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;
    		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_param HTTPS on;
    		fastcgi_read_timeout 180;
    		fastcgi_buffer_size 128k;
    		fastcgi_buffers 4 256k;
    		fastcgi_busy_buffers_size 256k;
    		fastcgi_temp_file_write_size 256k;
           } 
}

Обращаю внимание на то что в файле закоментированы параметры которые позволяют работать PhpMyAdmby c использованием сертификата ssl. Узнать про то как можно настроить работу сайта в защищеном режиме можно из статьи SSL бесплатный для сайта Nginx.

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

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

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

Проверим на правильность настройки и перезагрузим 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

Настройка ротации логов

Все файлы правил для ротации находятся в папке /etc/logrotate.d. добавим туда необходимый нам файл с нужными параметрами:

vim /etc/logrotate.d/pma-sevo44
= необходимые данные для внесения =
/web/sites/pma.sevo44.ru/log/*.log {
 daily
 missingok
 rotate 52
 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

Без наличия этой папки с необходимыми правами для Nginx, данные не будут обрабатываться, о чем будет показывать страница с ошибкой при попытке зайти по адресу http://pma.sevo44.ru.

phpMyAdmin — Error

 Error during session start; please check your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.

session_start(): open(SESSION_FILE, O_RDWR) failed: No such file or directory (2)

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

=== Переходим в папку ===
cd /var/lib/php/

=== Проверяем наличие и если нет создаем папку ===
ls
= Вывод команды =
opcache  peclxml  session  wsdlcache
mkdir session

=== Назначаем нужны права ===
chown nginx:nginx session/

Предварительная подготовка закончена и осталось лишь настроить сам PhpMyAdmin.

Создание файла config.inc.php для PhpMyAdmin

Вариантов создать файл настроек несколько:

  • Переименовать файл config.sample.inc.php в config.inc.php и отредактировать параметры под свои нужды,
  • Средствами самого PMA войдя в панели управления под root.

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

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

Вначале разберемся с первым сообщением. Как и написано переходим в любую базу. Выберем базу mysgl в меню слева.

Жмем «Узнать причину» почему нет хранилища.

Нажимаем «Создать» и выполнятся все необходимые действия.

Теперь непосредственно создадим средствами панели управления PhpMyAdmin файл настроек config.inc.php.

Переходим по меню сверху «Настройки» и видим блок.

Нажимаем «Скрипт настройки»

Создаем сервер localhost, выбираем язык, и конец строки. Можете пройтись по остальным настройкам и указать всё на свой вкус и цвет.

Смотри результат настроек.

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

vim /var/www/pma.sevo44.ru/www/config.inc.php
= вывод команды с пояснениями =
<?php
/*
 * Generated configuration file
 * Generated by: phpMyAdmin 4.9.1 setup script
 * Date: Fri, 18 Oct 2019 16:38:52 +0000
 */

/* Servers configuration */
$i = 0;

/* Server: scs [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'scs';
$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'] = '';


/* Server: wp [2] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'wp';
$cfg['Servers'][$i]['host'] = '10.10.0.3';
$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['blowfish_secret'] = 'v,r}cXT_Wq{ucPOqIfF`?WCa?mgFgCZ_';
$cfg['DefaultLang'] = 'ru';
$cfg['ServerDefault'] = 1;
$cfg['UploadDir'] = '/var/www/pma.sevo44.ru/UploadDir/';
$cfg['SaveDir'] = '/var/www/pma.sevo44.ru/SaveDir/';
?>

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

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

Настройка закончилась и теперь при попытке повторно создать этот файл будет выскакивать сообщение:

Один PhpMyAdmin для разных серверов

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

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

/* Server: wp [2] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'wp'; - отображение в меню выбора
$cfg['Servers'][$i]['host'] = '10.10.0.3'; - ip сервера с убаленой db
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';

Для реализации этой возможности необходимо сделать еще две вещи:

  1. Добавить параметр bind-address=0.0.0.0 в конфигурационном файле самого сервера баз MariaDB разрешающий подключатся с любого адреса (или укажите конкретный IP) в разделе [mysqld] ;
  2. Сделать необходимые права для пользователя баз данных.

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

Создание базы в PhpMyAdmin

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

Создадим пользователя со своей базой данных:

  • Выбираем «Учётные записи пользователей» — «Добавить учетную запись пользователя«,
  • Создаем имя, пароль и ставим галочку «Создать базу данных с таким же именем и предоставить на неё все привилегии.» и в самом низу нажимаем «Вперёд«

База с правами создана и теперь эти данные можете предоставить по требованию для работы с ней.

Имейте ввиду что данные пользователя прописываются в файлах сайта и при смене пароля не забывайте их менять!

Удаление пользователя с его базой данных выполняется аналогичным способом.

Заключение

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

Web сервер CentOS 7

Установим и настроим web сервер на базе операционной системы CentOS 7 со связкой Nginx, MariaDB и PHP. Коротко такая связка функционала называется LEMP и дает возможность работать с сайтами использующими эти технологии.

Введение

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

Компоненты web сервера

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

  • Nginx — по сути это и есть сам веб сервер который будет обрабатывать все запросы и выдавать информацию пользователям,
  • MariaDB — база данных в которой будут хранится данные сайтов. MariaDB ответвление от популярной mysql и полностью с ней совместима,
  • PHP — язык программирования, который чаще всего применяется веб разработчиками.

Теперь обо всех этих компонентах расскажу подробно.

Дальнейшие действия производим с учетом начальной настройки сервера CetnOS 7 на Айхор Хостинге. Все действия будут правильны для других хостингов и серверов где необходимо развернуть данный функционал на операционной системе CentOS 7.

Настройка FirewallD

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

Проверим наличие firewalld:

systemctl status firewalld
= вывод команды =
Unit firewalld.service could not be found.

Если устанавливали с минимальной версии CentOS то Firewalld там не установлен.

Установим FirewallD вез вопросов командой:

yum -y install firewalld

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

systemctl enable firewalld
systemctl start firewalld

Проверим статус:

systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
 Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
 Active: active (running) since Чт 2017-04-13 20:22:40 MSK; 14s ago
 Docs: man:firewalld(1)
 Main PID: 2099 (firewalld)
 CGroup: /system.slice/firewalld.service
 └─2099 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

апр 13 20:22:39 nginx.sevo44.loc systemd[1]: Starting firewalld - dynamic firewall daemon...
апр 13 20:22:40 nginx.sevo44.loc systemd[1]: Started firewalld - dynamic firewall daemon.

Или короткой командой:

firewall-cmd --state
= вывод команды =
running

Всё хорошо. Можно приступать к настройке доступа к серверу.

Открытие портов http и https

Добавим сразу 80 и 443 порты в наш FirewallD:

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

Перезагрузим правила FirewallD:

firewall-cmd --reload
= вывод команды =
success

Проверим:

firewall-cmd --permanent --list-all
public
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: dhcpv6-client http https ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules:

Мне не нужны лишние допуски поэтому удалю dhcpv6-client командой:

firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
= вывод команды =
success

Перезагрузим и проверим:

firewall-cmd --reload
= вывод команды =
success
firewall-cmd --permanent --list-all
= вывод команды =
public
 target: default
 icmp-block-inversion: no
 interfaces: 
 sources: 
 services: http https ssh
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules:

Все прошло успешно. Теперь открыт доступ к серверу по нужным нам портам.

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

Установка

Установим самую свежую стабильную версию из репозитория NGINX для CentOS 7:

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Можно создать файл с необходимым репозиторием:

vim /etc/yum.repos.d/nginx.repo
= необходимо добавить =
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

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

yum install -y nginx

Создадим ссылку на автозагрузку:

systemctl enable nginx

Запустим сервис:

systemctl start nginx

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

Проверим работу сервиса:

netstat -tulpn | grep nginx
= вывод команды =
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1119/nginx: master

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

yum -y install net-tools

Проверим статус запущенного сервиса:

systemctl status nginx
= вывод команды =
● nginx.service - nginx - high performance web server
 Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
 Active: active (running) since Чт 2017-04-13 22:17:32 MSK; 4min 38s ago
 Docs: http://nginх.org/en/docs/
 Process: 1160 ExecStart=/usr/sbin/nginх -c /etc/nginх/nginх.conf (code=exited, status=0/SUCCESS)
 Process: 1153 ExecStartPre=/usr/sbin/nginх -t -c /etc/nginх/nginх.conf (code=exited, status=0/SUCCESS)
 Main PID: 1163 (nginх)
 CGroup: /system.slice/nginх.service
 ├─1163 nginх: master process /usr/sbin/nginх -c /etc/nginх/nginх.conf
 └─1164 nginx: worker process

апр 13 22:17:32 ih378645.vds.myihor.ru systemd[1]: Starting nginx - high performance web server...
апр 13 22:17:32 ih378645.vds.myihor.ru nginх[1153]: nginх: the configuration file /etc/nginх/nginх.conf syntax is ok
апр 13 22:17:32 ih378645.vds.myihor.ru nginх[1153]: nginх: configuration file /etc/nginх/nginх.conf test is successful
апр 13 22:17:32 ih378645.vds.myihor.ru systemd[1]: Failed to read PID from file /run/nginх.pid: Invalid argument
апр 13 22:17:32 ih378645.vds.myihor.ru systemd[1]: Started nginх - high performance web server.

Исправление ошибки Invalid argument

Видим что присутствует ошибка. При этой ошибке все работает но я решил её убрать.

Причина ошибки в том что pid указан два раза:

  • /usr/lib/systemd/system/nginx.service — строка PIDFile=/run/nginx.pid
  •  /etc/nginx/nginx.conf — строка pid /var/run/nginx.pid;

Где убрать этот параметр решать вам. Мой выбор это комментирование параметра в файле /etc/nginx/nginx.conf.

Перезагружаем сервер:

reboot

Проверяем:

systemctl status nginx
= вывод команды =
● nginx.service - nginx - high performance web server
 Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
 Active: active (running) since Чт 2017-04-13 23:33:19 MSK; 8s ago
 Docs: http://nginх.org/en/docs/
 Process: 1386 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS)
 Process: 1368 ExecReload=/bin/kill -s HUP $MAINPID (code=exited, status=0/SUCCESS)
 Process: 1390 ExecStart=/usr/sbin/nginx -c /etc/nginх/nginх.conf (code=exited, status=0/SUCCESS)
 Process: 1389 ExecStartPre=/usr/sbin/nginх -t -c /etc/nginх/nginх.conf (code=exited, status=0/SUCCESS)
 Main PID: 1394 (nginx)
 CGroup: /system.slice/nginх.service
 ├─1394 nginх: master process /usr/sbin/nginх -c /etc/nginх/nginх.conf
 └─1395 nginх: worker process

апр 13 23:33:19 ih378645.vds.myihor.ru systemd[1]: Starting nginх - high performance web server...
апр 13 23:33:19 ih378645.vds.myihor.ru nginх[1389]: nginх: the configuration file /etc/nginх/nginх.conf syntax is ok
апр 13 23:33:19 ih378645.vds.myihor.ru nginx[1389]: nginx: configuration file /etc/nginх/nginх.conf test is successful
апр 13 23:33:19 ih378645.vds.myihor.ru systemd[1]: Started nginх - high performance web server.

Видим что всё у нас хорошо. Сервис работает и стартует при перезагрузке.

Для окончательной проверки мы можем набрать в браузере http://ip сервера и увидеть приветственное сообщение.

Файлы для настройки

Все необходимые нам файлы для настройки находятся в папке /etc/nginx. По умолчанию корневая папка находится по пути usr/share/nginx/html и именно оттуда берется приветственное сообщение.

Работать мы будем с виртуальными сайтами и тут есть два варианта работы:

  • Все правила для сайтов писать в конфигурационном файле /etc/nginx/nginx.conf,
  • Создать для каждого виртуального сайта свой файл в /etc/nginx/conf.d с названием имя сайта.conf.

Мне удобней работать с файлами настроек для каждого сайта. Чтобы такая возможность была необходимо в главном файле присутствие строки include /etc/nginx/conf.d/*.conf.

Настройка nginx.conf

Сделаем резервную копию оригинала файла главных настроек Nginx:

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig

Основное и главное отличие в работе по сравнению с Apach, это то что Nginx не работает с файлами .htaccess.

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

cat /etc/nginx/nginx.conf 
= вывод команды с пояснениями = 
# nginx version:1.14.0
# Пользователь и группа, от имени которых будет запущен процесс
user  nginx nginx;

# Число воркеров в новых версиях рекомендовано устанавливать параметр auto
worker_processes  auto;

# Уровни лога debug, info, notice, warn, error, crit, alert или emerg
# перечислены в порядке возрастания важности. При установке определённого уровня
# в лог попадают все сообщения указанного уровня и уровней большей важности. 
# Например, при стандартном уровне error в лог попадают сообщения уровней error, crit, alert и emerg. 
# Если параметр не задан, используется error. 
error_log  /var/log/nginx/error.log warn;

# Файл в котором будет храниться идентификатор основного процесса
# указывать если нет параметра в сервисе!
#pid        /var/run/nginx.pid;

events {
    # Максимальное количество соединений одного воркера
    worker_connections  1024;
    # Метод выбора соединений (для FreeBSD будет kqueue)
    use                epoll;
    # Принимать максимально возможное количество соединений
    multi_accept          on;
}

http {
    # Отключить вывод версии nginx в ответе
    server_tokens        off;

    # Указываем файл с mime-типами и указываем тип данных по-умолчанию
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # Формат для лога доступа и путь к файлу
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;

    # Метод отправки данных sendfile эффективнее чем read+write
    sendfile              on;

    # Ограничивает объём данных, который может передан за один вызов sendfile(). 
    # Нужно для исключения ситуации когда одно соединение может целиком захватить воркер
    sendfile_max_chunk  128k;

    # Отправлять заголовки и начало файла в одном пакете
    tcp_nopush           on;
    tcp_nodelay          on;

    # Параметр задаёт таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера
    keepalive_timeout  65;

    # Сбрасывать соединение если клиент перестал читать ответ
    reset_timedout_connection       on;
   
    # Разрывать соединение по истечению таймаута при получении заголовка и тела запроса
    client_header_timeout           3;
    client_body_timeout             5;
    
    # Разрывать соединение, если клиент не отвечает в течение 3 секунд
    send_timeout                    3;

    # Задание буфера для заголовка и тела запроса
    client_header_buffer_size       2k;
    client_body_buffer_size         256k;

    # Ограничение на размер тела запроса
    client_max_body_size            12m;
  
    # Включение сжатия 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 9;
    #gzip_proxied any;
    #gzip_min_length 1000;
    #gzip_disable "msie6";
    #gzip_vary on;

    # Подключение дополнительных конфигов
    include /etc/nginx/conf.d/*.conf;
}

Настройка default.conf

В папке conf.d находится файл default.conf в настройках которого и указаны параметры приветственной странницы, что нам показал запрос на ip адрес сервера. В случае неправильно указанного адреса будет показано именно это приветствие. Вы можете подправить файлы, пути до которых указанны в нём, по своему желанию.

Сделаем резервную копию оригинала файла default.conf:

cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.orig

Посмотрим как выглядит файл default.conf:

cat /etc/nginx/conf.d/default.conf
= вывод команды с необходимыми изменениями =
server {
listen 80;
server_name localhost;

#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;

location / {
# Путь до файлов
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# Разрешим использование php 
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /usr/share/nginx/html/;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /usr/share/nginx/html$fastcgi_script_name;
include fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with one

#location ~ /\.ht {
# deny all;
#}
}

Мы добавили index.php и отредактировали секцию  location ~ \.php$ отвечающую за обработку файлов php.

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

Проверка и команды сервиса

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

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

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

Видим что все хорошо.

Перезагрузим сервис:

systemctl reload nginx
или
nginx -s reload

Варианты команд при работе с сервисом.

systemctl [start-stop-restart-reload-status] nginx

Для перезагрузки лучше использовать «reload» так как перезагрузка произойдет не прерывая работу сервиса.

В случае если что то пошло не так, вы всегда можете посмотреть логи находящиеся в папке /var/log/nginx.

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

Установка

Для установки MariaDB без вопросов выполним команду со следующими параметрами:

yum install -y mariadb mariadb-server

Создадим ссылки на автозагрузку:

systemctl enable mariadb.service
= вывод команды =
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

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

systemctl start mariadb.service

Начальная настройка

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

mysql_secure_installation

Сразу при старте попросит указать пароль! Так как его просто нет нажимаем Enter. На все вопросы обычно отвечаю Y.

Проверка и команды сервиса

Проверим сервис MariaDB:

netstat -tap | grep mysql
= вывод команды =
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 769/mysqld

Проверим статус:

systemctl status mariadb.service
= вывод команды =
● mariadb.service - MariaDB database server
 Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
 Active: active (running) since Чт 2017-03-23 04:59:53 MSK; 1 day 16h ago
- часть вывода не указана -

Видим что всё хорошо и служба стартует при перезагрузке сервера.

Варианты команд при работе с MariaDB

systemctl [start-stop-restart-status] mariadb.service

В случае если что то пошло не так, вы всегда можете ознакомится посмотрев логи в папке /var/log/mariadb.

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

Выбор версии PHP

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

Nginx не содержит PHP, необходимо установить php-fpm (менеджер процессов FastCGI). Nginx будет передавать PHP-запросы на обработку данному программному обеспечению. Обязательно необходим еще пакет php-mysql, позволяющий PHP взаимодействовать с бэкэндом базы данных.

По умолчанию в CentOS ставится версия PHP 5.4. Не понимаю почему до сих пор не обновили до версии 5.6 хотя во многих дистрибутивах она уже идёт по умолчанию.

Узнать актуальную версию вы всегда сможете перейдя по ссылке, которая тут указана. Версия 5.6 будет актуальная до 31 декабря 2018 года.

Установка PHP 5.6

После переезда на нового провайдера обнаружил что ресурс webtatic.com не доступен. После небольшого футбола с провайдерами получил ответ: «104.24.6.38  заблокирован Роскомнадзором, тут уже ничего не поделать». На слово верить я уже давно перестал. Задал вопрос Роскомнадзору. Жду ответ. Ну а пока жду ответа добавил как установить PHP 5.6 из репозитория Remi.
16.04.2017 года ресурс Webtatic.com переехал на новый IP адрес и снова доступен для России. Более подробно можете прочитать в статье WebtaticEL или блокировка в России.

Для репозитория WebtaticEL по ссылке вы можете ознакомиться с инструкцией по установке для операционной системы CentOS 7.

Для начала проверим чтобы в системе не присутствовал php:

php -v
-bash: php: command not found

Отлично php нет в системе.

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

Добавим необходимые репозиторий WebtaticEL:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

Для репозитория Remi:

wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7*.rpm

В дистрибутив PHP теперь входит opcode который называется ZendOPcache. Данное расширение сохраняет компилированный байт код скрипта и повышает производительность скриптов. Это дополнение необязательно, вы можете выбрать любое другое, но поскольку данное дополнение входит в состав исходного дистрибутива PHP, и оно поддерживается разработчиком, именно его мы и будем использовать. Скорость еще никому не вредила.

Установим необходимый нам вариант php вместе с opcache и всем необходимым для WebtaticEL:

yum install php56w-fpm php56w-opcache php56w-mysql php56w-cli php56w-gd php56w-ldap php56w-odbc php56w-pdo php56w-pecl-memcache php56w-pear php56w-xml php56w-xmlrpc php56w-mbstring php56w-snmp php56w-soap php56w-imap

Установим необходимый нам вариант php вместе с opcache и всем необходимым для Remi:

yum --enablerepo=remi,remi-php56 install php-fpm php-opcache php-mysql php-cli php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-imap

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

php -v
= вывод команды =
PHP 5.6.30 (cli) (built: Jan 26 2017 00:22:46) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

Вся настройка осуществляется редактированием 3 файлов а именно:

  • /etc/php.ini — главный конфигурационный файл php,
  • /etc/php-fpm.conf — главный файл настройки php-fpm,
  • /etc/php-fpm.d/www.conf — наш файл настройки php-fpm.

Настройка файла php.ini

Настроим главный конфигурационный файл php:

mcedit /etc/php.ini
= необходимые изменения =
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Избежим ошибок часового пояса в файле /var/log/php-fpm/www-error.log
date.timezone = "Europe/Moscow"

Остальные параметры можно не трогать, так как их настройка будет осуществлена средствами настройки Nginx.

Настройка файла /etc/php-fpm.conf

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

Откроем файл:

cat /etc/php-fpm.conf
= вывод команды и проверка необходимых параметров =
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Разрешаем подгружать необходимые нам файлы настроек
include=/etc/php-fpm.d/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Default Value: none
pid = /var/run/php-fpm/php-fpm.pid

; Error log file
; Default Value: /var/log/php-fpm.log
; Путь куда пишутся логи ошибок
error_log = /var/log/php-fpm/error.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when 
; a graceful restart will be initiated. This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
daemonize = yes

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;

; See /etc/php-fpm.d/*.conf

Все остальные параметры мы будем делать в файле /etc/php-fpm.d/www.conf

Настройка файла /etc/php-fpm.d/www.conf

В этом файле мы и укажем все параметры необходимые нам для работы php-fpm.

Посмотрим файл:

cat /etc/php-fpm.d/www.conf
= вывод команды с пояснениями =
[www]
# Используем порт 9000 по адресу 127.0.0.1
listen = 127.0.0.1:9000;
listen.allowed_clients = 127.0.0.1
# Пользователь и группа от которой работает php
user = nginx
group = nginx
# Как будут создаваться новые рабочие процессы
pm = dynamic
# Максимальное количество рабочих процессов
pm.max_children = 20
# Число запущенных процессов при старте сервера
pm.start_servers = 6
# Минимальное и максимальное количество процессов в простое
pm.min_spare_servers = 4
pm.max_spare_servers = 8
# Логи работы
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
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
pm.status_path = /status

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

Можно использование Unix сокет в PHP-FPM, но какие он дает преимущества я так и не понял. Для применения необходимо в файле /etc/php-fpm.d/www.conf вместо строчки listen = 127.0.0.1:9000 прописать строку listen = /var/run/php-fpm/php5-fpm.sock и не забыть применить этот параметр в файлах настройки виртуальных сайтов.

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

cd /var/lib/php/
mkdir session
chown nginx:nginx session/

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

Запуск, проверка, команды работы с PHP-FPM

Создадим ссылки на автозагрузку для php-fpm:

systemctl enable php-fpm.service

Запустим командой:

systemctl start php-fpm.service

Проверим работу сервиса:

netstat -tulpn | grep php-fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 443/php-fpm: master

Если вы используйте сокет то вывод проверки будет пустой и необходимо проверить работу выводом статуса 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 Чт 2017-03-23 04:59:50 MSK; 2 days ago
- часть вывода не указана -

Видим что сервис запущен и стартует при перезагрузки сервера.

Варианты команд при работе с Php-fpm

systemctl [start-stop-restart-status] php-fpm.service

Если пошло что то не так, всегда можно посмотреть логи находящиеся по адресу /var/log/php-fpm.

Вывод информации о версии PHP

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

Создадим файл info.php указав в нем необходимый код:

mcedit /usr/share/nginx/html/info.php
= необходимый код =
<?php phpinfo(); ?>

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

chown -R nginx:nginx /usr/share/nginx/html

 

Откроем в браузере наш файл указав http://ip адрес сервера/info.php

Результат

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