Архив рубрики: Системы

Работа с LXC контейнерами

Расскажу про базовую настройку контейнера и о том как осуществляется работа с LXC контейнерами версии 3.0. Работа с LXC контейнером имеет некоторые нюансы, но в основном проблем с настройкой и обслуживанием нет.

Введение

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

Базовая настройка контейнера LXC

Ранее я рассказывал как производится Создание и настройка LXC контейнера. Работа с LXC начинается с того что необходимо произвести базовую настройку контейнера. В контейнере находится система CentOS 7 и работать с ней надо как с обычной системой, но с небольшими нюансами. Более подробно о настройке системы можно почитать в статье CentOS 7 установка и настройка.

Обновим систему:

yum update

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

yum install yum-cron

Действия на хосте LXC

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

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

firewall-cmd --permanent --zone=external --add-forward-port=port=25552:proto=tcp:toport=22:toaddr=10.10.0.2
= вывод команды =
success

Сохраним изменения:

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

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

firewall-cmd --list-all --zone=external
= вывод команды =
external (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources:
services: http https
ports: 25555/tcp 10050/tcp
protocols:
masquerade: yes
forward-ports: port=25552:proto=tcp:toport=22:toaddr=10.10.0.2
source-ports:
icmp-blocks:
rich rules:

В результате при запросе порта 25552 на хосте он будет проброшен на 22 порт в контейнер с ip адресом 10.10.0.2.

Установка программ

Установим популярный репозиторий Epel:

yum -y install epel-release

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

yum -y install vim mc net-tools bind-utils htop atop iftop lsof wget bzip2 traceroute gdisk yum-utils

Настройка SSH и консоли

Установим, запустим и добавим в автозагрузку ssh сервер:

yum install openssh-server
systemctl start sshd
systemctl enable sshd

Создадим пароль пользователя root в контейнере:

passwd

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

vim /root/.bashrc
= добавляем внизу =
# Вид приветствия bash
PS1='\[\033[01;31m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] '
# Настройка истории bash
export HISTSIZE=10000
export HISTTIMEFORMAT="%h %d %H:%M:%S "
PROMPT_COMMAND='history -a'
export HISTIGNORE="ls:ll:history:w"

Применим изменения без перезагрузки:

source ~/.bashrc

Время в контейнере

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

Посмотрим текущую временную зону:

date
= вывод команды =
Пт окт 12 23:58:14 UTC 2018

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

mv /etc/localtime /etc/localtime.bak

в папке /usr/share/zoneinfo/ находим необходимую временную зону и делаем ссылку

ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

В результате увидим следующее:

date
= вывод команды =
Сб окт 13 02:59:46 MSK 2018

Смена имени контейнера

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

hostnamectl старое НОВОЕ

Не забываем сменить в файле конфигурации контейнера lxc.

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

Настройка почты

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

yum install mailx

Установим, запустим и добавим в автозагрузку сервис для работы с почтой Рostfix:

yum install postfix
systemctl start postfix
systemctl enable postfix

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

Управления контейнером LXC

Для вывода справки к командам добавляется параметр -h. Например, # lxc-destroy -h

Запуск контейнера:

lxc-start php7-lxc

Запуск можно произвести с выводом информации о процессе загрузки указав необходимый параметр -F.

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

lxc-start php7-lxc -F

Остановка контейнера:

lxc-stop php7-lxc

Заморозить/разморозить контейнер можно командами:

lxc-freeze php7-lxc
lxc-unfreeze php7-lxc

Подключение к терминалу контейнера:

lxc-attach php7-lxc

Информация о контейнерах LXC

Вывод информации о всех контейнерах:

lxc-ls -f
= вывод команды =
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED 
elk-lxc RUNNING 1 - 10.10.0.2 - false 
glpi-lxc RUNNING 1 - 10.10.0.3 - false 
php5-lxc RUNNING 1 - 10.10.0.4 - false 
php7-lxc RUNNING 1 - 10.10.0.5 - false

Подробный вывод информации о контейнере php7-lxc:

lxc-info php7-lxc
= вывод команды =
Name: php7-lxc
State: RUNNING
PID: 3917
IP: 10.10.0.5
CPU use: 3353.19 seconds
BlkIO use: 5.50 GiB
Memory use: 11.39 MiB
KMem use: 0 bytes
Link: php7-lxc
TX bytes: 5.49 MiB
RX bytes: 310.08 MiB
Total bytes: 315.57 MiB

Резервное копирование контейнеров LXC

LXC-контейнеры совместимы с файловыми системами ZFS, Btrfs и томами LVM. При размещении контейнеров на хранилищах такого типа, будут использоваться их встроенные средства для создания моментальных снимков.

Перед созданием снимка (snapshot) контейнера его необходимо остановить!

Создать снимок:

lxc-snapshot php7-lxc

=== Для создания снимка с комментарием ===
= создаем файл с комментарием =
echo "base setup sevo44" > snap-comment
= создаем снимок с комментарием =
lxc-snapshot php7-lxc -c snap-comment

Посмотреть имеющиеся снимки с выводом комментариев если они есть:

lxc-snapshot php7-lxc -L -С
= вывод команды =
snap0 (/var/sevo44/lxcsnaps/php7-lxc) 2019:02:26 20:52:17
snap1 (/var/sevo44/lxcsnaps/php7-lxc) 2019:02:26 21:02:44
base setup sevo44

Откатится к снимку snap0 контейнера php7-lxc можно выполнив команду:

lxc-snapshot php7-lxc -r snap0

Удалить снимок:

lxc-snapshot php7-lxc -d snap0

Создать новый контейнер из снимка:

lxc-snapshot php7-lxc -r snap0 php7-2-lxc

Клонирование контейнеров LXC

Перед клонированием контейнера его необходимо остановить!

Клонирование контейнера:

lxc-copy php7-lxc -N php7-2-lxc

Перенос контейнера LXC на другой сервер

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

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

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

Перед переносом контейнера его необходимо остановить!

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

cd
tar --numeric-owner -czvf php7-lxc.tar.gz /var/sevo44/lxc/php7-lxc

Где параметры tar означают:

  • c — создание архива tar,
  • z — сжать архив, используя алгоритм gzip,
  • v — выводить подробную информацию процесса,
  • f — указывает имя файла архива,
  • —numeric-owner — какие изначально при архивации ID были, такими они и будет после распаковки.

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

tar -xzvf php7-lxc.tar.gz -C /var/sevo44/

Где параметры tar означают:

  • x — создание архива tar,
  • -C — указывает место для распаковки архива.

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

Bash скрипт для переноса контейнера LXC

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

  • Останавливать переносимый контейнер,
  • Создавать архив контейнера,
  • Запускать контейнер после архивирования,
  • Передавать архив контейнера на удаленный сервер,
  • Удалять архив контейнера после передачи на удаленный сервер,
  • Распаковывать архив на удаленном сервере,
  • Удалять архив контейнера на удаленном сервере после распаковки.

Для подключение к удаленному серверу без ввода пароля пользователя необходимо произвести соответствующую настройку о которой рассказано в статье RSA или авторизация SSH по ключу.

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

mkdir /root/bin
vim /root/bin/tar-lxc_php7-lxc.sh
= необходимый код с пояснениями =
#!/bin/bash

# Переносимый контейнер
container_name="php7-lxc"
# Параметры подключения к удаленому серверу
connect_string="root@192.168.0.101"

# Остановка контейнера перед архивацией
lxc_status=$(lxc-info $container_name|grep "STOPPED")
if [ -z "$lxc_status" ];
then
 lxc-stop "$container_name"
 run_again="yes"
fi

# Создание архива контейнера
tar --numeric-owner -czvf /tmp/$container_name.tar.gz /var/sevo44/lxc/$container_name

# Запуск контейнера после архивирования
if [ -n "$run_again" ];
then
 lxc-start "$container_name"
fi

# Копирование архива контейнера на удаленный сервер
scp /tmp/$container_name.tar.gz $connect_string:/tmp/

# Удаление архива после отправки на удаленный сервер
rm -f /tmp/$container_name.tar.gz

# Создадим необходимую папку если она отсутствует
ssh $connect_string mkdir -p /var/sevo44/tmp

# Распаковка архива на удаленном сервере !!! ВНИМАНИЕ !!! указываем полное имя архива
ssh $connect_string tar -xvf /tmp/php7-lxc.tar.gz -C /var/sevo44/tmp/

# Удаление архива после распаковки на удаленном сервере !!! ВНИМАНИЕ !!! указывается полное имя архива
ssh $connect_string rm -f /tmp/php7-lxc.tar.gz

Делаем скрипт исполнительным для владельца файла:

chmod u+x /root/bin/tar-lxc_php7-lxc.sh

Запускаем скрипт с параметром отправки информации о завершении переноса контейнера:

/root/bin/tar-lxc.sh | mailx -s 'Контейнер php7-lxc перенесён!' info@sevo44.ru

В результате на почту придет сообщение с темой «Контейнер php7-lxc перенесён!» а в теле письма вы увидите перечень всех файлов что были архивированы.

Удаление контейнера LXC

lxc-destroy php7-lxc

Вывод

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

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

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

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

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

LXC установка на CentOS 7

Использование системы LXC даёт возможность на одном сервере запускать разные изолирование операционные системы. Успешно использую эту технологию для разворачивания на одном VDS сервере LEMP конфигураций с разными версиями программ PHP и MariaDB.

Введение

Работая с серверами VDS для меня прежде всего важна стабильность и удобство их обслуживания.

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

  • Резервное копирование. Для спокойного обслуживания систем всегда необходимо создавать их резервные копии, но к сожалению большинство компаний предоставляющих услуги не предоставляют таких возможностей по умолчанию. Можно делать резервирование разными способами, но это не всегда удобно и требует хороших знаний для быстрого восстановления работоспособности системы из бэкапа;
  • Использование сервера для конкретной задачи или ресурса. Ни секрет что чем меньше всего установлено на сервере тем проще его обслуживать;
  • Разные версии программного обеспечения на одном сервере. Бывает так что на одном сервере необходимо использовать PHP 7 и PHP 5. Простыми способами одновременно заставить сервер работать с двумя версиями сложно.

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

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

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

Существует версия LXD которая может использовать в контейнере своё ядно, но это уже отдельный разговор тем более для запуска на системе CentOS. Знаю точно что разработчики систем LXC и LXD спонсирует компания занимающаяся разработкой дистрибутива Ubuntu и поэтому все свои технологии и новшества они внедряют в первую очередь на Ubuntu.

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

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

Настройка сети для LXC контейнеров

Контейнеры будут находиться внутри своей виртуальной сети — 10.10.0.0/24. Для настройки маршрутизации будем использовать FirewallD.

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

yum -y install bridge-utils

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

Отключение NetworkManager, удаление из автозагрузки и перезагрузка сетевых настроек выполняется следующими командами:

systemctl stop NetworkManager
systemctl disable NetworkManager 
systemctl restart network

После отключения можете настраивать всё руками изминяя файлы настройки сети в папке /etc/sysconfig/network-scripts.

Создание виртуального бриджа через Nmtui

Заходим в графический интерфейс для настройки сетевых параметров в CentOS 7:

nmtui

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

  1. Добавить — Мост,
  2. Переименовать Имя профиля и Устройство в virbr0,
  3. КОНФИГУРАЦИЯ IPv4 <Вручную> добавляем адрес 10.10.0.1/24,
  4. КОНФИГУРАЦИЯ IPv46 <игнорировать>.

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

ip addr
= вывод команды =
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 72:d7:b9:2f:78:89 brd ff:ff:ff:ff:ff:ff
inet 165.21.152.551/24 brd 85.22.952.5 scope global noprefixroute ens18
valid_lft forever preferred_lft forever
inet6 fe80::70d7:b9ff:fe2f:7889/64 scope link 
valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 8a:f6:04:5e:97:4f brd ff:ff:ff:ff:ff:ff
inet 10.10.0.1/24 brd 10.255.255.255 scope global noprefixroute virbr0
valid_lft forever preferred_lft forever

Настройка FirewallD для LXC

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

Выведем информацию об активных зонах:

firewall-cmd --get-active-zones
= вывод информации =
public
interfaces: eth0 virbr0

Оба сетевых интерфейса находятся в зоне public

Нам необходимо перенести интерфейс eth0 во внешнюю сеть в зону external а virbr0 во внутреннюю в зону internal.

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

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

firewall-cmd --permanent --zone=external --add-port=25555/tcp
firewall-cmd --reload

Выполним перенос интерфейсов в нужные зоны:

= внешняя сеть =
firewall-cmd --permanent --zone=public --remove-interface=eth0
firewall-cmd --permanent --zone=external --add-interface=eth0
= внутренняя сеть =
firewall-cmd --permanent --zone=public --remove-interface=virbr0
firewall-cmd --permanent --zone=internal --add-interface=virbr0

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

= внешняя сеть =
firewall-cmd --permanent --zone=external --change-interface=eth0
= внутренняя сеть =
firewall-cmd --permanent --zone=internal --change-interface=virbr0

Посмотрим результат:

firewall-cmd --get-active-zones
internal
interfaces: virbr0
external
interfaces: eth0

Интерфейсы попали в нужные зоны.

Для того чтобы внутренняя сеть имела доступ в интернет нам необходимо на зоне работающей во внешней сети настроить маскарад (masquerade).

Проверим состояние masquerade на внешнем интерфейсе:

firewall-cmd --zone=external --query-masquerade
= вывод команды =
yes

Маскарад присутствует и нам не надо его добавлять.

Выведем информацию о параметрах внешней зоны:

firewall-cmd --list-all --zone=external
= вывод команды =
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: ssh
  ports: 25000/tcp
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Доступ по ssh нам не требуется и мы его удалим.

firewall-cmd --permanent --zone=external --remove-service=ssh

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

firewall-cmd --permanent --zone=external --add-port=10050/tcp

Так как в последствии сервер будет работать выполняя функции LEMP сервера добавим необходимые сервисы:

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

Забегая вперед пробросим еще порт для доступа к контейнеру по ssh:

firewall-cmd --permanent --zone=external --add-forward-port=port=25552:proto=tcp:toport=22:toaddr=10.10.0.2

Подключатся к контейнеру по ssh надо будет на 25552 порту а хост перебросит в нужный контейнер на стандартный порт.

Выведем информацию о параметрах внутренней зоны:

firewall-cmd --list-all --zone=internal
= вывод команды =
internal (active)
target: default
icmp-block-inversion: no
interfaces: virbr0
sources: 
services: ssh mdns samba-client dhcpv6-client
ports: 
protocols: 
masquerade: no
forward-ports: 
source-ports: 
icmp-blocks: 
rich rules:

Удалим ненужные сервисы:

firewall-cmd --permanent --zone=internal --remove-service=mdns
firewall-cmd --permanent --zone=internal --remove-service=samba-client
firewall-cmd --permanent --zone=internal --remove-service=dhcpv6-client

Применим все сделанные изменения:

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

Главная задача выполнена и контейнеры получат доступ в интернет.

Если хотите использовать для маршрутизации iptables вы можете посмотреть статью и найти там интерферирующие настройки.

Установка LXC 3.0 на CentOS 7

В базовой версии присутствует старая версия 1.0. Можно использовать и её, но уж больно много удобств внесли разработчики в новые версии. Если бы изменения касались только команд управления и не затрагивали конфигурационных настроек файлов я подумал бы еще о том чтобы дождаться новой версии в базовой версии CentOS 7.

Устанавливать свежую версию будем с ресурса Fedora CORP. Вся интерферирующая нас информация находится тут.

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

vim /etc/yum.repos.d/lxc3.0.repo
=добавим необходимый код =
[thm-lxc3.0]
name=Copr repo for lxc3.0 owned by thm
baseurl=https://copr-be.cloud.fedoraproject.org/results/thm/lxc3.0/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/thm/lxc3.0/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1

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

yum install epel-release

Установим свежую версию 3.0 со всеми необходимыми пакетами:

yum install debootstrap lxc lxc-templates lxc-extra libcap-devel libcgroup

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

lxc-checkconfig
= вывод команды =
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-957.1.3.el7.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
newuidmap is not installed
newgidmap is not installed
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroups: enabled

Cgroup v1 mount points: 
/sys/fs/cgroup/systemd
/sys/fs/cgroup/freezer
/sys/fs/cgroup/pids
/sys/fs/cgroup/perf_event
/sys/fs/cgroup/hugetlb
/sys/fs/cgroup/cpu,cpuacct
/sys/fs/cgroup/net_cls,net_prio
/sys/fs/cgroup/devices
/sys/fs/cgroup/cpuset
/sys/fs/cgroup/blkio
/sys/fs/cgroup/memory

Cgroup v2 mount points:
Cgroup v1 clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled, not loaded
Macvlan: enabled, not loaded
Vlan: enabled, not loaded
Bridges: enabled, loaded
Advanced netfilter: enabled, not loaded
CONFIG_NF_NAT_IPV4: enabled, loaded
CONFIG_NF_NAT_IPV6: enabled, loaded
CONFIG_IP_NF_TARGET_MASQUERADE: enabled, loaded
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled, loaded
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled, not loaded
CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled, not loaded
FUSE (for use with lxcfs): enabled, not loaded

--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities:

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Кроме двух строк (отмечены в выводе оранжевым) параметр у строк должен быть enabled.

LXC обычно использует следующие пути:

  • /var/lib/lxc/ — дефолтное место для контейнеров,
  • /var/lib/lxcsnap/ — дефолтное место снимков,
  • /var/cache/lxc/ — дефолтное место для кэша шаблонов,
  • $HOME/.local/share/lxc/ — дефолтное место для непривилегированных контейнеров,
  • $HOME/.local/share/lxcsnap/ — дефолтное место для непривилегированных снимков,
  • $HOME/.cache/lxc/ — дефолтное место для непривилегированного кэша шаблонов.

Шаблоны операционных систем хранятся в /usr/share/lxc/templates/.

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

mkdir -p /var/sevo44/lxc

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

vim /etc/lxc/lxc.conf
= необходимый код =
lxc.lxcpath = /var/sevo44/lxc

Если вы переопределяете место для контейнеров, то каталог снимков snap будет находится в вашей новой папке.

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

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

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

systemctl status lxc
 lxc.service - LXC Container Initialization and Autoboot Code
Loaded: loaded (/usr/lib/systemd/system/lxc.service; enabled; vendor preset: disabled)
Active: active (exited) since Вт 2019-01-29 15:48:00 MSK; 25s ago
Docs: man:lxc-autostart
man:lxc
Main PID: 14338 (code=exited, status=0/SUCCESS)

янв 29 15:48:00 vds-micro2.sevo44.ru systemd[1]: Starting LXC Container Initialization and Autoboot Code...
янв 29 15:48:00 vds-micro2.sevo44.ru systemd[1]: Started LXC Container Initialization and Autoboot Code.

Служба работает. Переходим к настройке контейнеров.

Создание и настройка LXC контейнера

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

При создании контейнера можно использовать необходимые нам параметры. Дефолтная конфигурация контейнера при установке находится в /etc/lxc/default.conf.

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

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

mkdir -p /var/sevo44/backup

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

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

vim /etc/lxc/default.conf
= необходимые параметры =
# sevo44 меняем значение 111 на необходимые
# lxc.uts.name = название контейнера.lemp.sevo44.loc
lxc.autodev = 1
lxc.net.0.type = veth
lxc.net.0.link = virbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
lxc.net.0.veth.pair = 111-lxc
lxc.net.0.name = eth0
lxc.net.0.ipv4.address = 10.10.0.111/24
lxc.net.0.ipv4.gateway = 10.10.0.1
lxc.start.auto = 1
#lxc.start.delay = 5
lxc.mount.entry = /var/sevo44/backup/111 mnt none rw,bind 0.0

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

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

Один раз настроив этот файл нам не надо будет каждый раз глобально редактировать файл настройки контейнера.

Создание контейнера LXC

Создавать будем контейнер с именем php7-lxc в котором развернем работу LEMP сервера с неоходимой версией php.

Создадим сразу папку для бэкапов:

mkdir /var/sevo44/backup/php7

Устанавливать будем скачивая необходимую версию дистрибутива.

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

lxc-create php7-lxc -t download
= вывод команды с пояснениями =
Setting up the GPG keyring
Downloading the image index
---
DIST	RELEASE	ARCH	VARIANT	BUILD
---
= в выводе скрыты все остальные варианты операционных систем =
centos	7	amd64	default	20190129_07:09
centos	7	arm64	default	20190129_07:10
centos	7	armhf	default	20190129_07:11
centos	7	i386	default	20190129_07:09
centos	7	ppc64el	default	20190129_07:10
---
Distribution: 
centos
Release: 
7
Architecture: 
amd64

Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs
---
You just created a Centos 7 x86_64 (20190129_07:09) container.

Настройка контейнера LXC перед первым запуском

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

vim /var/sevo44/lxc/php7-lxc/config
= вывод команды с необходимыми правками =
# Template sed to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)

# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)

# sevo44 меняем значение 111 на необходимые
# lxc.uts.name = название контейнера.lemp.sevo44.loc

# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = x86_64

# Container specific configuration
lxc.autodev = 1
lxc.start.auto = 1
#lxc.start.delay = 5
lxc.mount.entry = /var/sevo44/backup/php7 mnt none rw,bind 0.0
lxc.rootfs.path = dir:/var/sevo44/lxc/php7-lxc/rootfs
lxc.uts.name = php7-lxc.lemp.sevo44.loc

# Network configuration
lxc.net.0.type = veth
lxc.net.0.link = virbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:3b:18:15
lxc.net.0.veth.pair = php7-lxc
lxc.net.0.name = eth0
lxc.net.0.ipv4.address = 10.10.0.2/24
lxc.net.0.ipv4.gateway = 10.10.0.1

Значение строк на которые стоит обратить внимание:

  • lxc.net.0.ipv4.address = 10.10.0.2/24 — ip который будет присвоен контейнеру,
  • lxc.start.auto = 1 — автозагрузка контейнера при перезагрузке системы,
  • lxc.mount.entry = /var/sevo44/backup/php7 mnt none rw,bind 0.0 — говорит о том что папка /var/sevo44/backup/php7 будет примантированна в папку контейнера mnt,
  • lxc.uts.name = php7-lxc.lemp.sevo44.loc — название контейнера.

Для доступа в интернет в контейнере необходимо добавить dns серверы в /etc/resolv.conf. Добавим dns от Yandex и Google:

vim /var/sevo44/lxc/php7-lxc/rootfs/etc/resolv.conf
= необходимый код =
nameserver 77.88.8.8
nameserver 8.8.4.4

Конфигурацию сетевого интерфейса в контейнере приводим к следующему виду:

vim /var/sevo44/lxc/php7-lxc/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
= необходимые параметры =
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HOSTNAME=php7-lxc.lemp.sevo44.loc
NM_CONTROLLED=no
TYPE=Ethernet

Управление контейнером LXC

Запуск контейнера php7-lxc осуществляется командой:

# lxc-start php7-lxc

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

# lxc-info php7-lxc
= вывод команды =
Name: php7-lxc
State: RUNNING
PID: 14861
IP: 10.10.0.2
CPU use: 0.70 seconds
BlkIO use: 0 bytes
Memory use: 19.19 MiB
KMem use: 0 bytes
Link: php7-lxc
TX bytes: 656 bytes
RX bytes: 2.35 KiB
Total bytes: 2.99 KiB

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

lxc-ls -f
= вывод команды =NAME     STATE   AUTOSTART GROUPS IPV4      IPV6 UNPRIVILEGED 
php7-lxс RUNNING 1         -      10.10.0.2 -    false

Подключимся к консоли контейнера.

= Так выглядит моя строка приветствия с необходимой командой =
root@vds-micro2.sevo44.ru ~ # lxc-attach php7-lxc
= Так выглядит строка приветствия контейнера =
[root@php7-lxс ~]#

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

yum update
= вывод команды =
Загружены модули: fastestmirror
Determining fastest mirrors
* base: mirror.sale-dedic.com
* extras: mirror.sale-dedic.com
* updates: dedic.sh
base                                   | 3.6 kB 00:00:00 
extras                                 | 3.4 kB 00:00:00 
updates                                | 3.4 kB 00:00:00 
(1/4): base/7/x86_64/group_gz          | 166 kB 00:00:00 
(2/4): extras/7/x86_64/primary_db      | 156 kB 00:00:00 
(3/4): updates/7/x86_64/primary_db     | 1.4 MB 00:00:00 
(4/4): base/7/x86_64/primary_db        | 6.0 MB 00:00:00 
No packages marked for update

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

exit

Вывод

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

CentOS 7 установка и настройка

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

Введение

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

Установка CentOS 7

Создания USB носителя для установки

Существует множество программ для записи iso образа на устройство. Например, у меня два варианта для создания носителя для установки:

  1. Rufus — использую эту программа для создание загрузочных USB-дисков в системе Windows;
  2. ROSA ImageWriter — использую эту програму для любой системы Linux.

Варианты установки

Рассмотрим два самых популярных варианта установки СentOS 7.

Образы iso CentOS 7

Все свежие образы можно скачать по ссылке Download CentOS. Существует два варианта:

  1. DVD ISO — полный образ;
  2. Minimal ISO — минимальный образ.

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

Для сервера CentOS 7 система идеальна в плане обслуживания и стабильности работы.

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

Шаблоны

Шаблоны используются как правило для установки на VDS и предоставляются компаниями предоставляющие такие услуги. Удобно, но тем не менее я пару раз попадал в дурацкие ситуации.

Вот моменты почему я советую использовать установку на VDS систем с iso образа:

  • Разбивка диска порой не учитывает конфигурацию тарифа или требований вашей системы — например, на одном хостинге при 2 G оперативной памяти был создал SWAP раздел в 512 М в результате пришлось переустанавливать систему дабы не терять место на и так небольшом диске;
  • Локализация как правило Английская — мне приятней работать на своем родном языке хотя и на английском если надо всё настрою;
  • Присутствие в шаблоне каких-то изменений отличающихся от стандартных минимальных параметров установки — порой не понимаешь откуда взялись какие то настройки которых раньше не видел. Кроме того, можно потратить кучу времени не понимая почему не работает то что всегда работало как часы. В итоге выясняется что в шаблоне установки нет пакета который всегда ставился в стандартном минимальном образе.

Все компании предоставляющие услуги VDS могут предоставить возможность установки системы с ISO образа системы. При установке надо правильно указать сетевые параметры исходя из предоставленных сетевых параметров настроек выбранного тарифа!

Разбивка диска для установки

Вариантов разбивки диска для CentOS 7 может быть множество исходя из пожеланий и предпочтений. Например, мне нравиться придерживатся таких параметров:

  • Размер диска под систему Linux 50 G  — этого мне хватает с запасом;
  • Создаю раздел boot размером 1 G — так я гарантирую что при заполнении диска система загрузится однозначно;
  • Создаю SWAP — согласно требованиям системы.

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

SWAP

Тема организации SWAP на сервере очень важная и поэтому я описал все основные моменты использования в статье SWAP для Linux

Настройка CentOS 7

Информация об установленной системе

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

uname -a
= вывод команды = 
Linux vds.sevo44.ru 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Этой информации достаточно для понимания с какой системой предстоит  работать.

Отключение SELinux

Отключаем SELinux. Его использование и настройка в системе CentOS 7 отдельный разговор.

vi /etc/sysconfig/selinux
= меняем значение =
SELINUX=disabled

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

sestatus
= вывод команды =
SELinux status: disabled

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

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

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

Всегда подключаю самый популярный репозиторий Epel (Extra Packages for Enterprise Linux). Epel хранилище пакетов, созданное группой специалистов операционной системы Fedora. Пакеты из Epel репозитория никогда не конфликтуют и не переустанавливают базовые пакеты RHEL.

yum -y install epel-release

Для свежих версий PHP использую репозиторий Remi. Расскажу про это в статье посещенной серверу LEMP.

Старюсь подключать репозитории которые поддерживают сами разработчики программ. Например, такие как Nginx, Zabbix, MariaDB.

Обновление CentOS 7

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

Прежде всего, всегда перед обновлениями делайте резервные копии!

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

yum update

Автоматическое обновление системы

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

Например, получать сообщения на почту об появившихся обновлениях и уже на основании этого принимать решение о необходимости обновления — для меня лучший вариант.

При моих пожеланиях мне подойдёт утилита yum-cron. Ставится она из базового репозитория командой:

yum install yum-cron

После установки создается автоматическое задание на выполнение утилиты в /etc/cron.daily и /etc/cron.hourly.

По-умолчанию, утилита скачивает найденные обновления, но не устанавливает их. Администратору на локальный почтовый ящик root отправляется уведомление об обновлениях.

Конфигурационный файл настройки yum-cron находятся по адресу /etc/yum/yum-cron.conf.

Самый важный параметр это update_cmd — которой будет говорить системе какие выполнять обновления. Доступно несколько вариантов:

  • default — полное обновление;
  • security — только обновление безопасности;
  • security-severity:Critical — только критические обновления безопасности;
  • minimal — минимальное обновление с исправлениями ошибок;
  • minimal-security — исправления ошибок и обновления безопасности;
  • minimal-security-severity:Critical — исправления ошибок и критические обновления.

В разделе настроек [email] указаны параметры отправки сообщений. По умолчанию отправка сообщений идет пользователю root.

Обычно я настраиваю глобально для всего сервера пересылку локальной почты root на внешний почтовый ящик через авторизацию на другом smtp сервере.

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

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

vi /etc/yum/yum-cron.conf
= часть кода =
update_cmd = minimal-security
update_messages = yes
download_updates = yes
apply_updates = no

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

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

systemctl restart yum-cron

Популярные и полезные утилиты

Установим в начале основные популярные утилиты которые обычно требуются в работе.

yum -y install net-tools bind-utils htop atop iftop lsof wget bzip2 traceroute gdisk yum-utils vim
  • net-tools bind-utils — сетевые утилиты после установки которых будут работать команды # ifconfig и # nslookup,
  • htop atop — два интересных диспетчера задач,
  • iftop — показывает в режиме реального времени загрузку сетевого интерфейса,
  • lsof — вывода информации о том, какие файлы используются теми или иными процессами,
  • wget — неинтерактивная консольная программа для загрузки файлов по сети,
  • bzip2 — утилита командной строки с открытым исходным кодом для сжатия данных,
  • traceroute — утилита предназначенная для определения маршрутов следования данных в сетях TCP/IP,
  • fdisk — умеет работать с GPT-дисками разработано по подобию fdisk,
  • yum-utils — это набор утилит для управления репозиториями, установки и отладки пакетов, поиска пакетов и много другого.

Отправка почты с авторизацией на другом SMTP сервере

Настраиваем на базе Postfix.

Проверка статуса:

systemctl status postfix

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

yum install postfix

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

systemctl start postfix
systemctl enable postfix

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

yum install mailx

После этого можно отправлять с консоли сервера сообщения на свою почту:

uname -a | mail -s "info server" info@sevo44.ru

В результате на почту придёт сообщение:

Мы не уверены в подлинности отправителя этого письма. Возможно, данные были подменены.
Отправитель: vds-micro2.sevo44.ru
Подпись: Нет
Шифрование: Нет

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

Например, мне удобно в данном случае везде использовать почту noreply@sevo44.ru которая обслуживается Yandex.

Переименуем дефолтный конфиг Postfix. После этого, создадим рабочий и добавим необходимые настройки:

mv /etc/postfix/main.cf /etc/postfix/main.cf_orig
vim /etc/postfix/main.cf
= необходимый код =
# DEFAULT CONFIG 
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
# Имя сервера, которое выводит команда hostname
myhostname = vds-micro2.sevo44.ru
# По логике нужно оставлять только домен, но в данном случае лучше оставить полное имя сервера, чтобы в поле отправитель 
# фигурировало полное имя сервера, так удобнее разбирать служебные сообщения
mydomain = vds-micro2.sevo44.ru
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost
inet_interfaces = localhost
inet_protocols = all
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

# SMTP YANDEX CONFIG
relayhost = smtp.yandex.ru:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
# База параметров авторизации с SMPT
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# Беза подмены имени почтового ящика 
smtp_generic_maps = hash:/etc/postfix/generic
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may

Создаем файл с информацией об имени пользователя и пароле для авторизации на сервере SMTP:

vim /etc/postfix/sasl_passwd
= необходимый код =
smtp.yandex.ru:587 noreply@sevo44.ru:PASSWORD

Создаем db файл:

postmap /etc/postfix/sasl_passwd

Для того чтобы почта уходила надо чтобы адрес отправителя а адрес авторизации на сервер smtp совпадал!

В случае если у нас имеется сайт отправляющий почту средствами PHP можно настроить корректную отправку почты. Например, добавим параметр для сайта crystalium44.ru.

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

mv /etc/postfix/generic /etc/postfix/generic_orig
vim /etc/postfix/generic
= необходимый код =
root@vds-micro2.sevo44.ru noreply@sevo44.ru
crystalium44.ru@php7-lxc-vds-micro2.sevo44.ru noreply@sevo44.ru

Создаем db файл:

postmap /etc/postfix/generic

При получении ошибки «warning: SASL authentication failure: No worthy mechs found» Необходимо установить еще несколько пакетов для работы SASL!

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

yum -y install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain

Перезапустим Postfix и проверим работу.

systemctl restart postfix

Отправляем тестовое письмо через консоль.

uname -a | mail -s "info server" info@sevo44.ru

Отправитель письма подтверждён и проверен Спамообороной Яндекса.
Отправитель: sevo44.ru
Подпись: sevo44.ru
Шифрование: Да

Так выглядит письмо отправленное с сайта crystalium44.ru c помощью PHP:

 

Как видим теперь всё работает как надо!

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

tail -n 10 /var/log/maillog

В заключение, осталось добавить к стандартному алиасу для root в /etc/aliases, внешний адрес, куда будет дублироваться почта, адресованная root. Для этого редактируем указанный файл, изменяя последнюю строку:

vim /etc/aliases
= необходимо привести к виду =
# Person who should get root's mail
root: root,info@sevo44.ru

Обновляем базу сертификатов:

newaliases

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

Определим текущее время на сервере:

date
= вывод команды =
Ср ноя 14 12:17:34 CET 2018

Как видим временная зона не настроена.

Выполним необходимую настройку временной зоны Europe — Moscow:

= Сделать резервную копию текущей timezone =
mv /etc/localtime /etc/localtime.bak

= В папке /usr/share/zoneinfo/ ишем что надо и делаем ссылку =
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

В итоге получим:

date
= вывод команды =
Сб окт 13 02:59:46 MSK 2018

Синхронизация времени

В CentOS 7 по-умолчанию используется утилита для синхронизации времени chrony. Если у вас её нет, то устанавливайте:

yum install chrony

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

systemctl start chronyd
systemctl enable chronyd

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

systemctl status chronyd
= вывод команды =
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Ср 2018-10-03 21:55:18 MSK; 27min ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Main PID: 631 (chronyd)
CGroup: /system.slice/chronyd.service
└─631 /usr/sbin/chronyd

окт 03 21:55:17 lemp.sevo44.loc systemd[1]: Starting NTP client/server...
окт 03 21:55:17 lemp.sevo44.loc chronyd[631]: chronyd version 3.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SECHASH +SIGND +ASYNCDNS +IPV6 +DEBUG)
окт 03 21:55:17 lemp.sevo44.loc chronyd[631]: Frequency 1.141 +/- 1.440 ppm read from /var/lib/chrony/drift
окт 03 21:55:18 lemp.sevo44.loc systemd[1]: Started NTP client/server.
окт 03 21:55:35 lemp.sevo44.loc chronyd[631]: Selected source 89.109.251.23
окт 03 21:55:35 lemp.sevo44.loc chronyd[631]: System clock wrong by 1.035954 seconds, adjustment started
окт 03 21:55:36 lemp.sevo44.loc chronyd[631]: System clock was stepped by 1.035954 seconds

