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

PHP от Remi для CentOS

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

Введение

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

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

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

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

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

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

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

yum install epel-release

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

dnf install epel-release

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

для CentOS 7

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

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

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

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

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

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

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

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

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

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

yum install yum-utils

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

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

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

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

для CentOS 8

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

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

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

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

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

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

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

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

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

для CentOS 7

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

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

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

yum install php72

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

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

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

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

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

для CentOS 8

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

systemctl start php-fpm
systemctl enable php-fpm

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

systemctl restart php-fpm

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

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

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

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

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

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

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

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

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

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

systemctl stop php-fpm

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

systemctl enable php-fpm

Вывод

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

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

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

Введение

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

Установка CentOS 8

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

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

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

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

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

Образы iso CentOS 8

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

  1. CentOS-8-x86_64-1905-dvd1.iso — полный образ 7G;
  2. CentOS-8-x86_64-1905-boot.iso  — загрузочный образ 550M.

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

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

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

Указывать надо путь к той папке, где лежит каталог repodata. Например, mirror.yandex.ru/centos/8/BaseOS/x86_64/os/.

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

Шаблоны

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

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

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

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

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

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

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

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

SWAP

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

Настройка CentOS 8

Пакетный менеджер DNF

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

По прежнему можно вносить команды yum вместо dnf и всё будет работать. Для yum сделан алиас для запуска dnf.

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

dnf
= вывод части команды =
usage: dnf [options] COMMAND

Список основных команд:
alias                     List or create command aliases
autoremove                удалить все ненужные пакеты, первоначально установленные по зависимостям
check                     поиск проблем в packagedb
check-update              проверить доступные обновления для пакетов
clean                     удалить кэшированные данные
deplist                   Показывать список зависимостей пакета и какие пакеты их предоставляют
distro-sync               обновить установленные пакеты до последних имеющихся версий
downgrade                 Откат к предыдущей версии пакета
group                     показать или использовать информацию о группах
help                      отобразить подсказку по использованию
history                   отобразить (или использовать) историю транзакций
info                      отобразить информацию о пакете или группе пакетов
install                   установка пакета(ов) в систему
list                      вывести список пакетов или групп пакетов
makecache                 создание кэша метаданных
mark                      отметить или снять отметку пользовательской установки с установленных пакетов.
module                    Взаимодействие с репозиторием Modules.
provides                  найти пакет по заданному значению
reinstall                 переустановка пакета
remove                    удалить пакет или пакеты из системы
repolist                  отобразить настроенные репозитории ПО
repoquery                 поиск пакетов по ключевому слову
repository-packages       выполнить команды над всеми пакетами заданного репозитория
search                    поиск информации о пакете по заданной строке
shell                     запустить интерактивную оболочку DNF
swap                      запустить интерактивный вариант dnf для удаления и установки одной спецификации
updateinfo                показать рекомендации к пакетам
upgrade                   обновить пакет или пакеты в системе
upgrade-minimal           обновление, но только «новейших» пакетов, которые исправляют проблему в вашей системе

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

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

uname -a
= вывод команды = 
Linux localhost.localdomain 4.18.0-80.11.2.el8_0.x86_64 #1 SMP Tue Sep 24 11:32:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

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

Отключение SELinux

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

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

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

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

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

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

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

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

dnf -y install epel-release

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

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

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

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

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

dnf update

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

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

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

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

dnf install dnf-automatic

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

systemctl list-timers *dnf-*
= вывод команды =
NEXT                        LEFT      LAST PASSED UNIT          ACTIVATES
Thu 2019-10-24 14:36:56 MSK 5min left n/a  n/a    dnf-makecache.timer dnf-makecache.service

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

cat /etc/systemd/system/multi-user.target.wants/dnf-makecache.timer
= вывод команды =
[Unit]
Description=dnf makecache --timer
ConditionKernelCommandLine=!rd.live.image
# See comment in dnf-makecache.service
ConditionPathExists=!/run/ostree-booted
Wants=network-online.target

[Timer]
OnBootSec=10min
OnUnitInactiveSec=1h
Unit=dnf-makecache.service

