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

FSYNCS мониторинг параметра в Proxmox

Мониторинг FSYNCS параметра в системе виртуализации Proxmox является одним из главных, так как сильно влияет на качество работы системы. Контролируя данный параметр в системе Zabbix можно оптимально настроить производительность дисковой системы сервера.

Введение

В системе Proxmox есть замечательный механизм проверки работы дисковой системы. Выполнив в консоли команду pveperf мы увидим полезную информацию о скорости работы жестких дисков. Основной параметр который показывает скорость работы с дисками это FSYNCS/SECOND.

Выведя man сервиса мы увидим всю информацию о требовании к нашему параметру.

man pveperf
= часть вывода команды =
FSYNCS/SECOND value should be greater than 200 (you should enable write back cache mode on you RAID controller - needs a battery backed cache (BBWC)).

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

Общий принцип мониторинга FSYNCS для Proxmox

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

  • Создаем скрипт bach который будет записывать нужное значение в текстовый файл;
  • Добавляем в cron задание которое будет с нужной нам периодичностью записывать показания в текстовый файл;
  • Добавляем необходимые параметры в агент Zabbix и проверяем правильность работы;
  • На сервере Zabbix для нужного узла добавляем все необходимые данные для контроля над параметром и настраиваем оповещение в случае плохих параметров.

Действия на Zabbix агенте

Команда для вывода нужных параметров FSYNCS

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

df -h
= часть вывода для ZFS =
rpool/ROOT/pve-1   99G    1001M    98G   1%   /

= часть вывода для mdadm =
/dev/md2           3,5T    1,2T    2,2T  35% /mnt/md2-raid10

Выводим информацию для нужного раздела.

Обязательно указываем в параметре куда смонтировано иначе не увидим параметр FSYNCS/SECOND.

pveperf /
= вывод команды =
CPU BOGOMIPS: 10044.86
REGEX/SECOND: 1168356
HD SIZE: 98.08 GB (rpool/ROOT/pve-1)
FSYNCS/SECOND: 85.84
DNS EXT: 67.40 ms
DNS INT: 1.44 ms (sevo44.loc)

pveperf /mnt/md2-raid10
= вывод команды =
CPU BOGOMIPS:      37241.08
REGEX/SECOND:      595252
HD SIZE:           3570.96 GB (/dev/md2)
BUFFERED READS:    165.42 MB/sec
AVERAGE SEEK TIME: 18.32 ms
FSYNCS/SECOND:     510.48
DNS EXT:           65.53 ms
DNS INT:           0.82 ms (sevo44.loc)

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

pveperf / | grep 'FSYNCS/SECOND' | cut -c20-24
= вывод команды =
81.52

Параметры имеют следующие значения:

  • pveperf / -сама команда с указанием куда смантирован раздел;
  • grep ‘FSYNCS/SECOND’ — выбираем только значения из строки с этими данныи;
  • cut -c20-24 — выводи знаки с 20 по 24 от начала строки.

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

mkdir /etc/zabbix/scripts

vim /etc/zabbix/scripts/fsyncs-bin.sh
= необходимые данные =
#!/bin/bash
pveperf / | grep 'FSYNCS/SECOND' | cut -c20-24 > /etc/zabbix/scripts/fsyncs.txt

По действию скрипта данные будут перезаписываться при каждом выполнении скрипта в файле /etc/zabbix/scripts/fsyncs.txt. Файл создавать не надо, так как при выполнении скрипта он создастся сам.

Сделаем файл запускаемым.

chmod +x /etc/zabbix/scripts/fsyncs-bin.sh

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

sh /etc/zabbix/scripts/fsyncs-bin.sh
= вывод пустой =

ls /etc/zabbix/scripts
= вывод команды =
fsyncs-bin.sh  fsyncs.txt

cat /etc/zabbix/scripts/fsyncs.txt
= вывод команды =
117.9

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

Добавляем скрипт в cron для выполнения по расписанию.

vim /etc/crontab
= необходимый код =
*/3 * * * * root /etc/zabbix/scripts/fsyncs-bin.sh >/dev/null 2>&1

Например, я запускаю скрипт каждые 3 минуты.

Добавление параметров для Zabbix агента

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

vim /etc/zabbix/zabbix_agentd.conf
= необходимый параметр =
UnsafeUserParameters=1

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

UserParameter=pve-1.fsyncs,cat /etc/zabbix/scripts/fsyncs.txt

Параметры имеют следующие значения:

  • UserParameter — параметр согласно которого агент понимает что с ним надо работать;
  • pve-1.fsyncs — название параметра который мы будем использовать при добавлении элемента данных;
  • cat /etc/zabbix/scripts/fsyncs.txt — команда и путь по которому брать данные.

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

vim /etc/zabbix/zabbix_agentd.conf 
= необходимый параметр = 
Timeout=15

Перезагружаем агент и проверим как он получает данные.

systemctl restart zabbix-agent

zabbix_get -s 127.0.0.1 -k pve-1.fsyncs
= вывод команды =
123.56

В случае получения ошибок

-bash: zabbix_get: command not found 
или
zabbix_get [20065]: Check access restrictions in Zabbix agent configuration

перейдите по ссылке и узнаете почему не работает zabbix_get.

Действия на сервере Zabbix

Добавление элемента данных