Сетевые параметры

При установке CentOS 7 уделяю особое внимание настройки сетевых параметров. Кроме того, на странице настройки сетевых параметров указывается название хоста.

В случае установки с образа iso на vds настройка сетевых параметров просто необходима.

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

Для управления сетевыми настройками в CentOS 7 после установки можно воспользоваться графической утилитой nmtui:

nmtui
= вывод команды =
-bash: nmtui: команда не найдена
= команда установки необходимого пакета для работы nmtui =
yum install NetworkManager-tui

Сетевые настройки необходимо выполнять с помощью nmtui или руками предварительно отключив NetworkManager!

Руками вся настройка сводится к редактированию файлов в паке /etc/sysconfig/network-scripts/. Для определения интерфейсов необходимо предварительно выполнить команду ip addr которая покажет название всех имеющихся интерфейсов.

Например, мой файл настройки сетевого интерфейса ens18:

vim /etc/sysconfig/network-scripts/ifcfg-ens18
= вывод команды =
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens18"
UUID="2f1479ad-8a41-4886-acf4-64f0c5eff5c2"
DEVICE="ens18"
ONBOOT="yes"
IPADDR="135.21.15.51"
PREFIX="24"
GATEWAY="18.22.52.1"
DNS1="165.2.92.3"
ZONE=public

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

