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

Работа с 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 контейнерами стала будничной.

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.

Duplicity для бэкапа VDS

Настроим резервное копирование сервера VDS с помощью утилиты duplicity на операционной системе CentOS 7. Для хранения резервных копий будем использовать Yandex Disk. Бэкапы защитим с помощью надежного шифрования OpenPGP. Возможность автоматического создания архивов.

Введение

В статье «Backup надежный и безопасный» в примере мы рассмотрели как настроить резервное копирование файлов и базы данных сайтов, но для полного спокойствия этого мало. Как правило, ресурсы предоставляющие VDS не делают резервных копий и заботится о безопасности приходится самим владельцам VDS. Мне гораздо спокойней перед любыми действиями с сервером создать полную резервную копию. Сюрпризы после обновления или настройкой могут вывести сервер из работы. Без резервной копии придется  потратить много времени и нервов для восстановления работы сервера.

Установка Duplicity

Ознакомиться более детально с работой, настройкой и возможностями сервиса вы можете на официальном сайте производителя.

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

yum -y install epel-release

Установим Duplicity без вопросов:

yum -y install duplicity

Создания ключа OpenPGP

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

Создадим необходимый ключ выполнив команду:

gpg --gen-key
= вывод команды с пояснениями. Часть информации удалена. =
Выберите требуемый тип ключа:
 (1) RSA and RSA (default)
 (2) DSA and Elgamal
 (3) DSA (только для подписи)
 (4) RSA (только для подписи)
Ваш выбор (?-подробнее)? 1
ключи RSA могут иметь длину от 1024 до 4096 бит.
Какой размер ключа необходим? (2048) 
Запрашиваемый размер ключа 2048 бит
Выберите срок действия ключа.
 0 = без ограничения срока действительности
 <n> = срок действительности n дней
 <n>w = срок действительности n недель
 <n>m = срок действительности n месяцев
 <n>y = срок действительности n лет
Ключ действителен до? (0) 
Ключ не имеет ограничения срока действительности
Все верно? (y/N) y
GnuPG необходимо составить UserID в качестве идентификатора ключа.
Ваше настоящее имя: sevo44
Email-адрес: test@sevo44.ru
Комментарий: duplicity-backup
Вы выбрали следующий User ID:
 "sevo44 (duplicity-backup) <test@sevo44.ru>"
Сменить (N)Имя, (C)Комментарий, (E)email-адрес или (O)Принять/(Q)Выход? o
Для защиты секретного ключа необходима фраза-пароль.
!!! Ввводим пароль 2 раза и не забываем его !!!

gpg: ключ 37D34631 помечен как абсолютно доверяемый.
открытый и закрытый ключи созданы и подписаны.
pub 2048R/37D34631 2017-05-08
Отпечаток ключа = 0AFF 9E2E 52DB 7ED2 480D 5DE2 971F 83F8 37D3 4631
uid sevo44 (duplicity-backup) <info@sevo44.ru>
sub 2048R/C5730EC9 2017-05-08

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

Вот наш ID ключа 37D34631 который мы и будем использовать.

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

Подключение Yandex disk

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

yum -y install davfs2

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

mkdir /mnt/ydisk_backup_vds

Подключим Yandex Disk:

mount -t davfs https://webdav.yandex.ru /mnt/ydisk_backup_vds/
= вывод команды =
 Please enter the username to authenticate with server
 https://webdav.yandex.ru or hit enter for none.
 Username: test@sevo44.ru
 Please enter the password to authenticate user test@sevo44.ru with server
 https://webdav.yandex.ru or hit enter for none.
 Password: ********
 /sbin/mount.davfs: Warning: can't write entry into mtab, but will mount the file system anyway

Для отмантирования диска:

umount /mnt/ydisk_backup_vds

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

mcedit /etc/davfs2/secrets
= необходимые данные для добавления =
# Данные для подключения к Yandex Disk
/mnt/ydisk_backup_vds/ test@sevo44.ru password

Теперь при подключении не будет запроса логина и пароля.

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

mkdir /restore

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

Работа с Duplicity

Рассмотрим основные моменты работы с сервисом.

Ручное создание архивов

Можно настроить автоматическое монтирование Yandex Diska при загрузке сервера указав нужные параметры в файл /etc/fstab.  Мне кажется это не разумно, но как именно настраивать решать только вам.

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

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

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

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

duplicity --encrypt-key=37D34631 --exclude=/restore --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/tmp --exclude=/var/spool --exclude=/var/cache --exclude=/var/tmp --exclude=/swap / file:///mnt/ydisk_backup_vds/backup_vds
= вывод команды =
Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
 Время последней полной резервной копии: нету
 Сигнатуры не найдены, переключение на полную резервную копию.
 !!!! Процесс не быстрый, ждем !!!!