Открываем необходимый узел и перейдя в «Элементы данных» добавляем новый нажав «Создать элемент данных«.

Необходимо заполнить следующие поля:

  • Имя — pve-1 fsyncs zfs;
  • Ключ — pve-1.fsyncs;
  • Тип информации — Числовой (с плавающей точкой);
  • Интервал обновления — 5m;
  • Период хранения истории — 1w;
  • Группы элементов данных — Filesystem.

Добавление тригера

Открываем необходимый узел и перейдя в «Тригеры» добавляем новый нажав «Создать тригер«.

Необходимо заполнить следующие поля:

  • Имя тригера — pve-1 fsyncs zfs;
  • Выражение — {pve-1:pve-1.fsyncs.last()}<200.

Добавление графика

Открываем необходимый узел и перейдя в «Графики» добавляем новый нажав «Создать график«.

Например, мне нравится выводить все параметры  fsyncs для всех серверов в один график.

Заключение

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

Вот примерно такие графики вы можете наблюдать в период настройки.

Полезные ссылки:

Мониторинг температуры в Zabbix

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

Введение

Мониторинг температуры сервера это перовое что я обычно настраиваю сразу. Контролирую по максимуму все важные элементы.

Описание подойдёт для разных систем Linux. Более детально про установку и настройку Zabbix агентов для разных систем можно узнать в статье Zabbix agent установка и настройка.

Общий принцип мониторинга температуры

Для любой операционной системы необходимо выполнить 4 условия:

  1. Возможными способами извлечь данные с датчиков температуры нужного устройства;
  2. Обработать данные получив нужное значение;
  3. Передать полученное значение на сервер Zabbix;
  4. На сервере Zabbix добавить элемент данных, тригер и график.

Мониторинг температуры в системах Linux

Для примера я буду использовать систему Debian 10 Buster.

Мониторинг температуры CPU и Memory

Для получения данных о температуре будем применять утилиту  lm-sensors. Утилита очень популярна и присутствует во всех дистрибутивах Linux.

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

apt install lm-sensors

= Для CentOS 7 =
yum install lm_sensors

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

sensors-detect
= необходимые действия =
На все вопросы отвечаем Y

В конце спросит:
Do you want to add these lines automatically to /etc/modules? (yes/NO)
Отвечаем YES.

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

sensors
= вывод команды =
coretemp-isa-0001
Adapter: ISA adapter
Core 0: +81.0°C (high = +86.0°C, crit = +100.0°C)
Core 1: +77.0°C (high = +86.0°C, crit = +100.0°C)
Core 2: +73.0°C (high = +86.0°C, crit = +100.0°C)
Core 3: +73.0°C (high = +86.0°C, crit = +100.0°C)
i5k_amb-isa-0000
Adapter: ISA adapter
Ch. 0 DIMM 0: +75.5°C (low = +110.5°C, high = +124.0°C)
Ch. 0 DIMM 1: +71.0°C (low = +110.5°C, high = +124.0°C)
Ch. 0 DIMM 2: +63.5°C (low = +104.5°C, high = +124.0°C)
Ch. 0 DIMM 3: +64.5°C (low = +110.5°C, high = +124.0°C)
Ch. 1 DIMM 0: +74.5°C (low = +110.5°C, high = +124.0°C)
Ch. 1 DIMM 1: +77.0°C (low = +110.5°C, high = +124.0°C)
Ch. 1 DIMM 2: +69.0°C (low = +104.5°C, high = +124.0°C)
Ch. 1 DIMM 3: +60.0°C (low = +109.0°C, high = +124.0°C)
coretemp-isa-0000
Adapter: ISA adapter
Core 0: +83.0°C (high = +86.0°C, crit = +100.0°C)
Core 1: +79.0°C (high = +86.0°C, crit = +100.0°C)
Core 2: +77.0°C (high = +86.0°C, crit = +100.0°C)
Core 3: +77.0°C (high = +86.0°C, crit = +100.0°C)

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

В выводе мы видим следующие группы датчиков:

  • coretemp-isa-0001 — второй 4 ядерный процессор;
  • i5k_amb-isa-0000 — 8 модулей памяти;
  • coretemp-isa-0000 — первый 4 ядерный процессор.

Можно вывести показания одной группы датчиков.

sensors coretemp-isa-00000
= вывод команды =
coretemp-isa-0000
Adapter: ISA adapter
Core 0: +82.0°C (high = +86.0°C, crit = +100.0°C)
Core 1: +79.0°C (high = +86.0°C, crit = +100.0°C)
Core 2: +75.0°C (high = +86.0°C, crit = +100.0°C)
Core 3: +77.0°C (high = +86.0°C, crit = +100.0°C)

Команды для вывода нужных параметров

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

Например, в моем случае имеется 4 ядерный процессор который показывает температуры на каждом ядре. Можно передавать максимальное, минимальное или среднее значение.

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

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

Вывод минимального значения температуры
sensors | grep Core | awk -F'[:+°]' '{if(min==""){min=$3}; if($3<min) {min=$3};} END {print min}'

Вывод максимального значения температуры
sensors | grep Core | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

Вывод среднего значения температуры
sensors | grep Core | awk -F'[:+°]' '{avg+=$3}END{print avg/NR}'

Коды подсмотрел тут.

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

sensors coretemp-isa-00000 | grep 'Core 0' | cut -c16-17
=вывод команды =
65.45