/etc/init.d/network restart
= вывод команды =
Restarting network (via systemctl):                        [  OK  ]

= или командой =
systemctl restart NetworkManager.service

= предварительно поняв название необходимого сервиса =
systemctl list-units | grep -i network

Подсчет сетевого трафика

Иногда необходимо посмотреть трафик сервера за определенный период и для этого идеально подходит утилита vnStat. При желании можно настроить web интерфейс, для красивого отображения статистики по трафику.

vnStat получает данные из ядра Linux, т.е. не снифит поток, благодаря чему работает быстро и не вызывает вопросов к безопасности. Кроме того, она отлично делает свое дело без root привилегий.

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

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

yum install vnstat

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

man vnstat

Посмотреть список доступных интерфейсов можно командой:

vnstat --iflist
= вывод команды =
Available interfaces: lo ens18 (1000 Mbit)
Как видим у нас один сетевой интерфейс. Задаем сетевой интерфейс на который мы будем учитывать сетевой трафик, в данном примере это ens18:
vnstat -u -i ens18
= вывод команды =
Error: Unable to read database "/var/lib/vnstat/ens18": Нет такого файла или каталога
Info: -> A new database has been created.

Необходимая база создалась.
Настройки находятся в файле /etc/vnstat.conf и по умолчанию там стоит eth0 заменим его на наш:
vim /etc/vnstat.conf
= необходимое исправление =
# default interface
Interface "ens18"
Если больше ничего не делать а просто добавить в автозагрузку службу и запустить то спустя какое то время вы заметите что статистика не ведется. При просмотре статуса службы увидите ошибки:
systemctl status vnstat -l
= вывод команды =
 vnstat.service - vnStat network traffic monitor
   Loaded: loaded (/usr/lib/systemd/system/vnstat.service; enabled; vendor preset: disabled)
   Active: active (running) since Сб 2019-01-26 01:37:57 MSK; 3 days ago
     Docs: man:vnstatd(1)
           man:vnstat(1)
           man:vnstat.conf(5)
 Main PID: 12380 (vnstatd)
   CGroup: /system.slice/vnstat.service
           └─12380 /usr/sbin/vnstatd -n