-------------[ Статистика резервного копирования ]-------------
 StartTime 1494264679.29 (Mon May 8 20:31:19 2017)
 EndTime 1494264988.55 (Mon May 8 20:36:28 2017)
 ElapsedTime 309.26 (5 minutes 9.26 seconds)
 SourceFiles 43662
 SourceFileSize 1504877467 (1.40 GB)
 NewFiles 43662
 NewFileSize 1504877467 (1.40 GB)
 DeletedFiles 0
 ChangedFiles 0
 ChangedFileSize 0 (0 bytes)
 ChangedDeltaSize 0 (0 bytes)
 DeltaEntries 43662
 RawDeltaSize 1481346284 (1.38 GB)
 TotalDestinationSizeChange 627905129 (599 MB)
 Errors 0

Распакуем все что есть в папку restore:

duplicity --encrypt-key=37D34631 --file-to-restore / file:///mnt/ydisk_backup_vds/backup_vds /restore
 = вывод команды =
 Локальные и удалённые метаданные синхронизированы, синхронизация не требуется.
 Время последней полной резервной копии: Mon May 8 20:42:33 2017
 Кодовая фраза GnuPG: тот пароль что указывали при генерации ключа!

После появления строки приглашения консоли проверяем папку restore.

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

duplicity --encrypt-key=37D34631 --file-to-restore etc file:///mnt/ydisk_backup_vds/backup_vds /restore/etc

Полуавтоматическое создание архивов

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

Создадим скрипты для бэкапа и восстановления в папку restore.

mcedit /root/duplicity_bakup.sh
 = необходимые данные =
 #!/bin/sh
 # Монтируем Yandex.Disk
 mount -t davfs https://webdav.yandex.ru /mnt/ydisk_backup_vds/
 # Создаем резервную копию
 duplicity --encrypt-key=37D34631 --exclude=/restore --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/tmp --exclude=/var/spool --exclude=/var/cache --exclude=/var/tmp --exclude=/swap / file:///mnt/ydisk_backup_vds/backup_vds
 # Отключаем Yandex.Disk
 umount /mnt/ydisk_backup_vds/
mcedit /root/duplicity_restore.sh
 = необходимые данные =
 #!/bin/sh
 # Монтируем Yandex.Disk
 mount -t davfs https://webdav.yandex.ru /mnt/ydisk_backup_vds/
 # Распаковываем архив в папку restore
 duplicity --encrypt-key=37D34631 --file-to-restore / file:///mnt/ydisk_backup_vds/backup_vds /restore
 # Отключаем Yandex.Disk
 umount /mnt/ydisk_backup_vds/

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

chmod +x /root/duplicity_bakup.sh
chmod +x /root/duplicity_restore.sh

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

Для постоянного автоматического резервного копирование можно добавить строчку в /etc/crontab и копии будет создаваться по расписанию.

Проверка и удаление архивов

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

duplicity collection-status --encrypt-key=37D34631 file:///mnt/ydisk_backup_vds/backup_vds/
= вывод команды =
 Синхронизация удалённых метаданных с локальными временными файлами...
 Время последней полной резервной копии: Tue May 9 11:49:43 2017
 Состояние сбора
 -----------------
 Соединение с внутренним интерфейсом: BackendWrapper
 Папка архива: /root/.cache/duplicity/7662853acae7adf7fc3957d15d7c9b58

Найдено 0 вторичных цепочек резервных копий.

Найдена первичная цепочка резервного копирования с соответствующей цепочкой подписи:
 -------------------------
 Цепочка начата: Tue May 9 11:49:43 2017
 Цепочка завершена: Tue May 9 11:49:43 2017
 Количество содержащихся наборов резервного копирования: 1
 Общее число содержащихся томов: 4
 Тип резервной копии: Время: Число томов:
 Полная Tue May 9 11:49:43 2017 4
 -------------------------
 Отсутствуют изолированные или неполные наборы резервного копирования.

Удаление всех резервных копий кроме последней:

duplicity --encrypt-key=37D34631 remove-all-but-n-full 1 --force file:///mnt/ydisk_backup_vds/backup_vds/

Удаление копий старше 1 месяца:

duplicity --encrypt-key=37D34631 remove-older-than 1M file:///mnt/ydisk_backup_vds/backup_vds/

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

Результат

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

ProFTPd или доступ по FTP к сайту

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

Введение

Периодически возникает необходимость  давать доступ к файлам сайта для веб разработчиков или других пользователей. Так как используется VDS сервер с настроенным функционалом на базе Nginx, то все права на файлы при добавлении и изменении должны быть как у указанного сервиса. Вначале пытался настроить vsftpd но функционал позволяет настроить только права на редактируемые файлы чтобы они оставались такие как были но вот все новые были с правами пользователя. Поэтапно опишу все действия которые привели меня к желаемому результату.

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

Подготовка CentOS 7

Подключим репозиторий Еpel:

yum -y install epel-release

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

yum -y install mc openssl net-tools htop yum-utils

Отключим SELinux:

mcedit /etc/sysconfig/selinux
= необходимые изменения =
SELINUX=disabled

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

setenforce 0

Настройка FirewallD

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

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

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

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

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

yum -y install firewalld

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

systemctl enable firewalld
systemctl start firewalld

Проверим статус короткой командой:

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

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

Открытие портов для работы по ftp

Добавим порты в FirewallD:

firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --permanent --zone=public --add-port=49000-55000/tcp

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

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

Проверим:

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

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

Установим сервер ftp:

yum install proftpd proftpd-utils

Создание файловой базы пользователей ProFTPd

Узнаем ID пользователя и группы Nginx, так как именно под этими данными и должны работать наши пользователи:

cat /etc/passwd
= вывод команды. Необходимая информация =
 nginx:x:996:994:nginx user:/var/cache/nginx:/sbin/nologin

Создадим файл /etc/ftpd.passwd и добавим туда пользователя sevo44 c id пользователя 996 uid и группой 994 gid и домашним каталогом /web/sites/sevo44.ru/www

ftpasswd --passwd --file=/etc/ftpd.passwd --name=sevo44 --uid=996 --gid=994 --home=/web/sites/sevo44.ru/www --shell=/bin/false
 = вывод команды =
 ftpasswd: using alternate file: /etc/ftpd.passwd
 ftpasswd: creating passwd entry for user sevo44

ftpasswd: /bin/false is not among the valid system shells. Use of
 ftpasswd: "RequireValidShell off" may be required, and the PAM
 ftpasswd: module configuration may need to be adjusted.
 Password: -- вводим пароль
 Re-type password: -- повторяем пароль

ftpasswd: entry created

Откроем и посмотрим файл базы пользователей:

cat /etc/ftpd.passwd
= вывод команды =
 sevo44:$1$HpmDikdn$.3vuwu56cjTvdg8qtrsy//:996:994::/web/sites/sevo44.ru/www:/bin/false

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

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

ftpasswd --passwd --name=sevo44 --change-password

Включение Ban листа и возможность подключения по TLS

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

mcedit /etc/sysconfig/proftpd
= Необходимая информация для размещения =
PROFTPD_OPTIONS="-DDYNAMIC_BAN_LISTS -DTLS"

Если параметр -DTLS включен то без наличия правильно созданного сертификата сервис не стартует. В случае работы без TLS просто не указывайте параметр.

Получение сертификата для TLS подключения

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