[Install]
WantedBy=multi-user.target

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

systemctl enable --now dnf-automatic.timer

Настройка этого таймера будет по пути — /etc/systemd/system/multi-user.target.wants/dnf-automatic.timer.

Настройка системы автоматического обновления находится по пути  /etc/dnf/automatic.conf. По-умолчанию он только скачивает обновления, и отправляет сообщение на почту root.

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

  • default — полное обновление;
  • security — только обновление безопасности.

Мой вариант настройки выглядит следующим образом:

vim /etc/dnf/automatic.conf
= часть вывода с пояснениями
[commands]
# What kind of upgrade to perform:
# default = all available upgrades
# security = only the security upgrades
upgrade_type = security
random_sleep = 0

# To just receive updates use dnf-automatic-notifyonly.timer

# Whether updates should be downloaded when they are available, by
# dnf-automatic.timer. notifyonly.timer, download.timer and
# install.timer override this setting.
download_updates = yes

# Whether updates should be applied when they are available, by
# dnf-automatic.timer. notifyonly.timer, download.timer and
# install.timer override this setting.
apply_updates = no

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

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

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

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

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

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

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

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

systemctl status postfix

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

dnf install postfix

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

systemctl start postfix
systemctl enable postfix

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

dnf 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 
compatibility_level = 2
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/samples
readme_directory = /usr/share/doc/postfix/README_FILES

smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
smtpd_tls_security_level = may
smtp_tls_CApath = /etc/pki/tls/certs
smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
meta_directory = /etc/postfix
shlib_directory = /usr/lib64/postfix

# 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!

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

dnf -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

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

timedatectl set-timezone Europe/Moscow

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

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

dnf 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 8 уделяю особое внимание настройки сетевых параметров. Кроме того, на странице настройки сетевых параметров указывается название хоста.

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

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

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

В CentOS 8, сеть управляется только через Network Manager. Сетевые настройки лучше выполнять с помощью утилиты nmtui.

Руками вся настройка сводится к редактированию файлов в паке /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 выполнив команду:

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

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

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

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

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

Брандмауэр FirewallD

По умолчанию в системе CentOS 8 используется брандмауэр FirewallD.

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

Ниже я выполню необходимые действия не описывая всё подробно.

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

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: cockpit 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: cockpit 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

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

dnf -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

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

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

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

dnf -y install vim

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

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

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