Где параметры имеют следующее значение:

  • sensors — сама программа;
  • coretemp-isa-00000 — группа датчиков с которой выводить значение;
  • grep ‘Core 0’ — название параметра;
  • cut -c16-17 — выводит 16 и 17 знак с начала строки.

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

Вывод максимальной температуры для процессора имеющего группу датчиков coretemp-isa-0000
sensors coretemp-isa-0000 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

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

Вывод максимальной температуры из всех значений Ch. в строках 
sensors | grep Ch. | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

Вывод максимальной температуры из группу датчиков coretemp-isa-0000 
sensors i5k_amb-isa-0000 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

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

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

Добавление параметров для Zabbix агента

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

vim /etc/zabbix/zabbix_agentd.conf
= необходимый параметр =
UnsafeUserParameters=1

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

UserParameter=pve-t.core0,sensors coretemp-isa-00000 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'
UserParameter=pve-t.core1,sensors coretemp-isa-00001 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'
UserParameter=pve-t.memory,sensors i5k_amb-isa-0000 | awk -F'[:+°]' '{if(max==""){max=$3}; if(max<$3) {max=$3};} END {print max}'

Расшифрую первую строчку кода которая содержит следующие значения:

  • UserParameter — параметр согласно которого агент понимает что с ним надо работать;
  • pve-t.core0 — название параметра который мы будем использовать при добавлении элемента данных;
  • sensors coretemp-isa-00000 | awk -F'[:+°]’ ‘{if(max==»»){max=$3}; if(max<$3) {max=$3};} END {print max}’ — команда которой получается требуемое значение.

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

Для систем использующих Systemd команда перезапуска агента будет одинаковой. Например, для систем CentOS7, Debian 10 команда следующая:

systemctl restart zabbix-agent

Проверка получения значения Zabbix агентом

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

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

zabbix_get -s 127.0.0.1 -k pve-t.core0
= вывод команды =
65.25

Параметр работает и получает правильное значение.

В случае получения ошибок

-bash: zabbix_get: command not found 
или
zabbix_get [20065]: Check access restrictions in Zabbix agent configuration

перейдите по ссылке и узнаете почему не работает zabbix_get.

Переходим к настройкам на стороне Zabbix сервера.

Мониторинг температуры HDD и SSD

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

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

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

apt install hddtemp

Команды для вывода нужных параметров

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

lsblk
= вывод команды =
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931,5G 0 disk 
├─sda1 8:1 0 100M 0 part 
├─sda2 8:2 0 292,9G 0 part  
└─sda3 8:8 0 443G 0 part /mnt/sda8
sdb 8:16 0 119,2G 0 disk 
├─sdb1 8:17 0 7,5G 0 part [SWAP]
├─sdb2 8:18 0 954M 0 part /boot
└─sdb3 8:19 0 110,9G 0 part /

Из вывода видно что в системе есть два диска sda и sdb.

Выведем показание температуры для диска sda:

hddtemp /dev/sda
= вывод команды =
/dev/sda: ST3120811AS: 46°C

Команда для получения значений температуры будет такой:

hddtemp /dev/sda | cut -c24-25
= вывод команды =
46

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

  • hddtemp /dev/sda — утилита и диск с которого нужно получить значение;
  • cut -c24-25 — вывод 24 и 25 знака с начала строки.

Добавление параметров для Zabbix агента

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

vim /etc/zabbix/zabbix_agentd.conf
= необходимый параметр =
UnsafeUserParameters=1

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

UserParameter=pve-t.sda,hddtemp /dev/sda | cut -c24-25
UserParameter=pve-t.sdb,hddtemp /dev/sdb | cut -c24-25

Расшифрую первую строчку кода которая содержит следующие значения:

  • UserParameter — параметр согласно которого агент понимает что с ним надо работать;
  • pve-t.sda — название параметра который мы будем использовать при добавлении элемента данных;
  • hddtemp /dev/sda | cut -c24-25 — команда которой получается требуемое значение.

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

Для систем использующих Systemd команда перезапуска агента будет одинаковой. Например, для Debian 10 и CentOS 7 команда будет следующая:

systemctl restart zabbix-agent

Проверка получения значения Zabbix агентом

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

Перейдите по ссылке сможете узнаете почему Не работает zabbix_get.

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

zabbix_get -s 127.0.0.1 -k pve-t.sda
= вывод команды =
/dev/sda: open: Permission denied

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

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

ls -l /usr/sbin/hddtemp
= вывод команды =
-rwxr-xr-x 1 root root 40328 Jan 21 2018 /usr/sbin/hddtem

Из вывода видно что принадлежит она root и право запускать имеет только он.

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

chmod +s /usr/sbin/hddtemp

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

ls -l /usr/sbin/hddtemp
= вывод команды =
-rwsr-sr-x 1 root root 40328 Jan 21 2018 /usr/sbin/hddtemp

zabbix_get -s 127.0.0.1 -k pve-t.sda
= вывод команды =
45

Как видим данные успешно получены и значит переходим к настройкам на стороне Zabbix сервера.

Мониторинг температуры в системах Windows

Настроить мониторинг на системе Windows температурных параметров оказалось не просто. В большинстве случаев статьи в интернете описывают различные варианты использования программы Open Hardware Monitor а именно её консольной версии. На сайте разработчика я не нашел консольного варианта а скачивать с других сайтов считаю не целесообразно по разным причинам.