янв 29 06:48:14 vds-micro2.sevo44.ru vnstatd[12380]: Error: Unable to create database backup "/var/lib/vnstat/.ens18".
янв 29 06:48:14 vds-micro2.sevo44.ru vnstatd[12380]: Error: Unable to create database backup "/var/lib/vnstat/.ens18".
Откроем файл конфигурации и добавим параметр vnstat в две строки кода:
vim /etc/vnstat.conf
= необходимые изменения =
# vnstatd
##

# switch to given user when started as root (leave empty to disable)
DaemonUser "vnstat"

# switch to given user when started as root (leave empty to disable)
DaemonGroup "vnstat"

Сменим пользователя сервиса с vnstat на root:

vim /lib/systemd/system/vnstat.service
= вывод команды с необходимыми изменениями = 
[Unit]
Description=vnStat network traffic monitor
Documentation=man:vnstatd(1) man:vnstat(1) man:vnstat.conf(5)
After=network.target

[Service]
User=root
ExecStart=/usr/sbin/vnstatd -n
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

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

systemctl status vnstat
= вывод команды =
● vnstat.service - vnStat network traffic monitor
Loaded: loaded (/usr/lib/systemd/system/vnstat.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:vnstatd(1)
man:vnstat(1)
man:vnstat.conf(5)

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

systemctl start vnstat
systemctl enable vnstat
Необходимо подождать какое-то время, а пока данные копятся, можем посмотреть, что происходит с сетевым интерфейсом в режиме онлайн:
= С указанием необходимого интерфейса  =
vnstat -l -i ens18
= Показывает статистику default интерфейса =
vnstat -l

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

vnstat
= вывод команды =
Database updated: Tue Jan 22 19:42:45 2019
ens18 since 22.01.2019

rx:  2,16 MiB      tx:  58 KiB      total:  2,22 MiB

monthly
                rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
янв '19        2,16 MiB |      58 KiB |    2,22 MiB |    0,01 kbit/s
     ------------------------+-------------+-------------+---------------
estimated        --     |      --     |      --     |

daily
                rx      |     tx      |    total    |   avg. rate
     ------------------------+-------------+-------------+---------------
    today      2,16 MiB |      58 KiB |    2,22 MiB |    0,26 kbit/s
     ------------------------+-------------+-------------+---------------
estimated        --     |      --     |      --     |
  • rx – полученные;
  • tx – переданные пакеты.

Вот примеры отображения дневной и месячной статистики:

vnstat -d
= вывод дневной статистики =
ens18 / daily

day rx | tx | total | avg. rate
------------------------+-------------+-------------+---------------
29.01.2019 375,86 MiB | 5,71 MiB  | 381,57 MiB | 36,18 kbit/s
30.01.2019 535,89 MiB | 19,58 MiB | 555,47 MiB | 52,67 kbit/s
31.01.2019 509,02 MiB | 19,55 MiB | 528,57 MiB | 50,12 kbit/s
01.02.2019 366,43 MiB | 13,23 MiB | 379,66 MiB | 53,21 kbit/s
------------------------+-------------+-------------+---------------
estimated 541 MiB | 19 MiB | 560 MiB |

vnstat -m
= вывод статистики по месяцам =
 ens18  /  monthly

       month    rx      |     tx      |    total    |   avg. rate
    ------------------------+-------------+-------------+---------------
    янв '19    1,39 GiB |   44,83 MiB |    1,43 GiB |    4,48 kbit/s
    фев '19  366,43 MiB |   13,23 MiB |  379,66 MiB |   65,27 kbit/s
    ------------------------+-------------+-------------+---------------  estimated     18,14 GiB |     659 MiB |   18,79 GiB |

Русификация консоли

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

localectl set-locale LANG=ru_RU.UTF-8

После перезагрузки всё в консоли станет на русском языке.

Смена пароля root

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

passwd
= вывод команды =
Изменяется пароль пользователя root.
Новый пароль : 
Повторите ввод нового пароля : 
passwd: все данные аутентификации успешно обновлены.

Брандмауэр FirewallD

По умолчанию в системе CentOS 7 используется Файрвол (брандмауэр) FirewallD. О том как работать я описывал в статье FirewallD базовая настройка. Ниже я выполню необходимые действия не описывая всё подробно.

FirewallD многие советуют отключать и пользоваться старым проверенным механизмом iptables, так как он используется по умолчанию во многих системах Linux.

Найти информацию о том как настраивать iptables для разных вариантов работы вы можете на замечательном ресурсе serveradmin.ru.

Вывод информации об активных зонах:

firewall-cmd --get-active-zones
= вывод команды =
public
  interfaces: ens18

Выведем информацию о конкретной зоне:

firewall-cmd --list-all --zone=public
= вывод команды =
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens18
  sources: 
  services: ssh dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

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

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

firewall-cmd --permanent --zone=public --add-port=25555/tcp
= вывод команды = 
success

Кроме того, сразу далим ненужный сервис:

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

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

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

firewall-cmd --list-all --zone=public
= вывод команды =
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens18
  sources: 
  services: ssh
  ports: 25555/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Только после настройки ssh для работы по новому порту удаляйте сервис ssh из FirewallD!

Смена порта SSH

Укажем порт в настройках ssh открыв конфигурационный файл командой:

vi /etc/ssh/sshd_config
= необходимые изменения =
Раскоментируем строку Port 22 и заменим на наш 25555

Перезапускаем сервис ssh командой:

systemctl restart sshd

Проверяем какой порт слушает sshd (для работы нужен установленный пакет net-tools):

netstat -tulpn | grep sshd
tcp 0 0 0.0.0.0:25555 0.0.0.0:* LISTEN 453/sshd 
tcp6 0 0 :::25555 :::* LISTEN 453/sshd

Подключение к SSH по нестандартному порту

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

ssh -p 25555 root@193.124.180.195

Авторизация SSH по ключу

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

После настройки можно отключить в параметрах ssh авторизацию по паролю, но иногда подключение по паролю просто необходимо. Обычно я создаю 16 злачный пароль и меняю его если давал временный доступ специалистам любого уровня и моего доверия. Безопасность лишней не бывает!

Более подробно о том как настроить подключение по ключу можно в статье RSA или авторизация SSH по ключу

Добавляем на сервер необходимый ключ командой:

ssh-copy-id -i /home/local/.ssh/sevo44_rsa.pub -p 25555 root@243.21.12.24

Установка Midnight Commander

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

yum -y install mc

Включаем подсветку синтаксиса всех файлов, которые не обозначены явно в файле /usr/share/mc/syntax/Syntax. Этот универсальный синтаксис подходит для конфигурационных файлов, с которыми чаще всего приходится работать на сервере. Именно этот шаблон будет применяться к .conf и .cf файлам, так как к ним явно не привязано никакого синтаксиса. Перезаписываем файл unknown.syntax:

cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax
= вывод команды =
cp: переписать «/usr/share/mc/syntax/unknown.syntax»? y

В случае отказа от использования встроенного редактора MC необходимо в настройках «Настройки — Конфигурация» снять галки у параметров «Встроенный редактор» и «Встроенный просмотр»

Установка редактора Vim

По умолчанию в системе работает редактор vi и его вполне достаточно.

Обоснование использования редактора VIM и как с ним работать можно в статье Vim текстовый редактор

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

yum -y install vim

Отображение приглашения в консоли bash

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

Стандартный вариант отображения приветсвия после установки CentOS 7:

[root@vds-micro ~]#

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

Выведем имеющиеся параметры:

echo $PS1
= вывод команды =
[\u@\h \W]\$

Изменим для текущей сессии:

export PS1='\[\033[01;31m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] '
= в результате =
root@vds-micro.sevo44.ru ~ # 

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

vim .bashrc
= необходимые дополнения =
# Приветствие bash
PS1='\[\033[01;31m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] '

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

vim /etc/profile.d/bash_completion.sh
= необходимое дополнение =
# Вид bash
PS1='\[\033[01;32m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] '

В итоге я получил следующее:

root@vds-micro.sevo44.ru /etc #  = права root
root@vds-micro.sevo44.ru /etc #  = простой пользователь

Более подробно можно почитать в статье Изменение приглашения терминала в bash.

Настройка хранения истории bash

Список последних выполненных команд хранится в домашней директории пользователя в файле .bash_history (в начале точка). Его можно открыть любым редактором и посмотреть.

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

history
= вывод команды =
1 yum update
2 reboot
3 htop
4 df -h

Как видим вывод не информативный. Кроме того, покажет только последние 1000 команд.

Быстро найти конкретную команду, можно с помощью фильтрации только нужных строк, например вот так:

history | grep yum

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

# Настройки history
export HISTSIZE=10000
export HISTTIMEFORMAT="%h %d %H:%M:%S "
PROMPT_COMMAND='history -a'
export HISTIGNORE="ls:ll:history:w"

Расшифруем параметры:

  • Первый параметр увеличивает размер файла до 10000 строк;
  • Второй параметр указывает, что необходимо сохранять дату и время выполнения команды;
  • Третья строка вынуждает сразу же после выполнения команды сохранять ее в историю;
  • В последней строке мы создаем список исключений для тех команд, запись которых в историю не требуется.

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

source ~/.bashrc

В итоге мы получим:

history
= вывод команды =
1  янв 22 18:33:08 yum update
2  янв 22 18:33:08 reboot
3  янв 22 18:33:08 htop
4  янв 22 18:33:08 df -h

Можно применить эту настройку для всех пользователей указав параметр в файле /etc/profile.d/bash_completion.sh который мы создали ранее при настройке вида bash.

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

Установка Tmux

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

Установка выполняется командой:

yum install tmux

Более подробная информация по настройке и работе с программой Tmux можно в статье Tmux терминальный оконный менеджер

Cpaste или показываем свой код

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

yum install cpaste

Например, мы хотим показать код глобальной настройки nginx.

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

cat /etc/nginx/nginx.conf | cpaste
= результат команды =
Successfully pastebined to: https://paste.centos.org/view/0c2650772c

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

Можно отправить вывод команды. Например, информацию о размерах дискового пространства можно отправить командой:

df -h | cpaste
= вывод команды =
Successfully pastebined to: https://paste.centos.org/view/17671ad924

По умолчанию заметка будет храниться 1 день.

Вывод

В результате я получил статью в которой свёл в одно место все основные моменты которые я на практике использую при базовой настройке сервера CentOS 7. Возможно что-то сказано с ошибками или можно улучшить. Комментируйте и советуйте я всегда рад обратной связи с пользователями систем Linux.

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

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

Введение

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

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

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

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

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

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

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

usermod -aG sevo44.ru nginx

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

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

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

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

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

systemctl restart sshd

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

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

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

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

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

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

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

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

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

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

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

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

tail -n 10 /var/log/secure

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

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

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

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

logrotate /etc/logrotate.conf

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

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

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

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

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

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

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

nginx -t
systemctl reload nginx
systemctl restart php-fpm

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

Заключение

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

Cоllabora и настройка NextCloud

Рассмотрим некоторые моменты настройки NextCloud работающем на Calculate Linux. Установим Collabora Office и другие полезные приложения. Расскажу про основные моменты работы и настройки этого свободного облачного хранилища. Большой диапазон возможностей в использовании.

Введение

За основу была взята настройка свободного облачного хранилища из статьи NextCloud установка на Nginx.

Создание облачного хранилища для работы с файлами удобная и практичная технология. Облачное хранилище на базе NextCloud даёт воистину восхитительные возможности. В одном месте вы сможете настроить совместную работу с документами, безопасность, и общение. Облако позволит сократить количество стороннего программного обеспечения используемого пользователями. Разве не сказка использовать для работы практически любой браузер, смотреть видео, редактировать документы, делать видео звонки, общаться в чате, и много что ещё. Далеко не все рассказал в статье, так как это просто не возможно. Для работы со всеми форматами офисных документов рекомендую использовать Collabora Office, так как только он даст вам спокойно работать с любыми форматами офисных документов без конвертирования в формат docx, как это делает OnlyOffice. Устанавливайте, настраивайте и почувствуйте сами все прелести использования своего подконтрольного вам облачного хранилища.

Долго использовал работу NextCloud на дистрибутиве CentOS c базой данных MariaDB. При тестирования работы на Calculate Linux был приятно удавлен, что при одинаковых настройках производительность была лучше а после перехода на базу данных PosgreSQL расход памяти стал просто смешной.

Дизайн NextCloud

Разработчики предусмотрели желание пользователей произвести изменения внешнего вида. К сожалению не все можно поменять с панели управления. Некоторые изменения дизайна произведём в ручном режиме.

Темы оформления

Настройка дизайна производится на странице Администрирование — Темы оформления.

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

В итоге я получил такую страницу приветствия:

Значок веб-сайта

Заменяем файл favicon.ico в папке согласно пути от корневой папки сайта ../core/img.

Существует множество сайтов предоставляющих возможность сделать файл значка веб-сайта. Рекомендую использовать Генератор пиктограмм, так как он позволяет делать иконки из картинок размером 5 Мб.

После замены незабываем дать права на файл:

chown nginx:nginx /var/www/nextcloud/htdocs/core/img/favicon.ico

Картинка для Telegram

Картинка ссылки что будет в чате Телеграм находится по пути ../core/img и называется favicon-fb.png.

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

chown -R nginx:nginx /var/www/nextcloud/htdocs/core/img/favicon-fb.png

При обновлении NextCloud файлы с папки ../core/img будут заменены на стандартные!

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

Папка где лежат файлы которые по умолчанию увидит новый созданный пользователь находится по пути ../core/skeleton. Создайте в папке все необходимые файлы и папки. Не забудьте дать необходимые права на все файлы и папки:

chown -R nginx:nginx /var/www/nextcloud/htdocs/core/skeleton

Основные моменты работы с NextCloud

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

Настройка почтового сервера NextCloud

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

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

Настройки сервера SMTP находится по пути Администрирование — Дополнительные настройки — Почтовый сервер. В моем случае настройки выглядят следующим образом:

Фоновые задания

Для оптимальной производительности важно правильно настроить выполнение задач в фоновом режиме. Для больших экземпляров рекомендуется использовать параметр «Cron».

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

cat /etc/cron.d/nextcloud_cron
= необходимый код =
# Global variables
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/

#Nextcloud
*/15 * * * * nginx php -f /var/www/nextcloud/htdocs/cron.php

Размер загружаемых файлов

В файле настроек Nginx для Nextcloud мы указали что размер загружаемого файла не может превышать 10 Gb. Добавим этот параметр на странице Администрирование — Дополнительные настройки — Управление файлами.

Подключение к базе пользователей LDAP

Используя дополнение LDAP user and group backend можно подключать как LDAP каталог так и AD от Windows. На практике подключал оба варианта. Проблема возникла только с аватарами пользователей.

Настройка очистки удалённых файлов

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

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

Доступные значения:

  • auto— настройки по умолчанию. Хранит файлы и папки в мусорном ведре в течение 30 дней и автоматически удаляет в любое время после этого, если требуется пространство (обратите внимание: файлы не могут быть удалены, если пространство не требуется)
  • D, auto—  хранит файлы и папки в мусорном ящике для дней D +, удаляет в любое время в случае необходимости (обратите внимание: файлы не могут быть удалены, если пространство не требуется)
  • auto, D — удалите все файлы в мусорном ящике, которые старше D дней автоматически, удаляют другие файлы в любое время, если необходимо пространство
  • D1, D2 — хранить файлы и папки в мусорном ведре не менее D1 дней и удалять, когда превышает D2 дней
  • disabled — корзина мусора автоматически очищена, файлы и папки будут сохранены навсегда

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

vim /var/calculate/www/nextcloud/htdocs/config/config.php
= необходимое дополнение =
 'trashbin_retention_obligation' => '7, auto', 
); 