[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.

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

Установка Tmux

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

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

dnf install tmux

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

Cockpit: Веб-интерфейс управления сервером CentOS 8

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

При авторизации по ssh вы увидите следующее сообщение:

Activate the web console with: systemctl enable --now cockpit.socket

Достаточно выполнить команду в консоли systemctl enable —now cockpit.socket и при следующей авторизации вы увидите следующее сообщение:

Web console: https://localhost:9090/ or https://192.168.0.252:9090/

Порт 9090 должен быть открыт. Работающий по умолчанию сервис cockpit в FirewallD открывает этот порт.

При вводе в браузере https://192.168.0.252:9090 увидите приглашение ввести данные авторизации.

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

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

Единственное что я делаю это то что не держу её включенной. Убираю из автозагрузки в самой панели управления или командой:

systemctl disable cockpit.socket

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

systemctl start cockpit.socket
systemctl stop cockpit.socket

Вывод

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

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

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.

Tmux терминальный менеджер

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

Введение

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

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

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

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

Установка Tmux

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

CentOS 7
yum install tmux

Debian
apt install tmux

Calculate Linux
emerge -av tmux

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

Вывод информации об установленной версии:

tmux -V
= вывод команды =
tmux 1.8

Более подробно про программу можно почитать на  Wikipedia или на странице разработки.

Работа с Tmux

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

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

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

man tmux

Управление сессиями

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

tmux list-commands

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

Создание сессии:

= Создание сессии Tmux =
tmux

= Создание сессии с названием  sevo44 =
tmux new -s sevo44

= Информация о работающих сессиях Tmux =
tmux ls
= вывод команды =
0: 1 windows (created Mon Dec 10 10:48:09 2018) [150x33]
sevo44: 1 windows (created Mon Dec 10 10:48:23 2018) [150x33]

= Переименование сессии 0 в sevo44-2 =
tmux rename-session -t 0 sevo44-2

Подключение к сессии:

= Подключение к последней сессии =
tmux a

= Подключение к сессии использую имя или номер =
tmux attach -t sevo44

Удаление сессии:

= Удаление сессии по номеру или имени =
tmux kill-session -t sevo44

= Удаление все сессий =
tmux kill-server

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

При работе в сессии Tmux существует понятие «Префикс» это то что переводит его в командный режим.

По умолчанию префикс «CTRL + b».

Префикс всегда набираем перед введением любой команды ниже!

Основные команды:

Функция Команда
Вывести справку по всем командам ?
Выйти из сесиии d
Закрыть сессию x
Скролинг [ для выхода из режима q

Команды для работы с панелями:

Функция Команда
Разделить текущую панель на две, по вертикали Shift + %
Разделить текущую панель на две, по горизонтали Shift + » (на клавиатуре слева от Enter)
Переход между панелями →←↑↓
Изменить размеры панели Alt + →←↑↓
Закрыть панель x (или набрать exit)

Команды для работы с закладками (окнами):

Функция Команда
Создание закладки с
Переименование закладки ,
Вывод всех закладок для перехода w
Закладка вперед n
Закладка назад p
Удалить закладку x

Настройка Tmux под себя

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

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

Моя версия такая:

tmux -V
= вывод команды =
tmux 3.1c

Сменим префикс с «CTRL + b» на «CTRL + а» и добавим возможность прокручивать колесиком на мышке:

vim ~/.tmux.conf
= необходимые параметры =
set -g prefix C-a
unbind C-b
bind C-a send-prefix

set -g mouse on

Перезагрузите tmux.conf с помощью команды:

$ tmux source-file ~/.tmux.conf

Вывод

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

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

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

Введение

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

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

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

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

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

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

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

usermod -aG sevo44.ru nginx

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

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

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

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

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

systemctl restart sshd

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

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

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

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

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

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

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

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

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

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

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

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

tail -n 10 /var/log/secure

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

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

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

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

logrotate /etc/logrotate.conf

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

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

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

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

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

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

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

nginx -t
systemctl reload nginx
systemctl restart php-fpm

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

Заключение

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

Debian 8 установка и настройка

Установим одну из самых стабильных операционных систем linux Debian 8. Настроим учитывая основные требования системного администратора. Нужна стабильность в работе? Выбирайте этот дистрибутив OC Linux. Самая большая база программ и огромное сообщество.

Предисловие

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

Где скачать Debian 8

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

Установка Debian 8

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

Для установки системы на RAID1 можете воспользоваться информацией из статьи «Установка на RAID1«.

Настройка Debian 8

Подключение по ssh

Откроем консоль и определим ip адрес:

local@xrdp:~$ ip addr
= вывод команды =
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
 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 02:74:8a:ed:a9:d3 brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.150/24 brd 192.168.0.255 scope global dynamic eth0
 valid_lft 31965sec preferred_lft 31965sec
 inet6 fe80::74:8aff:feed:a9d3/64 scope link 
 valid_lft forever preferred_lft forever

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

ssh local@192.168.0.150
= вывод команды =
Warning: Permanently added '192.168.0.150' (ECDSA) to the list of known hosts.
local@192.168.0.150's password: 

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
local@xrdp:~$

По умолчанию к системе Debian 8 нельзя подключится сразу под суперпользователем root!

Переключится на пользователя root:

local@xrdp:~$ su -
= вывод команды =
Пароль: 
root@xrdp:~#

Обновление

Обновим индекс пакетов в Debian 8 до актуального состояния:

apt-get update

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

apt-get upgrade

Необходимые пакеты для работы

Установим без вопросов пакеты которые обычно используются в работе c Debian 8:

apt-get -y install mc htop iftop cifs-utils davfs2
  • mc — консольный редактор,
  • htop — консольный монитор просмотра состояния сервера,
  • cifs-utils — пакет необходимый для монтирование сетевых ресурсов,
  • davfs2 — пакет для подключения по протоколу WebDav

Определим редактор mc в системе по умолчанию:

select-editor
= вывод команды с необходимым параметром =
Select an editor. To change later, run 'select-editor'.
 1. /bin/nano <---- easiest
 2. /usr/bin/mcedit
 3. /usr/bin/vim.tiny

Choose 1-3 [1]: 2

Разрешим подключение root по ssh

Произведем изменения в файле конфигурации ssh:

mcedit /etc/ssh/sshd_config
= необходимые изменения =
# Можно поменять на другой порт при желании
Port 22
# Разрешение подключаться под root
PermitRootLogin yes

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

service sshd restart

Проверим правильность изменения порта (если это делали):

netstat -tulnp | grep ssh
= вывод команды =
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2015/sshd 
tcp6 0 0 :::22 :::* LISTEN 2015/sshd

Можем теперь сразу подключаться под root.

Не забудьте добавить порт в настройки firewall!

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

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

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

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

  1. Привязать mac адрес на DHCP сервере и закрепить нужный ip,
  2. Назначить сетевые параметры изменив настройки.

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

Изменим сетевые параметры (обратите внимание на название сетевой карты у нас она eth0):

mcedit /etc/network/interfaces
=вывод команды с необходимыми изменениями=
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
# Запускать автоматически при загрузке системы
auto eth0 
# Интерфейс eth0 в диапазоне IPv4 со статическим адресом
iface eth0 inet static
# IP адрес
address 192.168.0.107
# Шлюз по умолчанию
gateway 192.168.0.106
# Маска сети
netmask 255.255.255.0
# DNS
dns-nameservers 8.8.8.8

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

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

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

ip addr
= вывод команды =
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
 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 02:74:8a:ed:a9:d3 brd ff:ff:ff:ff:ff:ff
 inet 192.168.0.150/24 brd 192.168.0.255 scope global dynamic eth0
 valid_lft 29523sec preferred_lft 29523sec
 inet 192.168.0.107/24 brd 192.168.0.255 scope global secondary eth0
 valid_lft forever preferred_lft forever
 inet6 fe80::74:8aff:feed:a9d3/64 scope link 
 valid_lft forever preferred_lft forever

После перезагрузки системы  отображение  inet 192.168.0.150/24 пропадет!

Проверим соединение с интернетом отправив 4 пакета на ya.ru:

ping -c 4 ya.ru
= вывод команды =
PING ya.ru (87.250.250.242) 56(84) bytes of data.
64 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=54 time=15.2 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=54 time=15.1 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=3 ttl=54 time=16.0 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=4 ttl=54 time=18.4 ms

--- ya.ru ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 15.186/16.235/18.422/1.310 ms

Настройка iptables

Изначально фаервол в Debian 8 полностью открыт. Проверим это:

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

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

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

Всё пропускает.

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

Создадим скрипт настройки iptables:

mcedit /etc/iptables.sh
= вывод команды с необходимой информацией =
#!/bin/bash
#
# Объявление переменных
export IPT="iptables"

# Сетевой интерфейс
export WAN=eth0
export WAN_IP=192.168.0.107

# Очистка всех цепочек iptables
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Политики для трафика, не соответствующего ни одному правил у
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

# Локальный трафик для loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Ping
$IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Исходящие и Входящие соединения
$IPT -A OUTPUT -o $WAN -j ACCEPT
#$IPT -A INPUT -i $WAN -j ACCEPT

# Доступ к web серверу
#$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# Доступ к Samba
#$IPT -A INPUT -p tcp -m tcp --dport 137 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 138 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 139 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 445 -j ACCEPT
#$IPT -A INPUT -p tcp -m tcp --dport 901 -j ACCEPT
# Состояние ESTABLISHED говорит что это не первый пакет в соединении
# Пропускать все уже инициированные соединения, а также дочерние от них
$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# Пропускать новые, а так же уже инициированные и их дочерние соединения
$IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# Форвардинг для уже инициированных и их дочерних соединений
$IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Включаем фрагментацию пакетов. Необходимо из за разных значений MTU
$IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Отбрасывать все пакеты, которые не могут быть идентифицированы
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP

# Приводит к связыванию системных ресурсов, так что реальный
# обмен данными становится не возможным, обрубаем
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

# Открываем порт для ssh
$IPT -A INPUT -i $WAN -p tcp --dport 22 -j ACCEPT
# Открываем порт для DNS
$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT
# Открываем порт для NTP
$IPT -A INPUT -i $WAN -p udp --dport 123 -j ACCEPT
# Открываем порт для RDP
#$IPT -A INPUT -i $WAN -p tcp --dport 3389 -j ACCEPT
# Логирование
$IPT -N block_in
$IPT -N block_out
$IPT -N block_fw

$IPT -A INPUT -j block_in
$IPT -A OUTPUT -j block_out
$IPT -A FORWARD -j block_fw

$IPT -A block_in -j LOG --log-level info --log-prefix "--IN--BLOCK"
$IPT -A block_in -j DROP
$IPT -A block_out -j LOG --log-level info --log-prefix "--OUT--BLOCK"
$IPT -A block_out -j DROP
$IPT -A block_fw -j LOG --log-level info --log-prefix "--FW--BLOCK"
$IPT -A block_fw -j DROP
# Сохраняем правила
/sbin/iptables-save > /etc/iptables_rules

Даем файлу права на запуск:

chmod +x /etc/iptables.sh

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

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

sh /etc/iptables.sh

Проверяем правила:

iptables -L -v -n
= вывод команды =
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 
 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 
 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 3
 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 11
 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
 5 356 ACCEPT all -- eth0 * 0.0.0.0/0 0.0.0.0/0 
 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
 0 0 ACCEPT udp -- eth0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
 0 0 ACCEPT udp -- eth0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:123
 0 0 block_in all -- * * 0.0.0.0/0 0.0.0.0/0 

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 
 0 0 TCPMSS tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
 0 0 block_fw all -- * * 0.0.0.0/0 0.0.0.0/0 

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination 
 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 
 3 308 ACCEPT all -- * eth0 0.0.0.0/0 0.0.0.0/0 
 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
 0 0 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
 0 0 block_out all -- * * 0.0.0.0/0 0.0.0.0/0 

Chain block_fw (1 references)
 pkts bytes target prot opt in out source destination 
 0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 6 prefix "--FW--BLOCK"
 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 

Chain block_in (1 references)
 pkts bytes target prot opt in out source destination 
 0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 6 prefix "--IN--BLOCK"
 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 

Chain block_out (1 references)
 pkts bytes target prot opt in out source destination 
 0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 6 prefix "--OUT--BLOCK"
 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 

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

mcedit /etc/network/interfaces
= необходимое дополнение =
# Загрузка правил iptables при старте машины
pre-up iptables-restore < /etc/iptables_rules

Применим изменения командой:

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

 

Логирование Cron

В Debian нет отдельного файла логов cron. Исправим это недоразумение.

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

mcedit /etc/rsyslog.conf
= Раскомментируем строку =
cron.*                                /var/log/cron.log
= Редактируем строку добавив cron.none =
*.*;auth,authpriv.none,cron.none     -/var/log/syslog

Перезапустим rsyslog:

service rsyslog restart

Осталось проверить ротацию логов cron:

mcedit /etc/logrotate.d/rsyslog
= вывод команды с необходимыми параметрами =
cat /etc/logrotate.d/rsyslog 
/var/log/syslog
{
 rotate 7
 daily
 missingok
 notifempty
 delaycompress
 compress
 postrotate
 invoke-rc.d rsyslog rotate > /dev/null
 endscript
}

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
 rotate 4
 weekly
 missingok
 notifempty
 compress
 delaycompress
 sharedscripts
 postrotate
 invoke-rc.d rsyslog rotate > /dev/null
 endscript
}

Строка присутствует значит все будет ротироваться как надо.

Результат

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