Программа позволяет создавать логи в формате csv и имеет веб лицо с выводом всех параметров. Возможно, как то использовать эти возможности, но ответа на этот вопрос я пока не нашел.

Поделитесь пожалуйста в комментариях своими вариантами мониторинга температур в системах Windows.

Действия на сервере Zabbix

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

Добавление элемента данных

Открываем необходимый узел и перейдя в «Элементы данных» добавляем новый нажав «Создать элемент данных«.

Необходимо заполнить следующие поля:

  • Имя — core0 Temperature;
  • Ключ — pve-t.core0;
  • Тип информации — Числовой (с плавающей точкой);
  • Интервал обновления — 1m;
  • Период хранения истории — 1w;
  • Группы элементов данных — CPU.

Добавление тригера

Открываем необходимый узел и перейдя в «Тригеры» добавляем новый нажав «Создать тригер«.

Необходимо заполнить следующие поля:

  • Имя тригера — pve-t core0 Temperature;
  • Выражение — {pve-t:pve-t.core0.last()}>80.

Выражение формируется на вкладке открывающейся по кнопке «Добавить» рядом с полем «Выражение«.

Добавление графика

Открываем необходимый узел и перейдя в «Графики» добавляем новый нажав «Создать график«.

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

По нажатию кнопки «Добавить» в параметре «Элемент данных» выбираем все необходимые элементы данных для отображения на графике.

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

На графике видно как менялись показания когда я подбирал оптимальное положение и тип вентиляторов.

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

Заключение

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

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

Zabbix agent установка и настройка

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

Введение

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

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

Действия на сервере Zabbix

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

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

Добавление узла сети в Zabbix

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

Для добавления узла сети идем по пути:

Настройка — Узлы сети — Создать узел сети

В поле «Имя узла сети» ставится значение которое указывается в настройках агента в поле «Hostname».

Для обычного агента:

Для активного агента:

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

Добавляем необходимый шаблон соответствующий операционной системе, устройству или службы .

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

Проверка получения данных с агента

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

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

Установка Zabbix Agent на Linux

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

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

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

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

Особое вниманию заостряю на порты работы агента Zabbix. На агенте должен быть открыт порт 10050 так как именно по нему Zabbix сервер будет пытаться получить данные с агента. В случае использования активного агента (агент сам отправляет данные на сервер Zabbix) должно быть разрешено исходящее подключения по порту 10051.

На сервере Zabbix должен быть открыть порт 10051.

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

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

Zabbix agent для CentOS 7

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

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

rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
= вывод команды =
Загружается https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
предупреждение: /var/tmp/rpm-tmp.W8KoVE: Заголовок V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Подготовка...                 ############################## [100%]
Обновление / установка...
1:zabbix-release-4.2-1.el7    ############################## [100%]

Очистим и пересоздадим кэш yum:

yum clean all
yum makecache

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

yum install zabbix-agent

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

firewall-cmd --permanent --zone=public --add-service=zabbix-agent

= применить изменения =
firewall-cmd --reload

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

В файле конфигурации агента /etc/zabbix/zabbix_agentd.conf необходимо указать  параметры для подключения к серверу Zabbix:

vim /etc/zabbix/zabbix_agentd.conf
= необходимые параметры c пояснениями =
Server=192.168.0.109 # IP адрес сервера Zabbix
ServerActive=192.168.0.109 # IP сервера Zabbix на который активный агент будет отправлять данные
Hostname=test # имя узла мониторинга, которое указано на сервере zabbix

При использовании Zabbix proxy необходимо указывать его IP адрес.

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

systemctl start zabbix-agent
systemctl enable zabbix-agent

Проверяем лог файл агента для CentOS 7 следующей командой:

cat /var/log/zabbix/zabbix_agentd.log
= вывод команды =
 14646:20190704:220547.611 Starting Zabbix Agent [Zabbix server]. Zabbix 4.2.4 (revision 059af02c82).
 14646:20190704:220547.613 **** Enabled features ****
 14646:20190704:220547.613 IPv6 support:          YES
 14646:20190704:220547.613 TLS support:           YES
 14646:20190704:220547.613 **************************
 14646:20190704:220547.614 using configuration file: /etc/zabbix/zabbix_agentd.conf
 14646:20190704:220547.616 agent #0 started [main process]
 14647:20190704:220547.624 agent #1 started [collector]
 14648:20190704:220547.632 agent #2 started [listener #1]
 14650:20190704:220547.639 agent #4 started [listener #3]
 14649:20190704:220547.643 agent #3 started [listener #2]
 14651:20190704:220547.653 agent #5 started [active checks #1]

Согласно выводу всё в порядке.

Zabbix agent для Debian

На сайте разработчика Zabbix на странице Скачать и установить Zabbix выбираем необходимый дистрибутив и версию.

В примере описан вариант установки и настройки Zabbix agent для операционной системы Debian 10 Buster.

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

wget https://repo.zabbix.com/zabbix/4.2/debian/pool/main/z/zabbix-release/zabbix-release_4.2-1+buster_all.deb
dpkg -i zabbix-release_4.2-1+buster_all.deb

Обновляем список пакетов:

apt update

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

apt install zabbix-agent

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

В файле конфигурации агента /etc/zabbix/zabbix_agentd.conf необходимо указать  параметры для подключения к серверу Zabbix:

vim /etc/zabbix/zabbix_agentd.conf
= необходимые параметры c пояснениями =
Server=192.168.0.109 # IP адрес сервера Zabbix
ServerActive=192.168.0.109 # IP сервера Zabbix на который активный агент будет отправлять данные
Hostname=test # имя узла мониторинга, которое указано на сервере zabbix

При использовании Zabbix proxy необходимо указывать его IP адрес.

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

systemctl enable zabbix-agent
systemctl restart zabbix-agent

Проверяем лог файл агента следующей командой:

cat /var/log/zabbix/zabbix_agentd.log
= вывод команды =
 14646:20190704:220547.611 Starting Zabbix Agent [Zabbix server]. Zabbix 4.2.4 (revision 059af02c82).
 14646:20190704:220547.613 **** Enabled features ****
 14646:20190704:220547.613 IPv6 support:          YES
 14646:20190704:220547.613 TLS support:           YES
 14646:20190704:220547.613 **************************
 14646:20190704:220547.614 using configuration file: /etc/zabbix/zabbix_agentd.conf
 14646:20190704:220547.616 agent #0 started [main process]
 14647:20190704:220547.624 agent #1 started [collector]
 14648:20190704:220547.632 agent #2 started [listener #1]
 14650:20190704:220547.639 agent #4 started [listener #3]
 14649:20190704:220547.643 agent #3 started [listener #2]
 14651:20190704:220547.653 agent #5 started [active checks #1]

Согласно выводу всё в порядке.

Установка Zabbix agent на XigmaNAS

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

ssh root@192.168.0.108
root@192.168.0.108's password: вводим пароль
Last login: Fri Jul 12 22:09:31 2019
Welcome to XigmaNAS!
nas: ~#

Еmbedded версия XigmaNAS

При использовании версии Еmbedded, вы должны понимать, что все изменения, которые вы производите в системе пропадут при перезапуске системы!

Обновляем пакеты:

pkg update

Выводим список всех возможных пакетов Zabbix:

pkg search zabbix

На момент написания статьи актуальная версия была 4.2.4:

pkg install zabbix42-agent-4.2.4

Активируем сервис как службу:

sysrc zabbix_agentd_enable=YES

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

cp /usr/local/etc/zabbix42/zabbix_agentd.conf.sample /usr/local/etc/zabbix42/zabbix_agentd.conf
ee /usr/local/etc/zabbix42/zabbix_agentd.conf
= необходимые параметры c пояснениями = 
Server=192.168.0.109 # IP адрес сервера Zabbix
ServerActive=192.168.0.109 # IP сервера Zabbix на который активный агент будет отправлять данные 
Hostname=test # имя узла мониторинга, которое указано на сервере zabbix

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

service zabbix_agentd start

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

tail -f /tmp/zabbix_agentd.log
= вывод команды =
2466:20190717:212904.511 IPv6 support: YES 
2466:20190717:212904.511 TLS support: YES 
2466:20190717:212904.511 **************************
2466:20190717:212904.511 using configuration file: /usr/local/etc/zabbix42/zabbix_agentd.conf 
2466:20190717:212904.513 agent #0 started [main process]
2467:20190717:212904.517 agent #1 started [collector]
2469:20190717:212904.542 agent #3 started [listener #2]
2468:20190717:212904.557 agent #2 started [listener #1]
2470:20190717:212904.565 agent #4 started [listener #3]
2471:20190717:212904.572 agent #5 started [active checks #1]

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

service zabbix_agentd status
= вывод команды =
zabbix_agentd is running as pid 1812.

Full версия XigmaNAS

Вначале выполняем действия как для Еmbedded версии.

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

service zabbix_agentd start
= вывод команды =
zabbix_agentd [30451]: user zabbix does not exist
zabbix_agentd [30451]: cannot run as root!

Ошибка говорит о том что пользователя Zabbix нет. Добавлять пользователя через консоль используя стандартные команды для FreeBSD не получится. Работать с пользователями и группами вы сможете только используя веб панель управления.

Добавте пользователя и группу Zаbbix через веб панель управления XigmaNAS. При добавлении пользователя обязательно сделайте ему домашней папку /var/run/zabbix.

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

chown -R zabbix:zabbix /var/run/zabbix
chown zabbix:zabbix /tmp/zabbix_agentd.log

После этого служба будет нормально стартовать после перезагрузки.

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

service zabbix_agentd start
= ошибка при отсутствии прав на лог файл =
zabbix_agentd [2455]: cannot open "/tmp/zabbix_agentd.log": [13] Permission denied

Установка Zabbix agent на Windows

Переходим на страницу загрузок Zabbix agent и скачиваем самую последнюю версию агента для Windows нужной разрядности.

Распаковываем архив. Создаем на диске С: папку zabbix и купируем туда следующие файлы:

  • zabbix_agentd.exe
  • zabbix_get.exe
  • zabbix_sender.exe
  • zabbix_agentd.conf

Открываем командную строку с правами администратора и выполняем следующую команду для установки zabbix agent на операционную систему Windows:

= код для копирования =
c:/zabbix/zabbix_agentd.exe --config c:/zabbix/zabbix_agentd.conf --install

Открываем файл zabbix_agentd.win.conf любым текстовым редактором (можно WordPAD) и изменяем следующие параметры:

с:/zabbix/zabbix_agenttd.conf
= необходимые параметры c пояснениями = 
LogFile=c:\zabbix\zabbix_agentd.log 
LogFileSize=1
Server=192.168.0.109 # IP адрес сервера Zabbix
ServerActive=192.168.0.109 # IP сервера Zabbix на который активный агент будет отправлять данные 
Hostname=test # имя узла мониторинга, которое указано на сервере zabbix

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

Дополнительные параметры — Правило для входящих подключений — Создать правило.

  • Тип правила: Для порта;
  • Протоколы и порты: Протокол TCP; Определенные локальные порты: 10050;
  • Действие: Разрешить подключение;
  • Профиль (ставим галочки): Доменный, Частный, Публичный;
  • Имя: Zabbix Agent 10050.

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

Дополнительные параметры — Правило для исходящих подключений — Создать правило.

  • Тип правила: Для порта;
  • Протоколы и порты: Протокол TCP; Определенные локальные порты: 10051;
  • Действие: Разрешить подключение;
  • Профиль (ставим галочки): Доменный, Частный, Публичный;
  • Имя: Zabbix Agent 10051.

Ищем службу с именем Zabbix agent в оснастке со службами запускаем ее.

Если все прошло успешно то в логе c:\zabbix\zabbix_agentd.log вы увидите примерно такую информацию:

3728:20190724:153807.390 Starting Zabbix Agent [test]. Zabbix 4.2.4 (revision 059af02).
3728:20190724:153807.394 **** Enabled features ****
3728:20190724:153807.397 IPv6 support: YES
3728:20190724:153807.400 TLS support: NO
3728:20190724:153807.402 **************************
3728:20190724:153807.406 using configuration file: c:\zabbix\zabbix_agentd.conf
3728:20190724:153807.410 agent #0 started [main process]
3448:20190724:153807.412 agent #1 started [collector]
5744:20190724:153807.441 agent #2 started [listener #1]
6856:20190724:153807.628 agent #3 started [listener #2]
6868:20190724:153807.766 agent #4 started [listener #3]
3532:20190724:153807.880 agent #5 started [active checks #1]

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

Возможные ошибки в работе

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

Периодические ошибки по сбору параметров

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

Timeout — параметр который отвечает за ожидание как на получение так и на отправку данных. По умолчанию выставлено значение в 3 секунды.

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

Timeout=10

Не работает zabbix_get

zabbix_get -s 127.0.0.1 -k pve-t.core1
= вывод команды =
-bash: zabbix_get: command not found

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

В новых версиях Zabbix утилита для опроса агентов вынесена в отдельный пакет zabbix-get и устанавливать её надо согласно командам применяемым в используемом дистрибутиве.

Debian 8-10
apt install zabbix-get

CentOS 7
yum install zabbix-get

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

zabbix_get -s 127.0.0.1 -k pve-t.core1
= вывод команды =
zabbix_get [20065]: Check access restrictions in Zabbix agent configuration

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

Теперь выполнив нужную команду вы увидите правильный ответ.

zabbix_get -s 127.0.0.1 -k pve-t.core1
= вывод команды =
65

Заключение

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

Установка Zabbix 4.2

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

Введение

Устанавливать систему мониторинга будем в контейнере LXC работающем на CentOS 7. Установка Zabbix в контейнере LXC для меня самый оптимальный вариант. Перед обновлением можно сделать снимок и в случае проблем очень оперативно вернуть систему в рабочее состояние.

Более подробно о том как развернуть систему контейнеров LXC на операционной системе CentOS 7 можно из статьи LXC установка на CentOS 7. Узнать как производится работа с контейнерами можно из статьи Работа с LXC контейнерами.

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

Подготовка системы для установки Zabbix

Отключение SELinux

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

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

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

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

Установка NGINX

Более детально о том как работать с Nginx вы можете из статьи NGINX установка и настройка.

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

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

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

systemctl start nginx
systemctl enable nginx

В нашем случае Nginx работает в контейнере LXC. Введем в консоли команду:

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

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

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

Как видим Nginx работает.

Установка PHP

Более детально о том как работать с PHP вы можете из статьи PHP от Remi для CentOS 7.

Устанавливать будет версию 7.2 используя репозиторий Remi. Для этого подключаем репозиторий remi и epel-release:

yum install epel-release
rpm -Uhv http://rpms.remirepo.net/enterprise/remi-release-7.rpm

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

yum install yum-utils
yum-config-manager --enable remi-php72

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

yum install php72 php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-bcmath

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

systemctl start php-fpm
systemctl enable php-fpm

Настроим работу php-fpm через unix сокет. Открываем необходимый конфиг и приведем его к следующему виду:

# vim /etc/php-fpm.d/www.conf
[www]
user = nginx
group = nginx

;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx

listen.allowed_clients = 127.0.0.1

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

slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache

Перезапускаем php-fpm:

systemctl restart php-fpm

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

ll /var/run/php-fpm/php-fpm.sock
= вывод команды =
srw-rw----. 1 nginx nginx 0 Oct  4 15:08 /var/run/php-fpm/php-fpm.sock

Все работает как надо.

Установка MariaDB

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

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

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

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

yum install MariaDB-server MariaDB-client

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

systemctl start mariadb
systemctl enable mariadb

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