Разграничение прав пользователей

Вот основные параметры:

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

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

Возможности доступа к данным

К данным размешенным на облачном хранилище NextCloud вы можете получить доступ разными способами:

  • Через любой веб браузер;
  • Используя клиент синхронизации, который есть под операционные системы Windows, Linux, Android, и тд…;
  • Подключится используя протокол WebDAV.

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

Создание графиков и схем

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

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

Просмотр видео

К сожалению просматривать можно только формат mp4. Существует множество конвертеров по преобразованию файлов в нужный формат и даже онлайн сервисы. Будем надеяться что разработчики расширят количество форматов.

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

В Calculate Linux программа устанавливается командой:

emerge --ask media-video/handbrake

Видео звонки между пользователями

Приложение Talk позволяет добавить на ваше облачное хранилище возможность совершать видео звонки пользователям. Создание группового звонка увеличивает привлекательность приложения в разы. Вся связь осуществляется по технологии WebRTC. Проект WebRTC имеет открытый исходный код и активно продвигается компанией Google. Суть проекта это возможность использовать для организации видеоконференций веб браузер без использования сторонних программ и технологий.

Чат или Xmpp Client

Приложение JavaScript XMPP Chat позволяет добавить простой чат для общения пользователей с сохранением истории сообщений.

Существует три варианта использования:

  1. Internal — ограниченная функциональность: нет клиентов, кроме JSXC в Nextcloud, без многопользовательского чата, без серверных федераций,
  2. External —  подключится к собственному серверу XMPP,
  3. Managed (Beta service) — получить ваш собственный полнофункциональный XMPP-сервер, непосредственно размещенный основной командой JSXC.