openssl req -new -x509 -days 365 -nodes -out \
/etc/pki/tls/certs/proftpd.sert.pem -keyout \
/etc/pki/tls/certs/proftpd.key.pem
= вывод команды с пояснениями =
 Generating a 2048 bit RSA private key
 ................................+++
 .........+++
 writing new private key to '/etc/pki/tls/certs/proftpd.key.pem' -- Путь где будет находится ключ
 -----
 You are about to be asked to enter information that will be incorporated
 into your certificate request.
 What you are about to enter is what is called a Distinguished Name or a DN.
 There are quite a few fields but you can leave some blank
 For some fields there will be a default value,
 If you enter '.', the field will be left blank.
 -----
 Country Name (2 letter code) [XX]:RU -- Буквенный код Страны
 State or Province Name (full name) []:Kostroma state -- Область проживания
 Locality Name (eg, city) [Default City]:Kostroma -- Город
 Organization Name (eg, company) [Default Company Ltd]:SEVO44 -- Название организации
 Organizational Unit Name (eg, section) []: -- Название отдела в организации
 Common Name (eg, your name or your server's hostname) []:sevo44.ru -- Доменное имя сервера
 Email Address []:info@sevo44.ru -- адрес электронной почты

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

Редактирование proftpd.conf

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

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

cp /etc/proftpd.conf /etc/proftpd.conf.orig
mcedit /etc/proftpd.conf
= вывод команды с необходимыми комментариями =
ServerName "FTP server"
ServerIdent on "FTP Server ready."
ServerAdmin root@localhost
DefaultServer on
# По умолчанию используется 21 в случае замены используйте параметр ниже
# Внимание! Не забудьте дать доступ!
#Port 21111

# Изолировать каждого пользователя FTP, в своем домашнем каталоге
DefaultRoot ~

# Отключили и добавили строки для того чтобы шла авторизация только пользователей с файла /etc/ftpd.passwd
#AuthPAMConfig proftpd
#AuthOrder mod_auth_pam.c* mod_auth_unix.c
AuthOrder mod_auth_file.c
#Модуль авторизации по файлу грузится сам и включать его не надо 
#LoadModule mod_auth_file.c
AuthUserFile /etc/ftpd.passwd
RequireValidShell off
AuthPAM off
#RootLogin off
#Диапазон пассивных портов необходимых для работы
PassivePorts 49000 55000

# Не делать обратного DNS-запроса
UseReverseDNS off

# Для предотвращения DOS-атак, установить максимальное количество дочерних процессов
# до 20. Если вам нужно, чтобы позволить более 20 одновременных подключений
# на один раз, просто увеличьте это значение. Обратите внимание, что это работает только
# в автономном режиме, в то inetd режим следует использовать в inetd сервера
# что позволяет ограничить максимальное количество процессов на обслуживание
# (например, xinetd)
MaxInstances 20

# Отключить функция sendfile по умолчанию, так как это нарушает отображение скорости загрузки в
# ftptop и ftpwho
UseSendfile off

# Настройки видов записи и типы логирования
# Define the log formats
LogFormat default "%h %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
ExtendedLog /var/log/proftpd/all.log ALL default
ExtendedLog /var/log/proftpd/access.log READ,WRITE default
ExtendedLog /var/log/proftpd/auth.log AUTH auth
ServerLog /var/log/proftpd/server.log
SystemLog /var/log/proftpd/system.log
TransferLog /var/log/proftpd/transfer.log
DebugLevel 9

# Обеспечить внешнюю кэш SSL-сессии с использованием разделяемой памяти
# (contrib/mod_tls_shmcache.html)
LoadModule mod_tls_shmcache.c

# TLS
#LoadModule mod_tls.c
<IfDefine TLS>
TLSEngine on
# В случае ON подключиться можно только по TLS
TLSRequired on
TLSRSACertificateFile /etc/pki/tls/certs/proftpd.sert.pem
TLSRSACertificateKeyFile /etc/pki/tls/certs/proftpd.key.pem
TLSCipherSuite ALL:!ADH:!DES
TLSOptions NoCertRequest
TLSVerifyClient off
#TLSRenegotiate ctrl 3600 data 512000 required off timeout 300
TLSLog /var/log/proftpd/tls.log
<IfModule mod_tls_shmcache.c>
TLSSessionCache shm:/file=/var/run/proftpd/sesscache
</IfModule>
</IfDefine>

# Динамические списки блокировки
# Включение параметром PROFTPD_OPTIONS=-DDYNAMIC_BAN_LISTS 
#в /etc/sysconfig/proftpd
<IfDefine DYNAMIC_BAN_LISTS>
LoadModule mod_ban.c
BanEngine on
BanLog /var/log/proftpd/ban.log
BanTable /var/run/proftpd/ban.tab

# Если же клиент достигает предела MaxLoginAttempts 2 раза
# в течение 10 минут, автоматически добавить запрет для клиента, что
# истекает через один час.
BanOnEvent MaxLoginAttempts 2/00:10:00 01:00:00

# Информировать пользователя о том, что он попал в бан
BanMessage "Машина %a иннна для доступа по FTP"

# Разрешить FTP и админ вручную добавить/удалить щелбаны
BanControlsACLs all allow user ftpadm
</IfDefine>

# Установить сетевые специфические "качества обслуживания" (QoS) и биты на пакеты, используемые
# на сервере (contrib/mod_qos.html)
<IfDefine QOS>
LoadModule mod_qos.c
# RFC791 TOS parameter compatibility
QoSOptions dataqos throughput ctrlqos lowdelay
# For a DSCP environment (may require tweaking)
#QoSOptions dataqos CS2 ctrlqos AF41
</IfDefine>

# Глобальной конфигурации - конфигурации, общие для Настройки сервера и виртуальных Хостов
<Global>

#Значение umask 022-хороший стандарт umask, чтобы предотвратить новые каталоги и файлы
# от группы и для
Umask 022

# Разрешить пользователям перезаписать файлы, а также изменять разрешения
AllowOverwrite yes
<Limit ALL SITE_CHMOD>
AllowAll
</Limit>
</Global>

Управление сервером ProFTPd

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

systemctl enable proftpd
systemctl start proftpd

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

systemctl status proftpd
 ● prоftpd.service - PrоFTPD FTP Server
 Loaded: loaded (/usr/lib/systemd/system/prоftpd.service; enabled; vendor preset: disabled)
 Active: active (running) since Вт 2017-04-25 21:18:12 MSK; 4min 24s ago
 Main PID: 23220 (prоftpd)
 CGroup: /system.slice/prоftpd.service
 └─23220 prоftpd: (accepting connections)

апр 25 21:18:12 centos7.sevo44.loc systemd[1]: Starting PrоFTPD FTP Server...
 апр 25 21:18:12 centos7.sevo44.loc systemd[1]: Started PrоFTPD FTP Server.

Сервис в автозагрузке и никаких ошибок нет.

Проверим порт на котором работает сервис:

netstat -tulpn | grep proftpd
 tcp6 0 0 :::21 :::* LISTEN 2658/prоftpd: (acce

Консольные утилиты статуса ProFTPd

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

ftptop

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

 ftpwho

Логи сервиса

Все логи вы можете посмотреть в папке /var/log/proftpd. Ротация логов работает но вы можете это проверить и настроить на примере раздела «Ротация логов сайта» в статье » Virtual Hosts на web-сервере NGINX»

Подключение по FTP c использованием TLS

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

Настройка:

 

Информация TLS:

Вывод

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

Fail2ban защита сайта от взлома

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

Введение

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

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

Меня начали проверять почти сразу. Пользуясь случаем хочу передать привет товарищу Токарчуку Александру Степановичу с IP адреса которого упорно хотели попасть в админку моего сайта. Почему то пытаются войти, в моем случае, как правило с Украины.

Советую сразу смените путь к админке сайта с помощью iThemes Security. По умолчанию путь в WordPress домен/wp-admin и именно сюда все боты и лезут… Поленился я сразу сменить и боты стали ломится каждую минуту и причем в своем большинстве используя Российские ip адреса. Путь сменил, но они всё равно ломятся по стандартному пути…

Ошибка входа в админку

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

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

91.200.12.91 - - [10/Apr/2017:10:02:22 +0300] "POST /wp-login.php HTTP/1.1" 200 2884 "https://sevo44.ru/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36" "2.79"
91.200.12.91 - - [10/Apr/2017:10:02:23 +0300] "POST /wp-login.php HTTP/1.1" 200 2884 "https://sevo44.ru/wp-login.php" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36" "2.79"

Согласно этим строчкам 2 раза неудачно авторизовались.

iThemes Security для WordPress

Для популярного движка WordPress существует свободный плагин iThemes Security для защиты сайта. Не буду останавливаться на рассмотрении настройки, покажу лишь как он показывает ошибки авторизации.

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

При нажатии на ip мы увидим информацию о координатах этого адреса:

У меня как обычно Украина. Нажмем на ISP: PP SKS-Lugan и увидим более детальную информацию:

Можно делать с этой информацией всё что угодно и тут всё в вашей власти.

Моя задача сделать так чтобы данные пользователи блокировались для всего моего VDS хостинга, а не только для сайта работающего на WordPress c защитой iThemes Security. Для этого и надо настроить Fail2ban.

Настройка Fail2ban

Установка

Устанавливать и настраивать будем для системы CentOS 7, хотя и для других систем, с учетом специфики операционной системы, данное описание подойдёт.

Установим:

yum install fail2ban

Конфигурационный файл настройки находится здесь — /etc/fail2ban/jail.conf, но, как сказано в комментариях файла, данный файл рекомендуется не изменять.

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

Отправка почты на внешний e-mail адрес

Настроим чтобы письма root пересылались на нужную нам внешнюю e-mail почту.

Открываем файл /etc/aliases и внесем изменения:

mcedit /etc/aliases
=необходимые изменения=
# Person who should get root's mail
root:info@sevo44.ru

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

newaliases

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

echo «test» | mail -s Testmail root

Если в выводе будет -bash: mail: команда не найдена то надо установить пакет:

= Для CentOS = 
yum install mailx
= Для Debian =
apt-get install mailutils

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

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

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

cat /var/log/maillog
= вывод команды с необходимыми значениями =
Apr 10 22:57:03 ih378645 postfix/smtp[29844]: D56B64957: to=<info@sevo44.ru>, orig_to=<root>, relay=mx.yandex.ru[87.250.250.89]:25, delay=0.57, delays=0.02/0/0.03/0.52, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued on mxfront10g.mail.yandex.net as 1491854223-b3qP5cuV0Mf-v2CaUBlk)

Работа с почтой Postfix

Перестала приходить почта от f2b о блокировке желающих войти в админку сайта.

Вот количество ip которое стремительно увеличивалось:

fail2ban-client status sites-sevo44ru
= вывод команды =
Status for the jail: sites-sevo44ru
|- Filter
| |- Currently failed: 0
| |- Total failed: 11
| `- File list: /web/sites/sevo44.ru/log/access.log
`- Actions
 |- Currently banned: 207
 |- Total banned: 207
 `- Banned IP list: 109.105.190.219 109.124.100.250 109.126.225.137 109.162.93.73 109.171.22.62 109.172.55.2 109.188.64.73 109.188.85.234 109.195.183.85 109.198.171.226 109.60.155.212 109.75.193.0 109.75.202.103 128.74.71.66 145.255.3.225 145.255.3.243 145.255.3.39 159.224.11.242 173.232.219.176 173.236.184.110 173.236.184.142 173.236.184.143 176.49.40.127 176.59.41.30 176.62.69.118 177.204.153.95 177.207.148.119 178.122.111.64 178.129.238.101 178.155.4.80 178.161.237.69 178.205.188.253 178.207.227.23 178.252.205.27 178.57.63.25 178.65.133.157 178.67.130.123 178.68.173.206 178.72.91.190 185.180.229.142 185.25.19.134 185.3.35.46 185.30.88.107 185.30.88.76 185.41.212.207 185.71.82.158 188.0.188.181 188.115.138.206 188.123.230.206 188.126.38.199 188.134.15.152 188.16.110.197 188.162.229.113 188.162.40.42 188.232.43.178 188.235.141.43 188.254.110.230 188.254.43.218 188.255.13.56 188.32.71.98 188.43.36.22 188.52.174.121 193.107.0.34 193.107.151.221 193.169.32.59 194.135.247.146 194.15.117.19 195.191.83.66 195.3.245.253 195.93.144.120 2.36.191.127 2.60.185.142 212.116.102.42 212.164.46.108 212.175.77.165 212.20.45.184 213.138.90.164 213.155.204.122 213.87.137.135 213.87.224.201 213.87.224.214 213.87.96.210 216.185.103.189 217.118.91.62 217.150.50.69 217.23.186.38 222.149.235.211 31.130.91.37 31.131.85.19 31.132.160.196 31.132.183.250 31.47.116.134 31.6.119.56 31.7.224.10 31.7.237.76 36.73.140.126 37.113.130.68 42.145.226.174 46.0.106.28 46.164.199.44 46.172.208.41 46.236.129.182 46.242.14.3 46.36.18.111 46.39.230.246 46.39.244.115 46.39.49.133 46.47.7.2 46.99.3.32 5.18.172.193 5.206.236.28 5.228.255.64 5.76.127.100 62.109.179.58 62.112.118.38 62.183.86.39 64.111.127.38 64.34.217.217 67.234.216.197 69.163.216.123 77.222.100.87 77.246.225.66 77.34.10.29 77.40.56.179 77.51.62.109 77.66.146.104 77.72.121.70 78.106.172.62 78.107.234.199 78.153.25.244 78.159.238.91 78.24.5.142 78.36.120.180 79.122.230.190 79.165.123.222 80.251.112.200 80.67.249.55 80.80.162.44 81.1.212.101 81.20.199.41 81.28.176.111 82.114.68.235 83.167.101.207 83.174.223.180 84.22.36.50 84.234.50.77 85.175.143.185 85.95.191.186 86.62.123.82 87.117.26.218 88.147.152.131 88.147.152.7 88.147.231.208 88.205.217.250 89.106.198.59 89.188.124.197 89.237.29.174 90.188.6.161 90.189.223.253 91.144.149.126 91.205.46.26 91.207.245.253 91.229.204.2 93.157.168.19 93.185.17.122 93.185.30.26 93.78.108.179 93.94.234.110 94.180.44.52 94.228.207.139 94.233.62.22 94.24.244.182 94.25.176.210 94.25.177.184 94.25.179.100 94.29.124.183 94.29.124.189 94.50.197.139 94.75.60.240 95.106.193.177 95.137.159.251 95.141.233.82 95.152.4.216 95.153.132.246 95.159.138.245 95.159.164.155 95.188.128.213 95.190.112.163 95.24.6.152 95.30.25.120 95.32.12.236 95.32.123.249 95.71.51.84 95.72.22.198 95.78.113.238 95.78.19.212 5.138.196.107 176.8.76.170 178.75.42.126 83.149.44.111 46.61.76.189 5.76.199.41 82.138.49.236 85.234.6.34 178.205.122.253 79.120.80.50 77.222.99.126

В логах обнаружил сообщение о превышении лимита на отправку сообщений:

cat /var/log/maillog
= вывод команды с необходимыми значениями =
May 5 12:48:32 ih378656 postfix/smtp[12576]: 3111D5EE9: to=<dolotov44@yandex.ru>, orig_to=<root@localhost>, relay=mx.yandex.ru[93.158.134.89]:25, conn_use=23, delay=12862, delays=12859/3.1/0.07/0.06, dsn=4.5.1, status=deferred (host mx.yandex.ru[93.158.134.89] said: 451 4.5.1 The recipient <dolotov44@yandex.ru> has exceeded their message rate limit. Try again later. 1493977712-W6SydoLQur-mWE8thiK (in reply to end of DATA command))
May 5 12:48:32 ih378656 postfix/smtp[12563]: 2E9A05F20: host mx.yandex.ru[87.250.250.89] said: 451 4.5.1 The recipient <dolotov44@yandex.ru> has exceeded their message rate limit. Try again later. 1493977712-LwxkdR0eGu-mWD4A8YU (in reply to end of DATA command)

Посмотрим количество сообщений в очереди postfix:

mailq | grep Request
= вывод команды =
-- 5811 Kbytes in 1888 Requests.

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

Посмотрим с каких почтовых ящиков очередь:

mailq|grep ^[A-F0-9] |cut -c 42-80| sort | uniq -c| sort -n
= вывод команды =
1888 f2b@ih378656.vds.myihor.ru

Вся очередь состоит из писем с сервиса fail2ban.

Сбросим всю очередь:

postsuper -d ALL
= вывод команды =
postsuper: Deleted: 1888 messages

Основной файл настройки

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

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Файл настройки большой, поэтому я покажу только настройки что я менял. Откроем файл и внесем нужные исправления и добавления:

mcedit /etc/fail2ban/jail.local
= вывод команды с необходимыми изменениями =
# "bantime" это количество секунд запрета
# 1 week = 604800
bantime = 604800
# Время работы параметра "maxretry"
# seconds.
findtime = 600
# "maxretry" количество попыток до бана
maxretry = 3
#
# ACTIONS
#
# Действия при срабатывании правил.
# Адрес электронной почты получателя
destemail = root@localhost
# Адрес отправителя
sender = f2b
# Выбрать действие по умолчанию. Чтобы изменить, просто переопределить значение 'действие' s
# Всего 3 вида действия
# action_ только запрет
# action_mw запретить и отправить по электронной почте с whois доклад destemail 
# action_mwl запретить и отправить по электронной почте с whois отчет и соответствующие строки журнала
action = %(action_mwl)s

# Свои фильтры для защиты
# Название блока используемое при работе с сервисом
[sites-sevo44ru]
# Включение правила
enabled = true
# Какие порты блокируются
port = http,https
# Название файла фильтра
filter = sites-sevo44ru
# Путь до лог файла который анализируется
logpath = /web/sites/sevo44.ru/log/access.log
# Количество неудачных попыток до блокировки
maxretry = 3
# Период блокировки -- вечная. Иногда лучше использовать и такое :)
#bantime = -1

Обращаю особое внимание на строку action = %(action_mwl)s. Если хотите получать оповещения на почту обязательно правильно укажите этот параметр и настройте оповещение на необходимый почтовый ящик.

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

Если укажите чтобы на почту приходила информация с whois докладом в письме можете увидеть missing whois program установите необходимое выполнив команду:

yum install jwhois

Теперь в сообщениях на почту будет приходить детальная информация об ip адресе блокируемого.

Файл фильтра

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

mcedit /etc/fail2ban/filter.d/sites-sevo44ru.conf
= необходимые параметры =
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php

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

В одном из фильтров я использую код ^<HOST> .*base64_decode который блокирует всех кто пытается использовать эту кодировальную хренодрянь.

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

fail2ban-regex /web/sites/sevo44.ru/log/access.log /etc/fail2ban/filter.d/sites-sevo44ru.conf
= вывод информации =

Running tests
=============

Use failregex filter file : sites-wpsevo44ru, basedir: /etc/fail2bаn
Use log file : /web/sites/wp.sevo44.ru/log/access.log
Use encoding : UTF-8

Results
=======
Failregex: 309 total
|- #) [# of hits] regular expression
| 1) [309] ^<HOST> .* "POST /wp-login.php
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
| [77612] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-

Lines: 77612 lines, 0 ignored, 309 matched, 77303 missed
[processed in 16.01 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 77303 lines

Видим что в нашем логе 309 срабатываний правила.

Можно вывести информация обо всех этих строчках:

fail2ban-regex /web/sites/wp.sevo44.ru/log/access.log /etc/fail2ban/filter.d/sites-wpsevo44ru.conf --print-all-matched
= вывод информации =
Running tests
=============

Use failregex filter file : sites-wpsevo44ru, basedir: /etc/fail2ban
Use log file : /web/sites/sevo44.ru/log/access.log
Use encoding : UTF-8

Results
=======
Failregex: 309 total
|- #) [# of hits] regular expression
| 1) [309] ^<HOST> .* "POST /wp-login.php
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
| [77618] Day(?P<_sep>[-/])MON(?P=_sep)Year[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-
Lines: 77618 lines, 0 ignored, 309 matched, 77309 missed
[processed in 15.31 sec]

|- Matched line(s):
| 185.34.244.250 - - [05/Mar/2017:13:11:24 +0300] "POST /wp-login.php HTTP/2.0" 200 2208 "https://sevo44.ru/wp-login.php?redirect_to=https%3A%2F%2Fsevo44.ru%2Fwp-admin%2F&reauth=1" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "2.27"
| 185.34.244.250 - - [05/Mar/2017:13:11:30 +0300] "POST /wp-login.php HTTP/2.0" 302 955 "https://sevo44.ru/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "-"
= часть информации скрыта =

Автозагрузка и запуск сервиса

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

systemctl enable fail2ban
systemctl start fail2ban

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

systemctl restart fail2ban

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

Для полной уверенности посмотрим статус:

systemctl status fail2ban
● fail2bаn.service - Fail2Bаn Service
 Loaded: loaded (/usr/lib/systemd/system/fail2bаn.service; enabled; vendor preset: disabled)
 Active: active (running) since Пн 2017-04-10 23:23:47 MSK; 2min 20s ago
 Docs: man:fail2ban(1)
 Process: 30794 ExecStop=/usr/bin/fail2bаn-client stop (code=exited, status=0/SUCCESS)
 Process: 30830 ExecStart=/usr/bin/fail2bаn-client -x start (code=exited, status=0/SUCCESS)
 Main PID: 30834 (fail2ban-server)
 CGroup: /system.slice/fail2bаn.service
 └─30834 /usr/bin/python2 -s /usr/bin/fail2bаn-server -s /var/run/fail2ban/fail2bаn.sock -p /var/run/fail2ban/fail2bаn.pid -x -b

апр 10 23:23:46 ih378645.vds.myihor.ru systemd[1]: Starting Fail2Ban Service...
апр 10 23:23:47 ih378645.vds.myihor.ru fail2ban-client[30830]: 2017-04-10 23:23:47,141 fail2bаn.server [30832]: INFO Starting ...v12.45.668
апр 10 23:23:47 ih378645.vds.myihor.ru fail2ban-client[30830]: 2017-04-10 23:23:47,141 fail2bаn.server [30832]: INFO Starting ...n mode
апр 10 23:23:47 ih378645.vds.myihor.ru systemd[1]: Started Fail2Ban Service.
Hint: Some lines were ellipsized, use -l to show in full.

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

Главный файл настройки

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

cat /etc/fail2ban/fail2ban.conf
= вывод команды с пояснениями =
# Где лежат логи 
logtarget = /var/log/fail2ban.log

Ротация логов сервиса

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

mcedit /etc/logrotate.d/fail2ban.conf
= вывод команды с необходимыми изменениями =
/var/log/fail2bаn.log {
 daily
 rotate 30
 missingok
 compress
 postrotate
 /usr/bin/fail2ban-client flushlogs 1>/dev/null || true
 endscript
}

Мне удобней чтобы ротация проходила каждый день и хранилась 30 дней.

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

logrotate /etc/logrotate.conf

Работа с сервисом

Выведем информацию о работающих фильтрах:

fail2ban-client status
= вывод команды =
Status
|- Number of jail: 1
`- Jail list: sites-sevo44ru

Видим что активен один фильтр.

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

fail2ban-client status sites-sevo44ru
= вывод команды =
Status for the jail: sites-sevo44ru
|- Filter
| |- Currently failed: 0
| |- Total failed: 4
| `- File list: /web/sites/sevo44.ru/log/access.log
`- Actions
 |- Currently banned: 1
 |- Total banned: 4
 `- Banned IP list: 92.53.96.68

Видим что всего было 4 срабатывания и 1 IP что заблокирован.

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

fail2ban-client set sites-sevo44ru banip 91.200.12.91
= вывод команды =
91.200.12.91

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

fail2ban-client set sites-sevo44ru unbanip 91.200.12.91
= вывод команды =
91.200.12.91

Осталось окончательно убедится что сервис работает. Посмотрим текущие правила iptables:

iptables -L -v -n
= вывод команды. только интересующая нас часть =
Chain f2b-sites-sevo44ru (1 references)
 pkts bytes target prot opt in out source destination 
 0 0 REJECT all -- * * 91.200.12.91 0.0.0.0/0 reject-with icmp-port-unreachable
 0 0 REJECT all -- * * 92.53.96.68 0.0.0.0/0 reject-with icmp-port-unreachable
18949 3413K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

Всё отлично. В выводе команды видим заблокированные ip адреса.

Результат

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

Web сервер CentOS 7

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

Введение

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

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

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

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

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

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

Настройка FirewallD

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

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

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

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

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

yum -y install firewalld

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

systemctl enable firewalld
systemctl start firewalld

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

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

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

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

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

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

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

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

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

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

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

Проверим:

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

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

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

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

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

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

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

Установка

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

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

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

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

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

yum install -y nginx

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

systemctl enable nginx

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

systemctl start nginx

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

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

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

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

yum -y install net-tools

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

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

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

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

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

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

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

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

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

reboot

Проверяем:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

systemctl reload nginx
или
nginx -s reload

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

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

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

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

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

Установка

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

yum install -y mariadb mariadb-server

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

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

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

systemctl start mariadb.service

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

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

mysql_secure_installation

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Установка PHP 5.6

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

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

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

php -v
-bash: php: command not found

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

systemctl enable php-fpm.service

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

systemctl start php-fpm.service

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

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

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

Выведем статус сервиса:

systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
 Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
 Active: active (running) since Чт 2017-03-23 04:59:50 MSK; 2 days ago
- часть вывода не указана -

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

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

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

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

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

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

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

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

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

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

 

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

Результат

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