/usr/bin/mysql_secure_installation

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

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

socket          = /var/lib/mysql/mysql.sock

innodb_file_format=barracuda
innodb_file_per_table=1
innodb_buffer_pool_size = 1G # установить примерно в 2 раза меньше объема оперативной памяти сервера
innodb_buffer_pool_instances=1
innodb_flush_log_at_trx_commit = 0
innodb_log_file_size = 512M
innodb_strict_mode = 0
innodb_log_files_in_group = 3

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

Перезапускаем MariaDB и проверяем статус работы:

systemctl restart mariadb
systemctl status mariadb.service

Установка Zabbix

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

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

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

rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
= вывод команды =
Загружается https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
предупреждение: /var/tmp/rpm-tmp.W8KoVE: Заголовок V4 RSA/SHA512 Signature, key ID a14fe591: NOKEY
Подготовка...               ################################# [100%]
Обновление / установка...
   1:zabbix-release-4.2-1.el7         ################################# [100%]

Очищаем и пересоздаем кэш yum:

yum clean all
yum makecache

Установка Zabbix сервера

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

yum install zabbix-server-mysql zabbix-web-mysql

Создание базы данных для Zabbix сервера

Создадим базу данных, пользователя zabbix и заполним базу необходимыми данными:

mysql -uroot -p
Enter password: указываем пароль root пользователя mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.14-MariaDB MariaDB Server

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

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

= создание бызы zabbix с необходимыми параметрами =
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.003 sec)

= создание пользователя zabbix с необходимиыми правами =
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'password';
Query OK, 0 rows affected (0.008 sec)

MariaDB [(none)]> exit
Bye

= заполнение базы данных необходимыми параметрами =
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
Enter password: пароль пользователя zabbix
root@zabbix-lxc-lemp.sevo44.loc / #

Редактируем файл конфигурации сервера Zabbix. Прописываем данные для подключения к БД и некоторые другие параметры:

vim /etc/zabbix/zabbix_server.conf
= необходимые данные =
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password
ListenIP=0.0.0.0
Timeout=10

Этих минимальных настроек достаточно, для работы сервера.

Параметр Timeout увеличен, так как он отвечает за время ожидания ответа от агента. Стандартного значения в 3 секунды бывает недостаточно, когда используется Zabbix proxy или скрипт который долго выполняется для получения метрики. В случае переодических отсутсвиях данных в графиках поиграйте с этим параметром.

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

systemctl start zabbix-server
systemctl enable zabbix-server

Проверяем лог файл на наличие ошибок.

cat /var/log/zabbix/zabbix_server.log
= вывод команды =
2373:20190416:222404.662 Starting Zabbix Server. Zabbix 4.2.0 (revision 91746).
  2373:20190416:222404.667 ****** Enabled features ******
  2373:20190416:222404.667 SNMP monitoring:           YES
  2373:20190416:222404.667 IPMI monitoring:           YES
  2373:20190416:222404.668 Web monitoring:            YES
  2373:20190416:222404.668 VMware monitoring:         YES
  2373:20190416:222404.669 SMTP authentication:       YES
  2373:20190416:222404.669 Jabber notifications:       NO
  2373:20190416:222404.670 Ez Texting notifications:  YES
  2373:20190416:222404.671 ODBC:                      YES
  2373:20190416:222404.671 SSH2 support:              YES
  2373:20190416:222404.672 IPv6 support:              YES
  2373:20190416:222404.672 TLS support:               YES
  2373:20190416:222404.673 ******************************
  2373:20190416:222404.673 using configuration file: /etc/zabbix/zabbix_server.conf
  2373:20190416:222404.720 current database version (mandatory/optional): 04020000/04020000
  2373:20190416:222404.721 required mandatory version: 04020000
  2373:20190416:222404.838 server #0 started [main process]
  2374:20190416:222404.846 server #1 started [configuration syncer #1]
  2375:20190416:222404.855 server #2 started [alerter #1]
  2379:20190416:222404.865 server #6 started [timer #1]
  2377:20190416:222404.872 server #4 started [alerter #3]
  2378:20190416:222404.882 server #5 started [housekeeper #1]
  2376:20190416:222404.891 server #3 started [alerter #2]
  2380:20190416:222404.899 server #7 started [http poller #1]
  2381:20190416:222404.907 server #8 started [discoverer #1]
  2393:20190416:222404.916 server #20 started [poller #4]
  2395:20190416:222404.934 server #22 started [unreachable poller #1]
  2384:20190416:222404.944 server #11 started [history syncer #3]
  2399:20190416:222404.954 server #26 started [trapper #4]
  2387:20190416:222405.009 server #14 started [proxy poller #1]
  2386:20190416:222405.018 server #13 started [escalator #1]
  2388:20190416:222405.030 server #15 started [self-monitoring #1]
  2389:20190416:222405.041 server #16 started [task manager #1]
  2390:20190416:222405.051 server #17 started [poller #1]
  2407:20190416:222405.064 server #34 started [lld manager #1]
  2392:20190416:222405.077 server #19 started [poller #3]
  2394:20190416:222405.089 server #21 started [poller #5]
  2409:20190416:222405.119 server #36 started [lld worker #2]
  2383:20190416:222405.152 server #10 started [history syncer #2]
  2396:20190416:222405.160 server #23 started [trapper #1]
  2385:20190416:222405.172 server #12 started [history syncer #4]
  2398:20190416:222405.187 server #25 started [trapper #3]
  2397:20190416:222405.198 server #24 started [trapper #2]
  2400:20190416:222405.208 server #27 started [trapper #5]
  2401:20190416:222405.215 server #28 started [icmp pinger #1]
  2403:20190416:222405.225 server #30 started [preprocessing manager #1]
  2402:20190416:222405.233 server #29 started [alert manager #1]
  2391:20190416:222405.241 server #18 started [poller #2]
  2408:20190416:222405.252 server #35 started [lld worker #1]
  2382:20190416:222405.260 server #9 started [history syncer #1]
  2406:20190416:222406.068 server #33 started [preprocessing worker #3]
  2404:20190416:222406.104 server #31 started [preprocessing worker #1]
  2405:20190416:222406.135 server #32 started [preprocessing worker #2]

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