Какой вариант использовать решать вам.

Календари

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

Подключение внешних хранилищ

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

При работе с подключённым Yandex.Disk есть один нюанс. При удалении файлов большого размера происходит ошибка и связана она с тем что файл вначале должен попасть в вашу корзину а уже затем удалится. Можно конечно увеличить время ожидание, но это не разумно. Отключать корзину тоже не целесообразно. Вероятно проблема будет решена в ближайших обновлениях приложения.

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

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

В моем случае я не использую подключение к шарам на Windows, поэтому получаю предупреждение сверху страницы. При необходимости надо установить samba на сервере и сообщение пропадёт.

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

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

Мониторинг работы NextCloud

На странице по ссылке Администрирование — Мониторинг вы найдёте все реальны параметры работы облачного хранилища.

Параметры отображаемые на странице Мониторинг:

  • Загрузка процессора,
  • Использование памяти,
  • Активные пользователи,
  • Ресурсы общего доступа,
  • Хранилище (количество пользователей и файлов),
  • Параметры PHP,
  • База данных.

Журналирование работы NextCloud

Посмотреть логи вы можете зайдя по ссылке Администрирование — Журналирование. Присутствует возможность отсортировать по виду сообщений.

Collabora Office установка на Docker

К сожалению после установки NextCloud вы сможете просматривать и работать только с документами формата txt. Для того чтобы работать со всеми видами офисных документов необходимо установить приложение для работы с этими форматами. В моем случае используется свободная версия Collabora Office. Можно установить и ONLYOFFICE но он имеет ограничение на количество пользователей в свободной версии ( 20 пользователей ) и не поддерживается официально разработчиками NextCloud.

После установки и тестирования OnlyOffice выяснилось что в этом приложении можно работать только с некоторыми форматами документов: DOCX, XLSX, PPTX, TXT, CSV. В том что OnlyOffice может открывать и другие типы файлов полное вранье! Для того чтобы открыть ODT, ODS, ODP, DOC, XLS, PPT, PPS, EPUB, RTF, HTML, HTM разработчики предусмотрели вариант конвертирование их в «лучший» формат и уже с этим файлом в последствии работать. Вот такое отношение к свободным форматам файлов у разработчиков OnlyOffice и присутствует явное навязывание форматов от всем нам известной компании. В Collabora вы сможете открыть и работать с любыми форматам и это даёт вам полую свободу и удобство в работе.

Отсутствие проверки Русского языка

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

» Привет Алекс,

Спасибо за Ваше сообщение и за ваш интерес к организации совместной работы в Интернете.

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

Что касается ваших вопросов, проверка орфографии-это новая функция, которую мы добавили в наш код версии несколько месяцев назад. Теперь, мы работаем на других языках и, конечно, русский для нашего следующего выпуска кода. Мы выпустим наш следующий код версии в конце этого года 2017.»

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

Приятная новость! Как и обещали разработчики в конце года вышла новая версия в которой работает проверка орфографии для русского языка. Посмотреть информацию о версиях можно на странице https://www.collaboraoffice.com/news-releases/.

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

Установка Docker на Calculate Linux или Gentoo:

emerge --ask app-emulation/docker

Добавление в автозагрузку:

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

Запуск Dockera:

/etc/init.d/docker start
docker | * Caching service dependencies ...            [ ok ]
docker | * /var/log/docker.log: creating file
docker | * /var/log/docker.log: correcting mode
docker | * /var/log/docker.log: correcting owner
docker | * Starting docker...                          [ ok ]

Установка Collabira Office в Docker

Скачиваем контейнер командой:

docker pull collabora/code
= вывод команды =
===
Using default tag: latest
Trying to pull repository docker.io/collabora/code ... 
latest: Pulling from docker.io/collabora/code
bd97b43c27e3: Pull complete 
6960dc1aba18: Pull complete 
2b61829b0db5: Pull complete 
1f88dc826b14: Pull complete 
73b3859b1e43: Pull complete 
2cb7a8fe8de9: Pull complete 
2458b914d686: Pull complete 
7470c2907839: Pull complete 
Digest: sha256:a89941eb0aa140b82e658f34f840ba3c35f47c3f3eec79694fc460ae9fced79d

Запустим контейнер докера заменив cloud\\.sevo44\\.ru на ваш домен сервера Nextcloud (с сохранением обратного слэша).

docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=cloud\\.sevo44\\.ru' -e "username=admin" -e "password=pass*" --restart always --cap-add MKNOD collabora/code

Необязательные параметры»username=admin» и»password=pass*» включают функцию консоли администратора Сollabora. Доступ к консоли администратора осуществляется по адресу https://<CODE-domain>/loleaflet/dist/admin/admin.html

Проверка работы контейнера Docker в системе

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

netstat -lnpt
= часть вывода =
tcp  0  0   127.0.0.1:9980    0.0.0.0:*   LISTEN   4582/docker-proxy 

Согласно вывода мы видим что контейнер работает на порту 9980 и ждёт к себе обращений для выполнения поставленных задач. Нам необходимо средствами Nginx настроить связь нашего облачного хранилища и контейнера Docker с Collabora Office.

Посмотрим состояние контейнеров Docker в сисетме:

docker ps -a
= часть вывода команды =
9558da76e647 collabora/code "/bin/sh -c 'bash ..." 2 weeks ago Up 42 hours 127.0.0.1:9980->9980/tcp relaxed_lovelace

Обновление Collabora Office в Docker

Скачиваем новое изображение докера:

docker pull collabora/code

Выводим список докеров в системе:

docker ps
= вывод команды =
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37359809d296 collabora/code "/bin/sh -c 'bash ..." 2 weeks ago Up 4 minutes 127.0.0.1:9980->9980/tcp dreamy_hamilton

Останавливаем и удаляем изображение Докера Collabora Online:

docker stop 37359809d296
docker rm 37359809d296

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

docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=cloud\\.sevo44\\.ru' -e "username=admin" -e "password=pass*" --restart always --cap-add MKNOD collabora/code

Новая версия установлена!

Внимание! Перед проверкой новой версии удалите кэш и куки интернет браузера.

Nginx для Collabora Office

При настройке я не стал устанавливать самоподписные сертификаты SSL, а сразу получил свободные от Let’s Еncrypt. Если кто пробовал настраивать с само подписными напишите пожалуйста в комментариях.

Создадим необходимую корневую папку необходимую для получения сертификата для Collabora и дадим необходимые права:

mkdir -p /var/www/office
chown nginx:nginx /var/www/office

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

Параметры для первого получения SSL сертификата:

vi /etc/nginx/conf.d/office.conf
= необходимый код =
server {
 listen 80;
 server_name office.sevo44.ru;
root /var/www/office;
}

Проверяем и перезапускаем Nginx:

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 ]

Получение SSL для Collabora online Office

Более детально получение SSL описано в материале «Установка Let`s Encrypt для Calculate и Gentoo«. На его основе было произведено получение сертификата для домена office.sevo44.ru.

Файл настройки для работы с SSL сертификатом от Let’s Еncrypt в моем случае получил такой вид:

vim /etc/nginx/conf.d/office.conf 
= необходимые изменения с пояснениями =
# office.sevo44.ru
server { 
 listen 80; 
 server_name office.sevo44.ru; 
 rewrite ^ https://$server_name$request_uri? permanent; 
}

server {
 listen 443 ssl;
 server_name office.sevo44.ru;
 root /var/www/office;

ssl_protocols TLSv1.1 TLSv1.2;
 ssl_certificate /etc/letsencrypt/live/office.sevo44.ru/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/office.sevo44.ru/privkey.pem;

# static files
 location ^~ /loleaflet {
 proxy_pass https://localhost:9980;
 proxy_set_header Host $http_host;
 }

# WOPI discovery URL
 location ^~ /hosting/discovery {
 proxy_pass https://localhost:9980;
 proxy_set_header Host $http_host;
 }

# websockets, download, presentation and image upload
 location ^~ /lool {
 proxy_pass https://localhost:9980;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "Upgrade";
 proxy_set_header Host $http_host;
 }
}

Не забываем проверить и перезагрузить Nginx!

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

Вывод

Облачное хранилище NextCloud это просто бездна возможностей. Каждый раз откладывал публикацию статьи так как находил всё новые и новые полезности. Скорей всего ещё не раз буду добавлять новое в эту статью. Буду признателен если в комментариях будут какие то нюансы в работе или рекомендации по приложениям. Последнее что мне не удаётся настроить это приложение PhoneTrack которое позволяет с устройств имеющих GPS получать данные о местоположении в реальном времени и видеть маршруты передвижения. Если кто настраивал поделитесь информацией.

NextCloud установка на Nginx

Создадим своё облачное хранилище NextCloud под управление Nginx на базе дистрибутива CSS от Calculate Linux. Принцип установки и настройки подойдет для любого другого дистрибутива Linux. Совместная работа с файлами с любого браузера.

Введение

Ранее я описывал как настраивать NGINX на web сервер CentOS 7 и LEMP сервер на Calculate Linux на основе последнего материала произведу настройку NextCloud. Обновление облачного хранилища производится средствами самого ресурса и поэтому выполним установку из исходных файлов с сайта разработчика. NextCloud будет работать в локальной сети. Для удобства работы откроем доступ с сети интернет и подключим свободный сертификат SSL от компании Let`s Encrypt. В качестве базы данных будем использовать PostgreSQL.

Ошибка при установке на MariaBD

При попытке установки на базу данных MariaDB вы получите ошибку:

«General error: 1665 Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED»