Настройка Nginx

Так как в контейнере будет работать только Zabbix мы отредактируем дефолтный файл приведя его к виду:

vim /etc/nginx/conf.d/default.conf
= необходимый код =
server {
    listen       80;
    server_name  zabbix.sevo44.loc;
    root /usr/share/zabbix;

    location / {
    index index.php index.html index.htm;
    }

    location ~ \.php$ {
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param PHP_VALUE "
    max_execution_time = 300
    memory_limit = 128M
    post_max_size = 16M
    upload_max_filesize = 2M
    max_input_time = 300
    date.timezone = Europe/Moscow
    always_populate_raw_post_data = -1
    ";
    fastcgi_buffers 8 256k;
    fastcgi_buffer_size 128k;
    fastcgi_intercept_errors on;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
        }
}

Проверим конфиг на ошибки и если все в порядке, перезапустим Nginx:

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

= перезапустим nginx =
nginx -s reload

Настройка Nginx на хосте LXC

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

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

vim /etc/nginx/conf.d/proxy-zabbix.sevo44.loc.conf
= необходимый код =
# ssl zabbix.sevo44.loc
#server {
#listen 80;
#server_name zabbix.sevo44.loc www.zabbix.sevo44.loc;
#rewrite ^ https://$server_name$request_uri? permanent;
#}

server {
listen 80;
#listen 443 ssl http2;
server_name zabbix.sevo44.loc www.zabbix.sevo44.loc;

### ssl
#ssl on;
#ssl_certificate /etc/letsencrypt/live/zabbix.sevo44.loc/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/live/zabbix.sevo44.loc/privkey.pem;
#ssl_session_timeout 5m;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_dhparam /etc/ssl/certs/dhparam.pem;
#ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
#ssl_prefer_server_ciphers on;
#ssl_session_cache shared:SSL:10m;

#location /.well-known/acme-challenge/ {
#root /var/www/ssl/zabbix.sevo44.loc/;
#}

# Включение сжатия GZIP
# Если используется NGINX proxy надо настраивать на нём!!!
gzip on;
gzip_static on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;
gzip_comp_level 6;
gzip_proxied any;
gzip_min_length 1000;
gzip_disable "msie6";
gzip_vary on;

location / {
proxy_pass http://10.10.0.6:80;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
# Вставил ниже когда было ограничение на зугрузку файлов свыше 1 метра
# так же нужна строчка в файле настройки сайта
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

Проверим конфиг на ошибки и если все в порядке, перезапустим Nginx:

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

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

Настройка Zabbix для работы с Nginx

Важный нюанс. Надо изменить права доступа на некоторые папки. Назначить владельца nginx. Этот шаг нужно будет проделывать после каждого обновления php или zabbix. Связано с тем, что по-умолчанию zabbix идет в комплекте с apache и рассчитан на работу с ним. Поэтому после установки или обновления, он делает его владельцем директории /etc/zabbix/web.

chown -R nginx:nginx /var/lib/php/session
chown -R nginx:nginx /etc/zabbix/web

Настройка DNS для работы с сервером Zabbix

Осталось добавить домен в DNS или как к моем случае добавим строчку в файл /etc/hosts на компьютере с которого будем открыват

vim /etc/hosts
= необходимый параметр =
192.168.0.103 zabbix.sevo44.loc

Порты работы Zabbix

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

В система Zabbix используется два порта:

  • 10050 — порт по которому zabbix опрашивает клиентов (пасивный агент);
  • 10051 — порт на котором zabbix получает данные от активных клиентов (активный агент).

На сервере Zabbix должен быть открыт порт 10051, на клиенте порт 10050.

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

= открыть порт 10051 =
firewall-cmd --permanent --zone=public --add-service=zabbix-server

= применить изминения =
firewall-cmd --reload

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

Настройка Zabbix внешнего интерфейса

Переходим к настройки web лица. Вводим в браузере доменое имя нашего сервера Zabbix, в моем случае это http://zabbix.sevo44.loc

Видим страницу приветствия.

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

Указываем данные для работы с сервером MariaDB.

Детали Zabbix сервера можно не менять.

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

Окно авторизации Zabbix сервера.

Стандартная учетная запись для входа в web интерфейс zabbix следующая:

  • Admin — пользователь;
  • zabbix — пароль.

После авторизации вы увидите стандартный dashboard.

 

Установка и настройка Zabbix сервера закончена.

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

Заключение

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

В следующих статьях я детально расскажу:

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

Работа с 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.