Для избавления от этой ошибки необходимо отредактировать конфигурационный файл /etc/mysql/my.cnf отвечающий за настройки базы.

/etc/mysql/my.cnf
= необходимые параметры =
[mysqld]
binlog-format=MIXED
innodb_large_prefix=on
innodb_file_format=barracuda
innodb_file_per_table=true

После перезагрузки MariaDB установка пройдёт без ошибок.

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

В будущем я напишу более детальную статью о том как работать с PostgreSQL. Ниже я лишь опишу основные моменты которые необходимы для работы NextCloud с этой базой данных.

Установим базу данных PostgreSQL командой:

emerge --ask dev-db/postgresql

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

emerge --config =dev-db/postgresql-9.6.6
= вывод команды =

Configuring pkg...

* You can modify the paths and options passed to initdb by editing:
 * /etc/conf.d/postgresql-9.6
 * 
 * Information on options that can be passed to initdb are found at:
 * http://www.postgresql.org/docs/9.6/static/creating-cluster.html
 * http://www.postgresql.org/docs/9.6/static/app-initdb.html
 * 
 * PG_INITDB_OPTS is currently set to:
 * --encoding=UTF8
 * 
 * Configuration files will be installed to:
 * /etc/postgresql-9.6/
 * 
 * The database cluster will be created in:
 * /var/lib/postgresql/9.6/data
 * 
 * Continuing initialization in 5 seconds (Control-C to cancel) ... [ ok ]
 * Creating the data directory ...
 * Initializing the database ...
Файлы, относящиеся к этой СУБД, будут принадлежать пользователю "postgres".
От его имени также будет запускаться процесс сервера.

Кластер баз данных будет инициализирован со следующими параметрами локали:
 COLLATE: ru_RU.utf8
 CTYPE: ru_RU.utf8
 MESSAGES: ru_RU.utf8
 MONETARY: ru_RU.utf8
 NUMERIC: C
 TIME: ru_RU.utf8
Выбрана конфигурация текстового поиска по умолчанию "russian".

Контроль целостности страниц данных отключён.

исправление прав для существующего каталога /var/lib/postgresql/9.6/data... ок
создание подкаталогов... ок
выбирается значение max_connections... 100
выбирается значение shared_buffers... 128MB
выбор реализации динамической разделяемой памяти ... posix
создание конфигурационных файлов... ок
выполняется подготовительный скрипт ... ок
выполняется заключительная инициализация ... ок
сохранение данных на диске... ок

ПРЕДУПРЕЖДЕНИЕ: используется проверка подлинности "trust" для локальных подключений.
Другой метод можно выбрать, отредактировав pg_hba.conf или используя ключи -A,
--auth-local или --auth-host при следующем выполнении initdb.

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

/usr/lib64/postgresql-9.6/bin/pg_ctl -D /var/lib/postgresql/9.6/data -l logfile start

* The autovacuum function, which was in contrib, has been moved to the main
 * PostgreSQL functions starting with 8.1, and starting with 8.4 is now enabled
 * by default. You can disable it in the cluster's:
 * /etc/postgresql-9.6/postgresql.conf
 * 
 * The PostgreSQL server, by default, will log events to:
 * /var/lib/postgresql/9.6/data/postmaster.log
 * 
 * You should use the '/etc/init.d/postgresql-9.6' script to run PostgreSQL
 * instead of 'pg_ctl'.

В выводе указана вся основная информация.

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

/etc/init.d/postgresql-9.6 start
= вывод команды =
postgresql-9.6 | * /run/postgresql: creating directory
postgresql-9.6 | * /run/postgresql: correcting owner
postgresql-9.6 | * Starting PostgreSQL 9.6 ...

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

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

Создадим пароль для пользователя posgres:

psql -U postgres
psql (9.6.6)
Введите "help", чтобы получить справку.

postgres=# \password
Введите новый пароль: вводим пароль
Повторите его: повторяем пароль
postgres=# \q

Настройка доступа к базам PostgreSQL

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

За доступ отвечают параметры в файле /etc/postgresql-9.6/pg_hba.conf. В моем случае мне необходимо чтобы доступ был разрешен только с моего компьютера в локальной сети. Произведем корректировку файла:

vim /etc/postgresql-9.6/pg_hba.conf
= часть вывода команды с необходимым дополнением =
# IPv4 local connections: 
host    all             all             127.0.0.1/32            trust 
host    all             all             192.168.0.3/24          trust

Помимо того что надо добавить доступ в iptables для 5432 необходимо внести изменения в файл /etc/hosts. Добавим нужные данные с учетом что ip адрес сервера 192.168.0.141:

vim /etc/hosts
= часть вывода команды с необходимым добавлением =
127.0.0.1 lempcss.sevo44.loc lempcss localhost
192.168.0.141 lempcss.sevo44.loc lempcss localhost

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

/etc/init.d/postgresql-9.6 restart 
postgresql-9.6    | * Stopping PostgreSQL 9.6 (this can take up to 92 seconds) ...  [ ok ] 
postgresql-9.6    | * /run/postgresql: correcting mode 
postgresql-9.6    | * Starting PostgreSQL 9.6 ...                     [ ok ]

Проверим какие порты работают:

netstat -an 
= часть вывода команды =
Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 192.168.0.141:5432      0.0.0.0:*               LISTEN      
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN

Достаточно указать в pgAdmin4 сервер 192.168.0.141, порт 5432, данные пользователя posgres для подключения и удобно работать с базами данных.

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

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

Перейдем под пользователя posgres
su - postgres
Создадим базу nextcloud
postgres@lempcss ~ $ createdb nextcloud
Подключимся к консоли Postgres
psql -U postgres
psql (9.6.6)
Введите "help", чтобы получить справку.
Выведем список всех баз
postgres=# \l 
Список баз данных 
    Имя    | Владелец | Кодировка | LC_COLLATE |  LC_CTYPE  |     Права доступа      
-----------+----------+-----------+------------+------------+----------------------- 
 nextcloud | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | postgres=CTc/postgres+ 
           |          |           |            |            | 
 postgres  | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 |  
 template0 | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | =c/postgres          + 
           |          |           |            |            | postgres=CTc/postgres 
 template1 | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | =c/postgres          + 
           |          |           |            |            | postgres=CTc/postgres 
(4 строки)
Добавим роль (пользователя) nextcloud с правами на вход
postgres=# CREATE ROLE nextcloud WITH LOGIN;
CREATE ROLE
Посмотрим список ролей (пользователей)
postgres=# \du 
                                           Список ролей 
 Имя роли  |                                Атрибуты                                 | Член ролей  
-----------+-------------------------------------------------------------------------+------------ 
 nextcloud |                                                                         | {} 
 oc_admin  | Создаёт БД                                                              | {} 
 postgres  | Суперпользователь, Создаёт роли, Создаёт БД, Репликация, Пропускать RLS | {}
Добавим пароль пользователю nextcloud
postgres=# \password nextcloud
Введите новый пароль: вводим пароль
Повторите его: повторяем пароль
Назначим полные права на базу nextcloud пользователю ntxtcloud
postgres=# grant connect, create on database nextcloud to nextcloud;
GRANT
Выведем информацию о базе nextcloud
postgres=# \l nextcloud 
                                 Список баз данных 
    Имя    | Владелец | Кодировка | LC_COLLATE |  LC_CTYPE  |     Права доступа      
-----------+----------+-----------+------------+------------+----------------------- 
 nextcloud | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | postgres=CTc/postgres+ 
           |          |           |            |            | nextcloud=Cc/postgres 
(1 строка)
Выйдем из консоли PostgresQL
postgres=# \q

Всё хорошо. Необходимая база и пользователь созданы. Осталось проверить подключение к базе выполнив команду:

psql -U nextcloud -d nextcloud -h 127.0.0.1 -W
= вывод команды =
Пароль пользователя nextcloud: 
psql (9.6.6)
Введите "help", чтобы получить справку.


nextcloud-> \q

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

Установка NextCloud

Установка с исходных кодов с сайта разработчика производится в три этапа:

  1. Создание необходимых путей и загрузка файлов,
  2. Создание фала конфигурации Nginx для работы облачного ресурса,
  3. Внесение необходимых поправок в конфигурацию сервисов  для корректной работы NextCloud.

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

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

mkdir -p /var/www/nextcloud/{logs,upload,save}

Перейдем в папку и скачаем последнюю версию NextCloud:

cd /var/www/nextcloud
wget https://download.nextcloud.com/server/releases/nextcloud-12.0.3.zip

Распакуем:

unzip /var/www/nextcloud/nextcloud-12.0.3.zip -d /var/www/nextcloud

Переименуем:

mv /var/www/nextcloud/nextcloud /var/www/nextcloud/htdocs

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

chown -R nginx:nginx /var/www/nextcloud

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

Создадим файл для работы NextCloud под управлением сервиса Nginx:

В моем случае название ресурса будет cloud.sevo44.ru

vim /etc/nginx/conf.d/nextcloud.conf  
= необходимый код с пояснениями =
# nc.sevo44.ru 
    upstream php-handler { 
    #server 127.0.0.1:9000; 
    server unix:/run/php-fpm.socket; 
} 

server { 
    listen 80; 
    server_name cloud.sevo44.ru; 
    # Path to the root of your installation 
    root /var/www/nextcloud/htdocs/; 
    #Logs 
    access_log /var/www/nextcloud/logs/access.log main; 
    error_log /var/www/nextcloud/logs/error.log; 
 
    #Max upload size 
    client_max_body_size 10G; 
    fastcgi_buffers 64 4K; 
 
    # Enable gzip but do not remove ETag headers 
    gzip on; 
    gzip_vary on; 
    gzip_comp_level 4; 
    gzip_min_length 256; 
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; 
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json applicati
on/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json applic
ation/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vca
rd text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
   
    # Add headers to serve security related headers 
    # Before enabling Strict-Transport-Security headers please read into this 
    # topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    # includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header X-Robots-Tag none; 
    add_header X-Download-Options noopen; 
    add_header X-Permitted-Cross-Domain-Policies none; 
     
    location = /robots.txt { 
        allow all; 
        log_not_found off; 
        access_log off; 
    } 
 
    #Для получения сертификата ssl 
    location ~ /.well-known { 
               allow all; 
    } 
 
    # The following 2 rules are only needed for the user_webfinger app. 
    # Uncomment it if you're planning to use this app. 
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last; 
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json 
    # last; 
 
    location = /.well-known/carddav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
    location = /.well-known/caldav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
 
    location / { 
        rewrite ^ /index.php$uri; 
    } 
 
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { 
        deny all; 
    } 
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { 
        deny all; 
    } 
 
    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) { 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    #fastcgi_param HTTPS on; 
    #Avoid sending the security headers twice 
    fastcgi_param modHeadersAvailable true; 
    fastcgi_param front_controller_active true; 
    fastcgi_pass php-handler; 
    fastcgi_intercept_errors on; 
    fastcgi_request_buffering off; 
    } 
 
    location ~ ^/(?:updater|ocs-provider)(?:$|/) { 
    try_files $uri/ =404; 
    index index.php; 
    } 
 
    # Adding the cache control header for js and css files 
    # Make sure it is BELOW the PHP block 
    location ~ \.(?:css|js|woff|svg|gif)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    add_header Cache-Control "public, max-age=15778463"; 
    # Add headers to serve security related headers (It is intended to 
    # have those duplicated to the ones above) 
    # Before enabling Strict-Transport-Security headers please read into 
    # this topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    #  includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header X-Robots-Tag none; 
    add_header X-Download-Options noopen; 
    add_header X-Permitted-Cross-Domain-Policies none; 
    # Optional: Don't log access to assets 
    access_log off; 
    } 
 
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    # Optional: Don't log access to other assets 
    access_log off; 
    } 
}

Запрос getenv(«PATH») для NextCloud

Для избежания ошибки в последующем после установки NextCloud сразу внесем необходимое изменение. 

Определим пути в системе:

printenv PATH
= вывод команды =
/usr/x86_64-pc-linux-gnu/gcc-bin/5.4.0:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin

Отредактируем файл www.conf:

vim /etc/php/fpm-php7.0/fpm.d/www.conf
= необходимое изменение =
; При значении 5 на небольшой нагрузке можно получить ошибку 504
; в моем случае ошибка появлялась при просмотре фильмов
pm.max_children = 20
= необходимое дополнение =
;PHP был установлен неверно. Запрос getenv("PATH") возвращает пустые результаты.
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
;/PHP был установлен неверно. Запрос getenv("PATH") возвращает пустые результаты.

Параметры PHP OPcache для Nextcloud

Для избежания ошибки в последующем после установки NextCloud сразу внесем необходимое изменение. 

Внесем изменения в файл php.ini:

vim /etc/php/fpm-php7.0/php.ini
= необходимые дополнения =
[opcache] 
! В моём случае все параметры этого блока были отключены!
opcache.enable=1 
opcache.enable_cli=1 
opcache.interned_strings_buffer=8 
opcache.max_accelerated_files=10000 
opcache.memory_consumption=128 
opcache.save_comments=1 
opcache.revalidate_freq=1

После всех настроек перед непосредственном запуском установки NextCloud необходимо проверить, перезапустить Nginx и Php-fpm:

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 ]

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

Запуск установки NextCloud

Перед запуском установки необходимо прописать имя ресурса cloud.sevo44.ru работающего на ip адресе 192.168.0.141 в DNS сервер локальной сети или внести необходимые изменения в необходимый файл локальной машины для доступа к ресурсу. Для систем Linux дополнение вносятся в файл /etc/hosts:

vim /etc/hosts
= необходимое дополнение =
192.168.0.141 cloud.sevo44.ru

Получение SSL от Let`s Encrypt

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

Установка Let`s Encrypt для Calculate и Gentoo

Установим сам certbot обеспечивающий работу с сертификатами от Let`s Encrypt:

emerge --ask app-crypt/certbot

Установим расширения для получения сертификатов средствами nginx:

emerge --ask app-crypt/certbot-nginx

После успешной установки получим сертификат для нашего домена cloud.sevo44.ru:

Внимание! В моем варианте облачное хранилище уже настроено так чтобы доступ к ресурсу был как с локальной сети так и с интернета!Первый раз раз можно получить сертификат, используя временный веб сервер самого certbot (пункт 2), но после начала работы сайта придется повторить действие по получению сертификата для перенастройки файла отвечающего за автоматическое продление сертификата!

certbot certonly 
= вывод команды с пояснениями =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Nginx Web Server plugin - Alpha (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 3
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): info@sevo44.ru

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): cloud.sevo44.ru --- доменное имя на которое получаем
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for cloud.sevo44.ru

Select the webroot for cloud.sevo44.ru:
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for cloud.sevo44.ru: (Enter 'c' to cancel): /var/www/nextcloud/htdocs/ --- путь до корневой папки ресурса
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
 /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem
 Your key file has been saved at:
 /etc/letsencrypt/live/cloud.sevo44.ru/privkey.pem
 Your cert will expire on 2018-02-19. To obtain a new or tweaked
 version of this certificate in the future, simply run certbot
 again. To non-interactively renew *all* of your certificates, run
 "certbot renew"
 - If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
 Donating to EFF: https://eff.org/donate-le

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

Hello,

Your certificate (or certificates) for the names listed below will expire in
19 days (on 15 Dec 17 11:21 +0000). Please make sure to renew
your certificate before then, or visitors to your website will encounter errors.

webinar.sevo44.ru

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

Расположение файлов для работы SSL от Let’s Encrypt

Перейдем в папку с сервисом и выведем информацию о тот что находится в папке:

cd /etc/letsencrypt/ 
ls 
= вывод команды =
accounts  csr   live   renewal ssl-dhparams.pem 
archive  keys  options-ssl-nginx.conf  renewal-hooks

Назначение папок и файлов:

  • live — в этой папке находятся все необходимые файлы для работы ssl разбитые папками на каждый ресурс для которого получались ключи,
  • renewal — параметры которые будут использованы при продлении сертификата,
  • options-ssl-nginx.conf — необходимые параметры которые необходимо указать в файле настройки nginx,
  • ssl-dhparams.pem файл параметров Диффи-Хеллмана необходимый для лучшей безопасности при работе сайта с SSL.

Внимание! В случае если вам необходимо сменить тип получения сертификата необходимо запустить заново команду «certbot certonly» и указать необходимые параметры для нужного домена и файл отвечающий за параметры продления сертификата будет обновлен в папке renewal!

Автоматическое продление сертификатов Let’s Encrypt

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

certbot renew

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

certbot renew --dry-run

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

vim /etc/cron.d/cartboot
= вывод команды с необходимыми изменениями = 
# Получение сертификатов
30 4 * * 1 root /usr/bin/certbot renew >> /var/log/cron-renew.log
35 4 * * 1 root /etc/init.d/nginx reload

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

Файл лога будет выглядеть:

cat /var/log/cron-renew.log
= часть вывода команды =
--------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/cloud.sevo44.ru.conf
--------------------------------------------------------------------

--------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/office.sevo44.ru.conf
--------------------------------------------------------------------

--------------------------------------------------------------------

The following certs are not due for renewal yet:
 /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem (skipped)
 /etc/letsencrypt/live/office.sevo44.ru/fullchain.pem (skipped)
No renewals were attempted.

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

Файл настройки NextCloud для работы с SSL Nginx

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

vim /etc/nginx/conf.d/nextcloud.conf
= вывод команды c пояснениями =
# cloud.sevo44.ru 443 http2
    upstream php-handler { 
    #server 127.0.0.1:9000; 
    server unix:/run/php-fpm.socket; 
} 

server { 
    listen 80; 
    server_name cloud.sevo44.ru; 
    rewrite ^ https://$server_name$request_uri? permanent; 
} 
 
server { 
    # Работа сайта на ssl c включением протокола http2
    listen 443 ssl http2; 
    server_name cloud.sevo44.ru; 
    # Path to the root of your installation 
    root /var/www/nextcloud/htdocs/; 
    #Logs 
    access_log /var/www/nextcloud/logs/access.log main; 
    error_log /var/www/nextcloud/logs/error.log; 
 
    #Max upload size 
    client_max_body_size 10G; 
    fastcgi_buffers 64 4K; 
 
    # Enable gzip but do not remove ETag headers 
    gzip on; 
    gzip_vary on; 
    gzip_comp_level 4; 
    gzip_min_length 256; 
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth
; 
    gzip_types application/atom+xml application/javascript application/json appl
ication/ld+json application/manifest+json application/rss+xml application/vnd.ge
o+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-ap
p-manifest+json application/xhtml+xml application/xml font/opentype image/bmp im
age/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text
/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
     
    #Если самоподписной ssl 
    #ssl_certificate /etc/ssl/nginx/cloud.sevo44.loc.crt; 
    #ssl_certificate_key /etc/ssl/nginx/cloud.sevo44.loc.key; 
     
    #Для ssl 
    ssl_certificate /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/cloud.sevo44.ru/privkey.pem; 
    ssl_session_cache shared:le_nginx_SSL:1m; 
    ssl_session_timeout 1440m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_prefer_server_ciphers on; 
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE
-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA3
84:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA3
84:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDH
E-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-A
ES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-
AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA
:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-S
HA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
     
    # Add headers to serve security related headers 
    # Before enabling Strict-Transport-Security headers please read into this 
    # topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    # includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header X-Robots-Tag none; 
    add_header X-Download-Options noopen; 
    add_header X-Permitted-Cross-Domain-Policies none; 
     
    location = /robots.txt { 
        allow all; 
        log_not_found off; 
        access_log off; 
    } 
 
    #Для получения сертификата ssl 
    location ~ /.well-known { 
               allow all; 
    } 
 
    # The following 2 rules are only needed for the user_webfinger app. 
    # Uncomment it if you're planning to use this app. 
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last; 
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json 
    # last; 
 
    location = /.well-known/carddav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
    location = /.well-known/caldav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
 
    location / { 
        rewrite ^ /index.php$uri; 
    } 
 
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { 
        deny all; 
    } 
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { 
        deny all; 
    } 
 
    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|u
pdater/.+|ocs-provider/.+)\.php(?:$|/) { 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    #fastcgi_param HTTPS on; 
    #Avoid sending the security headers twice 
    fastcgi_param modHeadersAvailable true; 
    fastcgi_param front_controller_active true; 
    fastcgi_pass php-handler; 
    fastcgi_intercept_errors on; 
    fastcgi_request_buffering off; 
    } 
 
    location ~ ^/(?:updater|ocs-provider)(?:$|/) { 
    try_files $uri/ =404; 
    index index.php; 
    } 
 
    # Adding the cache control header for js and css files 
    # Make sure it is BELOW the PHP block 
    location ~ \.(?:css|js|woff|svg|gif)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    add_header Cache-Control "public, max-age=15778463"; 
    # Add headers to serve security related headers (It is intended to 
    # have those duplicated to the ones above) 
    # Before enabling Strict-Transport-Security headers please read into 
    # this topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    #  includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header X-Robots-Tag none; 
    add_header X-Download-Options noopen; 
    add_header X-Permitted-Cross-Domain-Policies none; 
    # Optional: Don't log access to assets 
    access_log off; 
    } 
 
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    # Optional: Don't log access to other assets 
    access_log off; 
    } 
}

Ресурсы проверки SSL и Http2 сайта

Проверим сторонними ресурсами как установился наш SSL-сертификат.

  • SSLChecker — cервис проверки настройки SSL,
  • SSLReport — сервис проверки SSL но более детальный.

Проверим работу http2 протокола:

  • HTTP/2 Test — сервис показывающий проверяющий работу http2.

Ротация логов сайта Nginx

Так как логи сайта выведены из стандартного места хранения логов и файл отвечающего за легирование сайтов уже нестроен, согласно предыдущей статьи LEMP сервер на Calculate Linux, то нам достаточно добавить одну строчку:

vim /etc/logrotate.d/sites 
= вывод команды с пояснениями =
# Указываем в каждой строчке необходимый сайт 
/var/www/pma/logs/*log 
/var/www/nextcloud/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 
}

Результат

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

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