Расскажу про базовую настройку контейнера и о том как осуществляется работа с 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
date
= вывод команды =
Сб окт 13 02:59:46 MSK 2018
Смена имени контейнера
Смена имени производится командой:
hostnamectl старое НОВОЕ
Не забываем сменить в файле конфигурации контейнера lxc.
При желании можно поменять и название контейнера для этого надо остановить контейнер, поменять название папки с контейнером и имена в файле конфигурации контейнера.
Настройка почты
Для проверки работы почты установим пакет который позволяет отправлять письма с консоли:
yum install mailx
Установим, запустим и добавим в автозагрузку сервис для работы с почтой Рostfix:
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
Запускаем скрипт с параметром отправки информации о завершении переноса контейнера:
В результате на почту придет сообщение с темой «Контейнер php7-lxc перенесён!» а в теле письма вы увидите перечень всех файлов что были архивированы.
Удаление контейнера LXC
lxc-destroy php7-lxc
Вывод
Описаны далеко не все возможности контейнеров LXC, но этого вполне достаточно чтобы с успехом использовать эту замечательную систему в работе. Лично для меня, работа с LXC контейнерами стала будничной.
Правильная оптимизация MariaDB после установки одна из важнейших задач с которыми сталкиваешься при обслуживании серверов LEMP. Расскажу свой подход к решении этой задачи. Зная информацию вы всегда сможете правильно настроить его работу.
Введение
В этой статье я постарался описать все основные моменты в работе с базами данных MariaDB. Основной задачей было расказать как выполняется оптимизация MariaDB. Тема очень обширная и имеющая много нюансов. Давать конкретные рекомендации не имеет смысла, так как вариант установки и оптимизации сильно зависит от того какие технические параметры у сервера и какое программное обеспечение будет использоваться.
В каждом дистрибутиве присутствует mariadb, но версия может быть старая. Для установки свежей версии любой программы я всегда стараюсь использовать репозиториями разработчиков. Серьезные разработчики держать версии под все популярные операционные системы.
Репозиторий разработчика
Для того, чтобы подключить репозиторий разработчика MariaDB, можно воспользоваться специальной страницей на официальном сайте, где есть возможность задать параметры системы и получить необходимый код.
Рекомендую воспользоваться ссылкой выше и использовать код репозитория и команды установки исходя из вашей системы.
Например, для системы CentOS 8 с выбором версии 10.4 я получил код который размещу в необходимый файл:
vim /etc/yum.repos.d/mariadb.repo
= необходимый код =
# MariaDB 10.4 CentOS repository list - created 2019-10-24 18:16 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos8-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
Установка MariaDB
На странице, где указан код присутствует и команда которую необходимо выполнить для установки исходя из выбранного дистрибутива. Для CentOS 8 команда имеет такой вид:
Перед продолжением установки смотрим чтобы репозиторий был mariadb!
После установки запустим и добавим в автозагрузку выполнив команды:
systemctl start mariadb
systemctl enable mariadb
Проверим статус выполнив команду:
systemctl status mariadb
= вывод команды =
● mariadb.service - MariaDB 10.4.8 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since Thu 2019-10-24 21:27:02 MSK; 40s ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 1798 (mysqld)
Status: "Taking your SQL requests now..."
Tasks: 30 (limit: 11524)
Memory: 74.3M
CGroup: /system.slice/mariadb.service
└─1798 /usr/sbin/mysqld
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] InnoDB: Buffer pool(s) load completed at 191024 21:27:02
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Plugin 'FEEDBACK' is disabled.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Server socket created on IP: '::'.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Reading of all Master_info entries succeeded
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] Added new Master_info '' to hash table
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: 2019-10-24 21:27:02 0 [Note] /usr/sbin/mysqld: ready for connections.
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc mysqld[1798]: Version: '10.4.8-MariaDB' socket: '/var/lib/mysql/mysql.sock' port: 3306 MariaDB Server
окт 24 21:27:02 wp-lxc.pro-php7.sevo44.loc systemd[1]: Started MariaDB 10.4.8 database server.
окт 24 21:27:14 wp-lxc.pro-php7.sevo44.loc systemd[1]: mariadb.service: Failed to reset devices.list: Operation not permitted
Из вывода видно что все хорошо. Стараюсь всегда проверять статус после установки и запуска сервисов, так как это дает уверенность в том что все работает как надо.
Начальная конфигурация mysql
Для начальной конфигурации необходимо запустить скрипт и ответить на все вопросы исходя из ваших требований. Например, обычно я задаю пароль пользователя root и оставляю остальные параметры по-умолчанию.
/usr/bin/mysql_secure_installation
= вывод команды с пояснениями (перевод) =
Примечание: запуск всех частей этого сценария рекомендуется для всех MariaDB
СЕРВЕРА В ЭКСПЛУАТАЦИЮ! ПОЖАЛУЙСТА, ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ КАЖДЫЙ ШАГ!
1. Для того, чтобы войти в MariaDB обеспечения его, нам понадобится текущий пароль для пользователя root. Если вы только что установили MariaDB и вы еще не установили пароль root, пароль будет пустым, поэтому вы должны просто нажать здесь.
Введите текущий пароль для root (enter for none):
2. Установка пароля root гарантирует, что никто не может войти в MariaDB пользователь root без надлежащего разрешения.
Задать пароль пользователя root? [Y / n]
3. По умолчанию, установка MariaDB имеет анонимного пользователя, что позволяет любому чтобы войти в MariaDB без необходимости иметь учетную запись пользователя, созданную для их. Это предназначено только для испытывать, и сделать установку пойти немного более гладким. Вы должны удалить их перед перемещением в производственная среда.
Удалить анонимных пользователей? [Y / n]
4. Обычно, root должно быть позволено подключаться от "localhost". Этот гарантирует, что кто-то не может угадать пароль.
Запретить root подключаться удаленно? [Y / n]
5. По умолчанию, MariaDB поставляется с базой данных с именем "test", что любой может доступ. Это также предназначено только для тестирования и должно быть удалено перед переходом в производственную среду.
Удалить тестовую базу данных и доступ к ней? [Y / n]
6. Перезагрузить таблицы привилегий обеспечит, что все изменения, сделанные до сих пор вступит в силу немедленно.
Перезагрузить таблицы привилегий сейчас? [Y / n]
Все сделано! Если вы выполнили все вышеперечисленные шаги, ваш MariaDB теперь установка должна быть безопасной.
Спасибо за использование MariaDB!
Информация о действующих параметрах
Для просмотра всех возможных параметров и настойках по умолчанию можно посмотреть выполнив команду:
mysqld --verbose --help
= часть вывода команды с пояснениями =
!!! в консоли у меня не показывается первая часть вывода и как её увидеть я сказу ниже!!!
= в верхней части вы увидите где находится файл настойки =
mysqld Ver 10.3.12-MariaDB-log for Linux on x86_64 (MariaDB Server)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Starts the MariaDB database server.
Usage: mysqld [OPTIONS]
Default options are read from the following files in the given order:
/etc/my.cnf ~/.my.cnf
= в этой части увидите вывод всех возможных параметров =
--thread-handling=name
Define threads usage for handling queries. One of:
one-thread-per-connection, no-threads, pool-of-threads
--thread-pool-idle-timeout=#
Timeout in seconds for an idle thread in the thread
pool.Worker thread will be shut down after timeout
--thread-pool-max-threads=#
Maximum allowed number of worker threads in the thread
pool
= в этой части параметры которые используются по умолчанию =
Variables (--variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
---------------------------------------------------------- ---------------
allow-suspicious-udfs FALSE
alter-algorithm DEFAULT
aria ON
aria-block-size 8192
aria-checkpoint-interval 30
aria-checkpoint-log-activity 1048576
aria-encrypt-tables FALSE
aria-force-start-after-recovery-failures 0
aria-group-commit none
aria-group-commit-interval 0
aria-log-dir-path /var/lib/mysql/
aria-log-file-size 1073741824
aria-log-purge-type immediate
= в конце информация о том как посмотреть текущие параметры =
To see what values a running MySQL server is using, type
'mysqladmin variables' instead of 'mysqld --verbose --help'.
перевод
Чтобы увидеть, какие значения использует работающий сервер MySQL, введите 'mysqladmin variables' вместо 'mysqld --verbose --help'.
Вся информация в консоли не покажется поэтому лучше вывод сделать в файл:
Какие значения использует работающий сервер тоже лучше вывести в файл:
mysqladmin variables -u root -p > mysqladmin-variables.txt
Enter password:
Правильная оптимизация MariaDB возможно только при использовании правильных параметров исходя из вашей версии!
Файл настройки MariaDB
В фале /etc/my.cnf присутствует строка !includedir /etc/my.cnf.d говорящая о том что все настройки находятся в папке /etc/my.cnf.d
Все основные настройки необходимо вносить в раздел [mysqld] файла server.cnf.
Аналитика работы MariaDB
Без аналитики работы сервера проводить оптимизацию MariaDB сложно и очень неудобно. Самый важный момент который необходим при анализе работы, это медленные запросы к базе данных.
Включим отображение медленных запросов добавив следующие строки в /etc/my.cnf.d/server.cnf, в секцию [mysqld]:
vim /etc/my.cnf.d/server.cnf
= необходимые параметры в секцию [mysqld] =
# запись лога медленных запросов
slow_query_log=ON
# путь к файлу
slow_query_log_file=/var/lib/mysql/slow_queries.log
# минимальное время запроса для внесения
long_query_time=2
# включить в лог запросы, которые не используют индексы
#log-queries-not-using-indexes=1
Последний параметр отключен, так как используется больше для отладки кода и правильности создания таблиц.
Перезапустим сервер баз данных и посмотрим лог медленных запросов:
systemctl restart mariadb
tail -f /var/lib/mysql/slow_queries.log
= вывод команды =
Time Id Command Argument
/usr/sbin/mysqld, Version: 10.3.12-MariaDB-log (MariaDB Server). started with:
Tcp port: 0 Unix socket: (null)
= для выхода ctrl+c =
В нашем случае медленных запросов нет.
Оптимизация MariaDB
Подходите очень ответственно. Неправильные действия могут вызвать неприятные последствия!
Для правильной оптимизации необходимо владеть всей необходимой информацией. Например, для меня это:
Информация о действующих параметрах — перед тем как вносить изменения необходимо смотреть какой параметр действует на данный момент ,
Аналитика работы — без аналитики работы вообще бессмысленно производить оптимизацию,
Требование к базе данных — у разных движков сайтов существует разное требование для работы с базой данных и это надо учитывать.
Работа с MySQLTunner
Существует perl-скрипт Mysqltuner, который анализирует статистику работы Mysql и выдает свои рекомендации что бы была проведена правильная оптимизация MariaDB.
Установка
Создадим папку, перейдем в неё и скачаем скрипт следующим образом:
mkdir mysqltuner
cd mysqltuner
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
Если возникает ошибка вида:
ERROR: cannot verify raw.githubusercontent.com’s certificate, issued by ‘/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA’:
Unable to locally verify the issuer’s authority.
To connect to raw.githubusercontent.com insecurely, use `—no-check-certificate’.
Можно скачать базы данных простых паролей и уязвимостей. Скачаем обе базы:
= База простых паролей =
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt -O basic_passwords.txt
= База уязвимостей =
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv -O vulnerabilities.csv
Базы простых паролей и уязвимостей будут использоваться только при запуске скрипта!
Также, можно произвести установку из репозиториев:
Debian/Ubuntu:
apt install mysqltuner
CentOS:
yum install mysqltuner
Оптимизация
Чтобы данные анализа и статистика были корректными, сервер Mysql должен проработать без смены параметров конфигурации и без перезагрузок, по рекомендации самого Mysqltuner не менее 24 часов.
Обращаю внимание на то что правильная оптимизация MariaDB возможно при рабочих базах данных. Перед внесением изменений не ленитесь смотреть какие имеются текущие настройки базы. Скрипт может давать ошибочные выводы!
Если производилось скачивание скрипта находясь в папке со скриптом необходимо выполнить команду:
perl mysqltuner.pl
Если производилась установка:
mysqltuner
После введения данных пользователя root для MariaDB вы увидите примерно такой вывод:
mysqltuner
= вывод команды =
>> MySQLTuner 1.7.13 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
[--] Skipped version check for MySQLTuner script
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: [OK] Currently running supported MySQL version 10.3.12-MariaDB
[OK] Operating on 64-bit architecture
-------- Log file Recommendations
[--] Log file: /var/lib/mysql/mysql_error.log(0B)
[!!] Log file /var/lib/mysql/mysql_error.log doesn't exist
[!!] Log file /var/lib/mysql/mysql_error.log isn't readable.
-------- Storage Engine Statistics
[--] Status: +Aria +CSV +InnoDB +MEMORY +MRG_MyISAM +MyISAM +PERFORMANCE_SCHEMA +SEQUENCE
[!!] InnoDB is enabled but isn't being used
[OK] Total fragmented tables: 0
-------- Analysis Performance Metrics
[--] innodb_stats_on_metadata: OFF
[OK] No stat updates during querying INFORMATION_SCHEMA.
-------- Security Recommendations
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] There is no basic password file list!
-------- CVE Security Recommendations
[--] Skipped due to --cvefile option undefined
-------- Performance Metrics
[--] Up for: 28s (10 q [0.357 qps], 14 conn, TX: 56K, RX: 1K)
[--] Reads / Writes: 100% / 0%
[--] Binary logging is disabled
[--] Physical Memory : 1.8G
[--] Max MySQL memory : 856.4M
[--] Other process memory: 33.7M
[--] Total buffers: 417.0M global + 2.9M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 419.9M (22.84% of installed RAM)
[OK] Maximum possible memory usage: 856.4M (46.59% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/10)
[OK] Highest usage of available connections: 0% (1/151)
[!!] Aborted connections: 7.14% (1/14)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[!!] Query cache may be disabled by default due to mutex contention.
[!!] Query cache efficiency: 0.0% (0 cached / 1 selects)
[OK] Query cache prunes per day: 0
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] Temporary tables created on disk: 0% (0 on disk / 4 total)
[OK] Thread cache hit rate: 92% (1 created / 14 connections)
[OK] Table cache hit rate: 64% (11 open / 17 opened)
[OK] Open file limit used: 0% (25/16K)
[OK] Table locks acquired immediately: 100% (18 immediate / 18 locks)
-------- Performance schema
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B
[--] Sys schema isn't installed.
-------- ThreadPool Metrics
[--] ThreadPool stat is enabled.
[--] Thread Pool Size: 1 thread(s).
[--] Using default value is good enough for your version (10.3.12-MariaDB)
-------- MyISAM Metrics
[!!] Key buffer used: 18.2% (24M used / 134M cache)
[OK] Key buffer size / total MyISAM indexes: 128.0M/123.0K
-------- InnoDB Metrics
[--] InnoDB is disabled.
[!!] InnoDB Storage engine is disabled. InnoDB is the default storage engine
-------- AriaDB Metrics
[--] AriaDB is enabled.
[OK] Aria pagecache size / total Aria indexes: 128.0M/1B
-------- TokuDB Metrics
[--] TokuDB is disabled.
-------- XtraDB Metrics
[--] XtraDB is disabled.
-------- Galera Metrics
[--] Galera is disabled.
-------- Replication Metrics
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: MIXED
[--] XA support enabled: ON
[--] Semi synchronous replication Master: OFF
[--] Semi synchronous replication Slave: OFF
[--] This is a standalone server
-------- Recommendations
General recommendations:
Add skip-innodb to MySQL configuration to disable InnoDB
MySQL was started within the last 24 hours - recommendations may be inaccurate
Reduce or eliminate unclosed connections and network issues
Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
Performance schema should be activated for better diagnostics
Consider installing Sys schema from https://github.com/mysql/mysql-sys
Variables to adjust:
query_cache_size (=0)
query_cache_type (=0)
query_cache_limit (> 1M, or use smaller result sets)
performance_schema = ON enable PFS
Так выглядит вывод команды после 48 часов работы MariaDB без рабочих баз.
Обращать внимание надо на параметры с восклицательными знаками.
Для того чтобы была информация в разделе Log file Recommendations необходимо добавить следующий код:
vim /etc/my.cnf.d/server.cnf
= необходимые дополнения в [mysqld] =
# необходимо для mysqltuner
log_error=/var/lib/mysql/mysql_error.log
В самом конце вывода утилита предоставит список рекомендаций как исправить ситуацию.
query_cache_size (=0)
query_cache_type (=0)
query_cache_limit (> 1M, or use smaller result sets)
Скрипт рекомендует отключить кэш запросов. Query Cache — это кэш вызовов SELECT. Когда базе данных отправляется запрос, она выполняет его и сохраняет сам запрос и результат в этом кэше. При использовании его вместе с InnoDB при любом изменении совпадающих данных кэш будет перестраиваться, что влечет за собой потерю производительности. И чем больше объем кэша, тем больше потери. Кроме того при обновлении кэша могут возникать блокировки запросов. Таким образом, если данные часто пишутся в базу данных — его надежнее отключить добавив следующий код:
vim /etc/my.cnf.d/server.cnf
= необходимые дополнения [mysqld] =
# рекомендации mysqltuner
query_cache_size=0
query_cache_type=0
query_cache_limit=1M
performance_schema = ON enable PFS
Performance Schema это механизм для мониторинга производительности MySQL сервера который по умолчанию выключен. Система позволяет делать многое, но её настройка сложна и надо обладать хорошими знаниями в плане работы баз данных MySQL. Возможно, в будущем я добавлю сюда информацию о том как с ней работать.
После внесения изменений выполним перезапуск MariaDB:
systemctl restart mariadb
Теперь вывод примет вид:
mysqltuner
= вывод команды =
>> MySQLTuner 1.7.13 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
[--] Skipped version check for MySQLTuner script
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: [OK] Currently running supported MySQL version 10.3.12-MariaDB-log
[OK] Operating on 64-bit architecture
-------- Log file Recommendations
[--] Log file: /var/lib/mysql/mysql_error.log(35K)
[OK] Log file /var/lib/mysql/mysql_error.log exists
[OK] Log file /var/lib/mysql/mysql_error.log is readable.
[OK] Log file /var/lib/mysql/mysql_error.log is not empty
[OK] Log file /var/lib/mysql/mysql_error.log is smaller than 32 Mb
[!!] /var/lib/mysql/mysql_error.log contains 0 warning(s).
[!!] /var/lib/mysql/mysql_error.log contains 0 error(s).
[--] 12 start(s) detected in /var/lib/mysql/mysql_error.log
[--] 1) 2019-02-11 23:07:41 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 2) 2019-02-11 0:19:06 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 3) 2019-02-11 0:01:53 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 4) 2019-02-10 23:45:22 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 5) 2019-02-10 23:42:20 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 6) 2019-02-10 23:40:37 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 7) 2019-02-10 23:36:16 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 8) 2019-02-10 23:33:53 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 9) 2019-02-10 23:16:12 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 10) 2019-02-10 23:05:08 0 [Note] /usr/sbin/mysqld: ready for connections.
[--] 11 shutdown(s) detected in /var/lib/mysql/mysql_error.log
[--] 1) 2019-02-11 9:12:02 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 2) 2019-02-11 0:19:06 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 3) 2019-02-11 0:01:53 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 4) 2019-02-10 23:45:21 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 5) 2019-02-10 23:42:19 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 6) 2019-02-10 23:40:37 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 7) 2019-02-10 23:36:16 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 8) 2019-02-10 23:28:06 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 9) 2019-02-10 23:16:12 0 [Note] /usr/sbin/mysqld: Shutdown complete
[--] 10) 2019-02-10 23:05:07 0 [Note] /usr/sbin/mysqld: Shutdown complete
-------- Storage Engine Statistics
[--] Status: +Aria +CSV +InnoDB +MEMORY +MRG_MyISAM +MyISAM +PERFORMANCE_SCHEMA +SEQUENCE
[!!] InnoDB is enabled but isn't being used
[OK] Total fragmented tables: 0
-------- Analysis Performance Metrics
[--] innodb_stats_on_metadata: OFF
[OK] No stat updates during querying INFORMATION_SCHEMA.
-------- Security Recommendations
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] There is no basic password file list!
-------- CVE Security Recommendations
[--] Skipped due to --cvefile option undefined
-------- Performance Metrics
[--] Up for: 58s (10 q [0.172 qps], 14 conn, TX: 56K, RX: 1K)
[--] Reads / Writes: 100% / 0%
[--] Binary logging is disabled
[--] Physical Memory : 1.8G
[--] Max MySQL memory : 1.5G
[--] Other process memory: 59.2M
[--] Total buffers: 1.0G global + 2.9M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 1.0G (57.61% of installed RAM)
[OK] Maximum possible memory usage: 1.5G (81.36% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/10)
[OK] Highest usage of available connections: 0% (1/151)
[!!] Aborted connections: 7.14% (1/14)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[OK] Query cache is disabled by default due to mutex contention on multiprocessor machines.
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] Temporary tables created on disk: 0% (0 on disk / 4 total)
[OK] Thread cache hit rate: 92% (1 created / 14 connections)
[OK] Table cache hit rate: 64% (11 open / 17 opened)
[OK] Open file limit used: 0% (26/16K)
[OK] Table locks acquired immediately: 100% (18 immediate / 18 locks)
-------- Performance schema
[--] Performance schema is disabled.
[--] Memory used by P_S: 0B
[--] Sys schema isn't installed.
-------- ThreadPool Metrics
[--] ThreadPool stat is enabled.
[--] Thread Pool Size: 1 thread(s).
[--] Using default value is good enough for your version (10.3.12-MariaDB-log)
-------- MyISAM Metrics
[!!] Key buffer used: 18.2% (24M used / 134M cache)
[OK] Key buffer size / total MyISAM indexes: 128.0M/123.0K
-------- InnoDB Metrics
[--] InnoDB is disabled.
[!!] InnoDB Storage engine is disabled. InnoDB is the default storage engine
-------- AriaDB Metrics
[--] AriaDB is enabled.
[OK] Aria pagecache size / total Aria indexes: 128.0M/1B
-------- TokuDB Metrics
[--] TokuDB is disabled.
-------- XtraDB Metrics
[--] XtraDB is disabled.
-------- Galera Metrics
[--] Galera is disabled.
-------- Replication Metrics
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] Binlog format: MIXED
[--] XA support enabled: ON
[--] Semi synchronous replication Master: OFF
[--] Semi synchronous replication Slave: OFF
[--] This is a standalone server
-------- Recommendations
General recommendations:
Control warning line(s) into /var/lib/mysql/mysql_error.log file
Control error line(s) into /var/lib/mysql/mysql_error.log file
Add skip-innodb to MySQL configuration to disable InnoDB
MySQL was started within the last 24 hours - recommendations may be inaccurate
Reduce or eliminate unclosed connections and network issues
Configure your accounts with ip or subnets only, then update your configuration with skip-name-resolve=1
Performance schema should be activated for better diagnostics
Consider installing Sys schema from https://github.com/mysql/mysql-sys
Variables to adjust:
performance_schema = ON enable PFS
Базовые параметры
Обычно я добавляю следующие параметры по умолчанию в свои сервера:
vim /etc/my.cnf.d/server.cnf
= необходимые дополнения [mysqld] =
# базовые настройки
character_set_server=utf8
collation-server=utf8_bin
init_connect="SET NAMES utf8 collate utf8_bin"
innodb_file_per_table=1
innodb_buffer_pool_size = 800M # внимание на параметр! установить примерно в 2 раза меньше объема оперативной памяти сервера
innodb_log_file_size = 200M # размер файла лога innodb должен составлять 25% от размера буфера
innodb_buffer_pool_instances=1 # увеличивать на 1 каждый GB innodb_buffer_pool_size
innodb_flush_log_at_trx_commit = 0
innodb_log_files_in_group = 3
Обязательно после всех работ с настройкой баз данных выполняйте проверку статуса на предмет ошибок выполняя команду:
# systemctl status mariadb -l
Ротация логов MariaDB
Откроем необходимый файл и сделаем необходимые изменения:
vim /etc/logrotate.d/mysql
= часть вывода с необходимыми изменениями =
/var/lib/mysql/*log {
# create 600 mysql mysql
notifempty
daily
size 5Mrotate 7
missingok
compress
postrotate
# just if mysqld is really running
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin ping &>/dev/null
then
/usr/bin/mysqladmin --local flush-error-log \
flush-engine-log flush-general-log flush-slow-log
fi
endscript
}
Мы указали что надо ротировать все логи и хранить 7 дней при условии что размер файла 5 Mегабайт.
logrotate -d /etc/logrotate.d/mysql
= вывод команды =
reading config file /etc/logrotate.d/mysql
Allocating hash table for state file, size 15360 B
Handling 1 logs
rotating pattern: /var/lib/mysql/*log 5242880 bytes (7 rotations)
empty log files are not rotated, old logs are removed
considering log /var/lib/mysql/mysql_error.log
log does not need rotating (log size is below the 'size' threshold)
considering log /var/lib/mysql/slow_queries.log
log does not need rotating (log size is below the 'size' threshold)
considering log /var/lib/mysql/tc.log
log does not need rotating (log size is below the 'size' threshold)
Все логи не имеют необходимого размера для выполнения ротации.
Вывод
Постарался изложить основные момента по работе с базой данных MariaDB. Настройка и оптимизация MariaDB для каждого ресурса может сильно отличатся и поэтому нет смысла описывать каждый параметр.
Никогда не копируйте тупо коды в свои конфигурационые файлы, так как версии могут быть разные и вы можете получить большие проблемы с базами данных.
Исходя из статьи вы теперь знаете откуда брать информацию о всех параметрах вашего сервера баз данных.
Для желающих дополнить или подправить ниже есть комментарии.
Использование системы LXC даёт возможность на одном сервере запускать разные изолирование операционные системы. Успешно использую эту технологию для разворачивания на одном VDS сервере LEMP конфигураций с разными версиями программ PHP и MariaDB.
Введение
Работая с серверами VDS для меня прежде всего важна стабильность и удобство их обслуживания.
Лично для меня существует несколько принципиальных моментов при работе с серверами:
Резервное копирование. Для спокойного обслуживания систем всегда необходимо создавать их резервные копии, но к сожалению большинство компаний предоставляющих услуги не предоставляют таких возможностей по умолчанию. Можно делать резервирование разными способами, но это не всегда удобно и требует хороших знаний для быстрого восстановления работоспособности системы из бэкапа;
Использование сервера для конкретной задачи или ресурса. Ни секрет что чем меньше всего установлено на сервере тем проще его обслуживать;
Разные версии программного обеспечения на одном сервере. Бывает так что на одном сервере необходимо использовать PHP 7 и PHP 5. Простыми способами одновременно заставить сервер работать с двумя версиями сложно.
Разработчики системы Calculate Linux познакомили меня с технологией LXC благодаря чему я сильно упростил себе жизнь при обслуживании серверов.
В результате использования LXC я получаю сервер с минимальным набором программного обеспечения благодаря чему обновления проходят легко и не вызывают никаких проблем. В контейнерах создаю всё что мне надо в любых количествах и вариантах. Перед настройкой и обслуживанием контейнера создаю его резерную копию.
Система позволяет создавать контейнеры в которых размещается почти полнофункциональная система с использованием ядра хоста на котором расположена система.
Существует версия LXD которая может использовать в контейнере своё ядно, но это уже отдельный разговор тем более для запуска на системе CentOS. Знаю точно что разработчики систем LXC и LXD спонсирует компания занимающаяся разработкой дистрибутива Ubuntu и поэтому все свои технологии и новшества они внедряют в первую очередь на Ubuntu.
Более подробно об технологии вы можете узнать посетив сайт разработчика.
Контейнеры будут находиться внутри своей виртуальной сети — 10.10.0.0/24. Для настройки маршрутизации будем использовать FirewallD.
Установим без вопросов пакет bridge-utils необходимый для настройки сети контейнеров:
yum -y install bridge-utils
При работающем NetworkManager добавлять бридж надо именно через nmtui, так как только тогда он будет там виден и не возникнет проблем при работе с FirewallD. При настройке сетевых интерфейсов руками NetworkManager необходимо отключить.
Отключение NetworkManager, удаление из автозагрузки и перезагрузка сетевых настроек выполняется следующими командами:
firewall-cmd --get-active-zones
= вывод информации =
public
interfaces: eth0 virbr0
Оба сетевых интерфейса находятся в зоне public
Нам необходимо перенести интерфейс eth0 во внешнюю сеть в зону external а virbr0 во внутреннюю в зону internal.
Перед переносом в другие зоны убедитесь что там присутствует сервис SSH. В случае использования подключения по нестандартному порту не забудьте его добавить в зону куда переносите. В противном случае потеряете доступ к серверу по SSH.
У меня подключение по нестандартному порту следовательно надо выполнить следующие действия:
Главная задача выполнена и контейнеры получат доступ в интернет.
Если хотите использовать для маршрутизации iptables вы можете посмотреть статью и найти там интерферирующие настройки.
Установка LXC 3.0 на CentOS 7
В базовой версии присутствует старая версия 1.0. Можно использовать и её, но уж больно много удобств внесли разработчики в новые версии. Если бы изменения касались только команд управления и не затрагивали конфигурационных настроек файлов я подумал бы еще о том чтобы дождаться новой версии в базовой версии CentOS 7.
Устанавливать свежую версию будем с ресурса Fedora CORP. Вся интерферирующая нас информация находится тут.
Создадим файл репозитория:
vim /etc/yum.repos.d/lxc3.0.repo
=добавим необходимый код =
[thm-lxc3.0]
name=Copr repo for lxc3.0 owned by thm
baseurl=https://copr-be.cloud.fedoraproject.org/results/thm/lxc3.0/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/thm/lxc3.0/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
Для установки необходим репозиторий Epel. Установим командой:
yum install epel-release
Установим свежую версию 3.0 со всеми необходимыми пакетами:
Проверим готовность LXC к работе выполнив необходимую команду:
lxc-checkconfig
= вывод команды =
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-957.1.3.el7.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
newuidmap is not installednewgidmap is not installed
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroups: enabled
Cgroup v1 mount points:
/sys/fs/cgroup/systemd
/sys/fs/cgroup/freezer
/sys/fs/cgroup/pids
/sys/fs/cgroup/perf_event
/sys/fs/cgroup/hugetlb
/sys/fs/cgroup/cpu,cpuacct
/sys/fs/cgroup/net_cls,net_prio
/sys/fs/cgroup/devices
/sys/fs/cgroup/cpuset
/sys/fs/cgroup/blkio
/sys/fs/cgroup/memory
Cgroup v2 mount points:
Cgroup v1 clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled, not loaded
Macvlan: enabled, not loaded
Vlan: enabled, not loaded
Bridges: enabled, loaded
Advanced netfilter: enabled, not loaded
CONFIG_NF_NAT_IPV4: enabled, loaded
CONFIG_NF_NAT_IPV6: enabled, loaded
CONFIG_IP_NF_TARGET_MASQUERADE: enabled, loaded
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled, loaded
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled, not loaded
CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled, not loaded
FUSE (for use with lxcfs): enabled, not loaded
--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities:
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
Кроме двух строк (отмечены в выводе оранжевым) параметр у строк должен быть enabled.
LXC обычно использует следующие пути:
/var/lib/lxc/ — дефолтное место для контейнеров,
/var/lib/lxcsnap/ — дефолтное место снимков,
/var/cache/lxc/ — дефолтное место для кэша шаблонов,
$HOME/.local/share/lxc/ — дефолтное место для непривилегированных контейнеров,
$HOME/.local/share/lxcsnap/ — дефолтное место для непривилегированных снимков,
$HOME/.cache/lxc/ — дефолтное место для непривилегированного кэша шаблонов.
Шаблоны операционных систем хранятся в /usr/share/lxc/templates/.
Мне удобней держать контейнеры в своей папке. Создадим необходимую папку:
mkdir -p /var/sevo44/lxc
Создадим файл конфигурации и поместим туда нужный код:
vim /etc/lxc/lxc.conf
= необходимый код =
lxc.lxcpath = /var/sevo44/lxc
Если вы переопределяете место для контейнеров, то каталог снимков snap будет находится в вашей новой папке.
Запускаем LXC и добавляем в автозагрузку:
systemctl start lxc
systemctl enable lxc
= вывод команды =
Created symlink from /etc/systemd/system/multi-user.target.wants/lxc.service to /usr/lib/systemd/system/lxc.service.
Проверим статус службы:
systemctl status lxc
● lxc.service - LXC Container Initialization and Autoboot Code
Loaded: loaded (/usr/lib/systemd/system/lxc.service; enabled; vendor preset: disabled)
Active: active (exited) since Вт 2019-01-29 15:48:00 MSK; 25s ago
Docs: man:lxc-autostart
man:lxc
Main PID: 14338 (code=exited, status=0/SUCCESS)
янв 29 15:48:00 vds-micro2.sevo44.ru systemd[1]: Starting LXC Container Initialization and Autoboot Code...
янв 29 15:48:00 vds-micro2.sevo44.ru systemd[1]: Started LXC Container Initialization and Autoboot Code.
Служба работает. Переходим к настройке контейнеров.
Создание и настройка LXC контейнера
Предварительная настройка
При создании контейнера можно использовать необходимые нам параметры. Дефолтная конфигурация контейнера при установке находится в /etc/lxc/default.conf.
В контейнеры можно пробрасывать папку находящуюся на хосте и мы воспользуемся этой возможностью.
Создадим папку куда будем складывать резервные копии с контейнеров:
mkdir -p /var/sevo44/backup
В последствии для удобства в ней будем создавать папки соответствующие названию создаваемого контейнера.
Откроем файл дефолтной конфигурации для создаваемых контейнеров и внесём необходимые параметры:
vim /etc/lxc/default.conf
= необходимые параметры =
# sevo44 меняем значение 111 на необходимые
# lxc.uts.name = название контейнера.lemp.sevo44.loc
lxc.autodev = 1
lxc.net.0.type = veth
lxc.net.0.link = virbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
lxc.net.0.veth.pair = 111-lxc
lxc.net.0.name = eth0
lxc.net.0.ipv4.address = 10.10.0.111/24
lxc.net.0.ipv4.gateway = 10.10.0.1
lxc.start.auto = 1
#lxc.start.delay = 5
lxc.mount.entry = /var/sevo44/backup/111 mnt none rw,bind 0.0
Позже при конечной настройке конфигурационного файла я расскажу подробней об использованных параметрах.
После создания контейнера надо будет зайти в файл настройки контейнера и поменять значения 111 на свои.
Один раз настроив этот файл нам не надо будет каждый раз глобально редактировать файл настройки контейнера.
Создание контейнера LXC
Создавать будем контейнер с именем php7-lxc в котором развернем работу LEMP сервера с неоходимой версией php.
Создадим сразу папку для бэкапов:
mkdir /var/sevo44/backup/php7
Устанавливать будем скачивая необходимую версию дистрибутива.
Выполним необходимую команду для установки контейнера:
lxc-create php7-lxc -t download
= вывод команды с пояснениями =
Setting up the GPG keyring
Downloading the image index
---
DIST RELEASE ARCH VARIANT BUILD
---
= в выводе скрыты все остальные варианты операционных систем =
centos 7 amd64 default 20190129_07:09
centos 7 arm64 default 20190129_07:10
centos 7 armhf default 20190129_07:11
centos 7 i386 default 20190129_07:09
centos 7 ppc64el default 20190129_07:10
---
Distribution:
centos
Release:
7
Architecture:
amd64
Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs
---
You just created a Centos 7 x86_64 (20190129_07:09) container.
Настройка контейнера LXC перед первым запуском
Заходим в файл настройки контейнера и вносим необходимые правки:
vim /var/sevo44/lxc/php7-lxc/config
= вывод команды с необходимыми правками =
# Template sed to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)
# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)
# sevo44 меняем значение 111 на необходимые
# lxc.uts.name = название контейнера.lemp.sevo44.loc
# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = x86_64
# Container specific configuration
lxc.autodev = 1
lxc.start.auto = 1
#lxc.start.delay = 5
lxc.mount.entry = /var/sevo44/backup/php7 mnt none rw,bind 0.0
lxc.rootfs.path = dir:/var/sevo44/lxc/php7-lxc/rootfs
lxc.uts.name = php7-lxc.lemp.sevo44.loc
# Network configuration
lxc.net.0.type = veth
lxc.net.0.link = virbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:3b:18:15
lxc.net.0.veth.pair = php7-lxc
lxc.net.0.name = eth0
lxc.net.0.ipv4.address = 10.10.0.2/24
lxc.net.0.ipv4.gateway = 10.10.0.1
Значение строк на которые стоит обратить внимание:
lxc.net.0.ipv4.address = 10.10.0.2/24 — ip который будет присвоен контейнеру,
lxc.start.auto = 1 — автозагрузка контейнера при перезагрузке системы,
lxc.mount.entry = /var/sevo44/backup/php7 mnt none rw,bind 0.0 — говорит о том что папка /var/sevo44/backup/php7 будет примантированна в папку контейнера mnt,
lxc.uts.name = php7-lxc.lemp.sevo44.loc — название контейнера.
Для доступа в интернет в контейнере необходимо добавить dns серверы в /etc/resolv.conf. Добавим dns от Yandex и Google:
vim /var/sevo44/lxc/php7-lxc/rootfs/etc/resolv.conf
= необходимый код =
nameserver 77.88.8.8
nameserver 8.8.4.4
Конфигурацию сетевого интерфейса в контейнере приводим к следующему виду:
vim /var/sevo44/lxc/php7-lxc/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
= необходимые параметры =
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HOSTNAME=php7-lxc.lemp.sevo44.loc
NM_CONTROLLED=no
TYPE=Ethernet
Управление контейнером LXC
Запуск контейнера php7-lxc осуществляется командой:
Выход из консоли контейнера производиться следующей командой:
exit
Вывод
В данной статье я привел практический пример использования системы c минимальными возможностями функционала. Информации об этой технологии у меня еще много, но об этом я расскажу в своих следующих статьях:
Рассмотрим установку системы CentOS 7 и последующую настройку исходя из практики использования этой операционной системы. Данная система для меня основная для использования на серверах в продакшн. Стабильность работы гарантированна. Поддержка 10 лет.
Введение
В данной статье я постарался в одном месте собрать все основные моменты базовой настройке сервера CentOS 7 которые использую на практике.
Установка CentOS 7
Создания USB носителя для установки
Существует множество программ для записи iso образа на устройство. Например, у меня два варианта для создания носителя для установки:
Rufus — использую эту программа для создание загрузочных USB-дисков в системе Windows;
ROSA ImageWriter — использую эту програму для любой системы Linux.
Варианты установки
Рассмотрим два самых популярных варианта установки СentOS 7.
Образы iso CentOS 7
Все свежие образы можно скачать по ссылке Download CentOS. Существует два варианта:
DVD ISO — полный образ;
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
Популярные и полезные утилиты
Установим в начале основные популярные утилиты которые обычно требуются в работе.
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!
Отправитель письма подтверждён и проверен Спамообороной Яндекса.
Отправитель: 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:
Для применения изменений необходимо перезагрузить 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 заменим его на наш:
Если больше ничего не делать а просто добавить в автозагрузку службу и запустить то спустя какое то время вы заметите что статистика не ведется. При просмотре статуса службы увидите ошибки:
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
Проверим статус сервиса выполнив необходимую команду:
При установке из шаблонов, как правило, будет использоваться английский язык по умолчанию. Если вам по душе русский язык в системной консоли, то используйте следующую команду:
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):
Подключение производится с указанием необходимого порта командой:
ssh -p 25555 root@193.124.180.195
Авторизация SSH по ключу
Вводить каждый раз пароль не удобно да и не помешает добавить безопасности.
После настройки можно отключить в параметрах ssh авторизацию по паролю, но иногда подключение по паролю просто необходимо. Обычно я создаю 16 злачный пароль и меняю его если давал временный доступ специалистам любого уровня и моего доверия. Безопасность лишней не бывает!
Установим самый популярный файловых менеджеров с текстовым интерфейсом командой:
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_history (в начале точка). Его можно открыть любым редактором и посмотреть.
По умолчанию вывод команды history в консоли нам покажет:
history
= вывод команды =
1 yum update
2 reboot
3 htop
4 df -h
Как видим вывод не информативный. Кроме того, покажет только последние 1000 команд.
Быстро найти конкретную команду, можно с помощью фильтрации только нужных строк, например вот так:
history | grep yum
Изменим эту ситуацию добавив в файл .bashrc находящийся в папке пользователя необходимые параметры:
Можно применить эту настройку для всех пользователей указав параметр в файле /etc/profile.d/bash_completion.sh который мы создали ранее при настройке вида bash.
В таком варианте получаем гораздо большую информативность.
Установка Tmux
В заключение, установим пожалуй один из самых необходимых и удобных программ для удаленной работы с сервером. Tmux терминальный оконный менеджер при использовании дает возможность при обрыве связи с сервером по ssh не терять информацию о выполняемых действиях.
Периодически возникает необходимость показать свои настройки коллегам для разных целей. В мессенджерах не всегда корректно отображается копируемый код. Существует механизм который идеально подходит для такой задачи. Установим необходимый пакет:
yum install cpaste
Например, мы хотим показать код глобальной настройки nginx.
Выполним в консоли команду:
cat /etc/nginx/nginx.conf | cpaste
= результат команды =
Successfully pastebined to: https://paste.centos.org/view/0c2650772c
Теперь нам достаточно отправить ссылку кому надо и по ссылке человек сможет увидеть наш код и отписать прям там свои пожелания и предложения.
Можно отправить вывод команды. Например, информацию о размерах дискового пространства можно отправить командой:
df -h | cpaste
= вывод команды =
Successfully pastebined to: https://paste.centos.org/view/17671ad924
По умолчанию заметка будет храниться 1 день.
Вывод
В результате я получил статью в которой свёл в одно место все основные моменты которые я на практике использую при базовой настройке сервера CentOS 7. Возможно что-то сказано с ошибками или можно улучшить. Комментируйте и советуйте я всегда рад обратной связи с пользователями систем Linux.
SFTP удобное и безопасное подключение к файлам ресурса используя ssh. Инструкцию можно использовать для любых систем Linux. Отличие только в командах на перезапуск сервисов Nginx, Php-fpm, SSH и путях к файлам настройки.
Введение
Ранее я использовал для работы с файлами сайтов программу ProFTP, но отказался в пользу SFTP из за более стабильной работы и простоты настройки. Настройка показана на примере CentOS 7.
Открываем конфигурационный файл 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
Доступ к файлам ресурса уже есть и можно подключатся, но могут возникнуть проблемы с правами. Ниже я расскажу как избежать проблем связанных с правами на файлы.
Настройка прав на данные
Назначаем владельцем содержимого сайта пользователя которого мы создали выше:
Внимание! Сначала мы рекурсивно назначаем права на все содержимое директорий, а потом возвращаем владельца 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 и перезагрузим необходимые сервисы:
Детальнейшую работу с файлами, для избежания проблем с правами на файлы, лучше осуществлять используя программу для подключения по SFTP.
Заключение
В результате настроек мы получаем защищённый и удобный доступ для работы с файлами ресурса. Для работы я использую программу FileZilla. Кроме того, из статьи RSA или авторизация SSH по ключу вы можете узнать как используя программу FileZilla можно подключатся по файлу с ключом расширения ppk.
FreeIPA это сборка программ предназначенных для управление учетными записями и проверки подлинности. Разрабатывается компанией RedHAT. Удобная работа с DNS сервером. Продуманная и удобная работа в панели управления. Англоязычная подробная документация от разработчика.
Введение
Всегда удобно вести базу пользователей в одном месте и использовать данные для работы с различными программами в которых необходима авторизация пользователей. FreeIPA позволяет очень быстро развернуть базу данных пользователей и имеет очень обширный функционал и подробную документацию на английском языке. Очень удобно использовать DNS сервер у которого хорошо продумано управление с панели управления.
Установим операционную систему CentOS 7 c минимального образа и подготовим для установки.
Параметры для установки:
Имя узла сети : ipa.sevo44.loc
IP: 192.168.0.102
Шлюз: 192.168.0.106
DNS: 8.8.4.4
DNS указываем только для того чтобы машина могла скачать в интернете нужные пакеты. В последствии мы будем использовать DNS сервер на самом сервере IPA и эти параметры можно будет удалить из настроек.
Необходимо обязательно внести изменения в файл /etc/hosts
vi /etc/hosts
= необходимые изменения =
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.102 ipa.sevo44.loc ipa
Примечание: Должно быть указано полное доменное имя (FQDN). В противном случае, Kerberos не будет работать! В файле/etc/hostname название машины должно быть ipa.sevo44.loc!
Сетевые настройки CentOS 7
После установки CentOS и не будем подключать и устанавливать ничего лишнего чтобы в дальнейшем не возникло проблем с обновлением системы.
Используя замечательную утилиту настроим сетевые параметры:
nmtui
С помощью её можно указать сетевые настройки и имя машины, если мы не сделали это при установке системы.
После внесения сетевых изменений перезагрузим сетевые параметры:
service network restart
= вывод команды =
Restarting network (via systemctl): [ OK ]
Проверим есть ли доступ в интернет отправив 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=51 time=13.9 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=51 time=94.4 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=3 ttl=51 time=19.8 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=4 ttl=51 time=17.5 ms
--- ya.ru ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 13.993/36.447/94.483/33.571 ms
Не отключаем SELINUX для FreeIPA
Так как при установке FreeIPA настройки для SELINUX устанавливаются автоматически то отключать нет смысла.
Обновляем без вопросов и перезагружаем сисетему:
yum -y update && reboot
Установка FreeIPA
Устанавливаем необходимые для FreeIPA пакеты без вопросов:
Red Hat рекомендует произвести установку и настойку DNS сервера.
Мы будем устанавливать с DNS сервером и это уверяю вас действительно удобно.
Ниже представлен лог установки который я почти весь перевел на русский язык.
ipa-server-install
= вывод команды с необходимыми изменениями =
Файл журнала для этой установки можно найти в файле /var/log/ipaserver-install.log
===================================
Данная программа позволит настроить IPA Server.
Это включает в себя:
* Настроить изолированный CA (dogtag) для управления сертификатами
* Настройка сетевого времени Демон (ntpd)
* Создать и настроить Directory Server
* Создание и настройка центра распространения ключей kerberos (KDC)
* Настроить Apache (httpd)
Чтобы принять значения по умолчанию указаны в скобках, нажмите клавишу Enter.
Вы хотите настроить DNS, интегрированной (BIND)? [no]: !!! yes
Введите полное доменное имя компьютера
на что вы настраиваете программное обеспечение сервера.
Используя форму
<hostname>.<domainname>
Пример: master.example.com.
Имя хоста сервера [ipa.sevo44.loc]: !!! enter
Предупреждение: пропуск разрешение DNS-узла ipa.sevo44.loc
Имя домена определяется на основе имени узла.
Пожалуйста, подтвердите имя домена [sevo44.loc]: !!! enter
Протокол kerberos требует имя области должны быть определены.
Обычно это доменное имя преобразуется в верхний регистр.
Пожалуйста, укажите имя области [SEVO44.LOC]: !!! enter
Определенных операций сервера каталогов требуют права администратора.
Этот пользователь называется менеджер каталога и имеет полный доступ
каталог для задачи управления системой и будет добавлено
экземпляр сервера каталога созданы для ipa.
Пароль должен быть минимум 8 символов.
Directory Manager пароль: ******** Пароль (подтверждение): ********
IPA сервер требует права администратора, по имени 'admin'.
Этот пользователь является регулярным системе учетная запись, используемая для управления IPA сервера.
Пароль администратора IPA: ********Пароль (подтверждение): ********
Checking DNS domain sevo44.loc., please wait ...
Do you want to configure DNS forwarders? [yes]: !!! enter
Following DNS servers are configured in /etc/resolv.conf: 8.8.4.4
Do you want to configure these servers as DNS forwarders? [yes]: !!! enter
All DNS servers from /etc/resolv.conf were added. You can enter additional addresses now:
Enter an IP address for a DNS forwarder, or press Enter to skip: 8.8.8.8
DNS forwarder 8.8.8.8 added. You may add another.
Enter an IP address for a DNS forwarder, or press Enter to skip:
Checking DNS forwarders, please wait ...
Do you want to search for missing reverse zones? [yes]: !!! enterDo you want to create reverse zone for IP 192.168.0.102 [yes]: !!! enter
Please specify the reverse zone name [0.168.192.in-addr.arpa.]:
Using reverse zone(s) 0.168.192.in-addr.arpa.
The IPA Master Server will be configured with:
Hostname: ipa.sevo44.loc
IP address(es): 192.168.0.102
Domain name: sevo44.loc
Realm name: SEVO44.LOC
BIND DNS server will be configured to serve IPA domain with:
Forwarders: 8.8.4.4, 8.8.8.8
Forward policy: only
Reverse zone(s): 0.168.192.in-addr.arpa.
Продолжить настройку системы с этими значениями? [no]: !!! yes
Следующие операции могут занимать несколько минут.
Пожалуйста, подождите, пока не вернетесь в приглашение.
Откинемся на спинку кресла и ждем...
Выдаст по окончанию результат.
------
Configuring NTP daemon (ntpd)
[1/4]: stopping ntpd
[2/4]: writing configuration
[3/4]: configuring ntpd to start on boot
[4/4]: starting ntpd
Done configuring NTP daemon (ntpd).
Configuring directory server (dirsrv). Estimated time: 1 minute
[1/42]: creating directory server user
= часть вывода скрыта =
[42/42]: configuring directory to start on boot
Done configuring directory server (dirsrv).
Configuring certificate server (pki-tomcatd). Estimated time: 3 minutes 30 seconds
[1/28]: creating certificate server user
= часть вывода скрыта =
[28/28]: updating IPA configuration
Done configuring certificate server (pki-tomcatd).
Configuring directory server (dirsrv). Estimated time: 10 seconds
[1/3]: configuring ssl for ds instance
[2/3]: restarting directory server
[3/3]: adding CA certificate entry
Done configuring directory server (dirsrv).
Configuring Kerberos KDC (krb5kdc). Estimated time: 30 seconds
[1/10]: adding sasl mappings to the directory
[2/10]: adding kerberos container to the directory
[3/10]: configuring KDC
[4/10]: initialize kerberos container
WARNING: Your system is running out of entropy, you may experience long delays
[5/10]: adding default ACIs
[6/10]: creating a keytab for the directory
[7/10]: creating a keytab for the machine
[8/10]: adding the password extension to the directory
[9/10]: starting the KDC
[10/10]: configuring KDC to start on boot
Done configuring Kerberos KDC (krb5kdc).
Configuring kadmin
[1/2]: starting kadmin
[2/2]: configuring kadmin to start on boot
Done configuring kadmin.
Configuring ipa_memcached
[1/2]: starting ipa_memcached
[2/2]: configuring ipa_memcached to start on boot
Done configuring ipa_memcached.
Configuring ipa-otpd
[1/2]: starting ipa-otpd
[2/2]: configuring ipa-otpd to start on boot
Done configuring ipa-otpd.
Configuring the web interface (httpd). Estimated time: 1 minute
[1/19]: setting mod_nss port to 443
= часть вывода скрыта =
[19/19]: configuring httpd to start on boot
Done configuring the web interface (httpd).
Applying LDAP updates
Upgrading IPA:
[1/9]: stopping directory server
[2/9]: saving configuration
[3/9]: disabling listeners
[4/9]: enabling DS global lock
[5/9]: starting directory server
[6/9]: upgrading server
[7/9]: stopping directory server
[8/9]: restoring configuration
[9/9]: starting directory server
Done.
Restarting the directory server
Restarting the KDC
Configuring DNS (named)
[1/12]: generating rndc key file
[2/12]: adding DNS container
[3/12]: setting up our zone
[4/12]: setting up reverse zone
[5/12]: setting up our own record
[6/12]: setting up records for other masters
[7/12]: adding NS record to the zones
[8/12]: setting up CA record
[9/12]: setting up kerberos principal
[10/12]: setting up named.conf
[11/12]: configuring named to start on boot
[12/12]: changing resolv.conf to point to ourselves
Done configuring DNS (named).
Configuring DNS key synchronization service (ipa-dnskeysyncd)
[1/7]: checking status
[2/7]: setting up bind-dyndb-ldap working directory
[3/7]: setting up kerberos principal
[4/7]: setting up SoftHSM
[5/7]: adding DNSSEC containers
[6/7]: creating replica keys
[7/7]: configuring ipa-dnskeysyncd to start on boot
Done configuring DNS key synchronization service (ipa-dnskeysyncd).
Restarting ipa-dnskeysyncd
Restarting named
Restarting the web server
==============================================================
Установка завершена
Следующие шаги:
1. Вы должны убедиться, что эти порты открыты:
TCP Ports:
* 80, 443: HTTP/HTTPS
* 389, 636: LDAP/LDAPS
* 88, 464: kerberos
* 53: bind
UDP Ports:
* 88, 464: kerberos
* 53: bind
* 123: ntp
Установка и конфигурирование закончено осталось выполнить требуемые действия указанные в логе установки.
Настройка FirewallD
О детальной настройке FirewallD вы можете посмотреть в статье «FirewallD базовая настройка«. Упуская детали я лишь добавлю все необходимые сервисы и порты.
Откроем необходимые порты и применим правила:
Для тестов лучше вообще не включать! При установке минимальной версии защиты нет!
firewall-cmd --permanent --zone=public --add-service={ntp,http,https,ldap,ldaps,kerberos,kpasswd,dns}
firewall-cmd --permanent --zone=public --add-port=53/tcp
firewall-cmd --permanent --zone=public --add-port=53/udp
firewall-cmd --reload
Результат после каждой команды должен быть -- success!
Проверим зону в которой работает система:
firewall-cmd --list-all --zone=public
= вывод команды =
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh ntp http https ldap ldaps kerberos kpasswd dns
ports: 53/tcp 53/udp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Всё хорошо. Все необходимые сервисы и порты открыты.
Проверка после установки
Получить билет kerberos с помощью команды:
kinit admin
= вывод команды =
Password for admin@SEVO44.LOC: ********
Проверим полученный билет:
klist
= вывод команды =
Ticket cache: KEYRING:persistent:0:0
Default principal: admin@SEVO44.LOC
Valid starting Expires Service principal
26.07.2016 02:47:02 27.07.2016 02:46:51 krbtgt/SEVO44.LOC@SEVO44.LOC
Как видим всё работает.
Добавление параметра DNS
Для того чтобы нам войти в панель управления по адресу ipa.sevo44.loc нам необходимо добавить нужный параметр в настройки DHCP сервера или добавить строчку в файл /etc/hosts на компьютере с которого хотим войти.
vi /etc/hosts
= необходимое изменении =
192.168.0.102 ipa.sevo44.loc
В моем случае работает DHCP сервер в сети под управлением CentOS 7 и мне необходимо было внести необходимые данные и перезагрузить службу:
vi /etc/dhcp/dhcpd.conf
= вывод команды с требуемым параметром =
subnet 192.168.0.0 netmask 255.255.255.0 {
option domain-name "sevo44.loc";
option domain-name-servers 192.168.0.102;
range 192.168.0.150 192.168.0.220;
option routers 192.168.0.106;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
option ntp-servers 192.168.0.106;
# PXE SERVER IP
next-server 192.168.0.106;
filename "pxelinux.0";
}
systemctl restart dhcpd
Добавление аватара в базу LDAP
Единственное чего мне сразу не хватило в FreeIPA, это добавление аватарки в данные пользователя. В будущем это скорей всего появится ну а пока можно это сделать руками.
Получаем билет пользователя которому добавим аватар:
kinit sevo44
= вывод команды =
Password for sevo44@SEVO44.LOC:
Password expired. You must change it now.
Enter new password: ******
Enter it again: ******
Проверим результат:
klist
= вывод команды =
Ticket cache: KEYRING:persistent:0:krb_ccache_eDplsFs
Default principal: sevo44@SEVO44.LOC
Valid starting Expires Service principal
06.10.2017 19:08:09 07.10.2017 19:08:09 krbtgt/SEVO44.LOC@SEVO44.LOC
Выведем информацию о пользователе:
ipa user-show --all sevo44
= вывод команды =
dn:uid=sevo44,cn=users,cn=accounts,dc=sevo44,dc=loc
Логин пользователя: sevo44
Имя: Алексей
Фамилия: Долотов
Полное имя: Алексей Долотов
Отображаемое имя: Алексей Долотов
Инициалы: АД
Домашний каталог: /home/sevo44
GECOS: Алексей Долотов
Оболочка входа: /bin/sh
Principal name: sevo44@SEVO44.LOC
Principal alias: sevo44@SEVO44.LOC
Электронный адрес: info@sevo44.ru
UID: 934400001
ID группы: 934400001
Должность:
Учетная запись отключена: False
Preserved user: False
Пароль: True
Member of groups: admincloud, ipausers, admin
Kerberos ключей доступно: True
ipauniqueid: f1f4385a-a115-11e7-98ed-36ef55e202fa
krblastpwdchange: 20171006160809Z
krbpasswordexpiration: 20180104160809Z
objectclass: top, person, organizationalperson, inetorgperson, inetuser,
posixaccount, krbprincipalaux, krbticketpolicyaux, ipaobject,
ipasshuser, ipaSshGroupOfPubKeys, mepOriginEntry,
ipauserauthtypeclass
Создадим файл файл Ldif где укажем нужные параметры и откуда брать файл аватара:
vim sevo44.ldif
= необходимые параметры =
dn: uid=sevo44,cn=users,cn=accounts,dc=sevo44,dc=loc
changetype: modify
add: jpegPhoto
jpegPhoto:< file:///root/avatar_sevo44_250.jpg
Предварительно закидываем нужный файл аватарки в требуемую папку.
LDAP не сохраняет изображения в качестве стандартного файла JPEG, он будет преобразован в base64. Рекомендуется использовать небольшое изображение, который вы будете хранить в LDAP.
Чтобы импортировать изображения в базу LDAP, используем команду ldapmodify:
Проверим правильность добавления аватарки в базу LDAP:
ipa user-show --all sevo44
= вывод команды =
dn: uid=sevo44,cn=users,cn=accounts,dc=sevo44,dc=loc
Логин пользователя: sevo44
Имя: Алексей
Фамилия: Долотов
Полное имя: Алексей Долотов
Отображаемое имя: Алексей Долотов
Инициалы: АД
Домашний каталог: /home/sevo44
GECOS: Алексей Долотов
Оболочка входа: /bin/sh
Principal name: sevo44@SEVO44.LOC
Principal alias: sevo44@SEVO44.LOC
Электронный адрес: info@sevo44.ru
UID: 934400001
ID группы: 934400001
Должность:
Учетная запись отключена: False
Preserved user: False
Пароль: True
Member of groups: admincloud, ipausers, admin
Kerberos ключей доступно: True
ipauniqueid: f1f4385a-a115-11e7-98ed-36ef55e202fa
jpegphoto: /9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gOTAK/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAIAAgAwEiAAmY9N1nxffXhmjcw63Mj2+0IwY8Ox3ghcHuGb7u0ZUYKC0NKtaVdpyP//Z
krblastpwdchange: 20171006160809Z
krbpasswordexpiration: 20180104160809Z
objectclass: top, person, organizationalperson, inetorgperson, inetuser, posixaccount, krbprincipalaux, krbticketpolicyaux, ipaobject, ipasshuser,
ipaSshGroupOfPubKeys, mepOriginEntry, ipauserauthtypeclass
Видим что всё добавилось. Теперь на всех ресурсах подключенных к LDAP мы сможем видеть аватары пользователей что весьма удобно в работе.
По такому же принципу можно добавлять аватарки в любую базу LDAP.
Работа в панели FreeIPA
Панель FreeIPA выглядит очень дружелюбно и притом некоторые вещи показывает по русски что весьма радует. Так выглядит главная страница после авторизации:
На скрине ниже мы можем посмотреть куда настроено перенаправление если нет нужной записи в нашем DNS сервере:
В моем случае указаны DNS адреса google.
Добавление локальных хостов (сайтов) в DNS
Так выглядят все зоны DNS что обслуживаются в нашей локальной сети:
Добавление сводится к тому что надо нажать кнопку сверху справа «Добавить» и внести запись A указав название и ip адрес на котором находится ресурс:
Вот так все просто и наглядно и главное все показано в полном объеме необходимого функционала для обслуживание DNS сервера.
Добавление новой сторонней зоны DNS
Частенько когда в локальной сети работает ресурс он имеет доступ и с интернета. В моем случае это ресурс NextCloud к которому у меня настроен доступ как в локальной сети так и с интернета. Необходимо настроить чтобы находясь в локальной сети я работал на прямую с локальным ресурсом а когда работаю в других сетях доступ был через интернет и при этой чтобы ничего не переключать и не настраивать. Всё что нам надо это добавить новую зону и указать с какого IP ей работать если я подключен в локальную сеть.
Чтобы добавить нужную A запись после добавления зоны надо нажать на @ и внести нужный IP адрес.
Вывод
Мне понравилось оформление панели управление и тот функционал что я использую. Пробовал я разные варианты но этот для меня оказался самый лучший и главное стабильно работающий. Возможности большие и в документации вы сможете найти ответы на многие вопросы по работе с ним. Возможно в последствии я опишу как добавлять в домен машины как под управление Linux так и под управлением Windows. Исходя из последних ситуацией у моих клиентов чувствую что основной парк машин буду переводить на Linux. Уж больно достало всех уже «стабильность» систем Windows (особенно последней версии Windows 10 для которой матерные слова это уже самое малое что можно сказать).
Рассмотрим обновление на PHP 7-ой версии в системе CentOS 7 работающей с Nginx. Произведем настройку после обновления необходимых конфигурационных файлов для работы ресурсов использующих php. Процесс обновления сложный требующий внимания и ответственности.
Введение
Рано или поздно приходит время обновить старую версию PHP на новую. Как правило это обусловлено требование при обновлении ресурсов которые не смогут работать со старой версией. Редко обновление приходит без ручного вмешательства в редактирование конфигурационных файлов.
Обязательно перед обновление сделайте резервную копию системы и после обновления максимально проверьте все ресурсы использующие PHP!
Исходя из вывода удалим все эти пакеты. Новую версию php мы будем устанавливать с другого репазитория. Репозиторий remi нам больше не нужен и мы его удалим.
Внимательно смотрим лог обновления на предмет ошибок и предупреждений! Сохраните все ошибки и предупреждения. Уверяю в последствии это сильно сократит время в настройке после обновления!
Удаление репозитория Remi-safe
Не вижу смысла держать репозитории которые больше не используются и всегда их удаляю.
Выведем список всех используемых репозиториев:
yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.yandex.ru
* epel: mirror.yandex.ru
* extras: mirror.yandex.ru
* remi-safe: mirror.awanti.com
* updates: mirror.yandex.ru
Идентификатор репозитория репозиторий состояние
!remi-safe Safe Remi's RPM repository for Enterprise Linux 7 - x86_64 2 509
В выводе видим точное имя которое мы используем при удалении:
yum-config-manager --disable remi-safe
В случае ошибки установите пакет yum-utils!
yum -y install yum-utils
После всех действий обновим систему чтобы окончательно всё подготовить к установке новой версии:
yum update
Установка новой версии PHP
Выбор репозитория и версии PHP 7
Вероятно есть разные варианты установки PHP 7 версии, но мне нравится репозиторий WebtaticEL про него и расскажу.
Всегда старайтесь смотреть документацию разработчиков при работе с любыми программами и пакетами. Копировать бездумно команды с множества статей в интернете плохая привычка. Помимо того что вы можете все испортить непониманием вводимых команды вы может напрочь убить настраиваемую систему. В своих статьях я стараюсь указывать источник и перед опубликованием всегда проверяю написанное на своих рабочих или тестовых системах.
Перейдя по ссылке вы увидите все варианты версий возможных для установки а так же способы их установки в необходимую вам систему. Мой выбор пал на версию PHP 7.1 так как на данный момент это самая стабильная новая версия.
После добавления любого репазитория необходимо обновить список пакетов. В CentOS это можно сделать командой вывода всех репозиториев которая заодно и обновит весь список пакетов:
yum repolist
Установка PHP 7.1
Установим все нужные мне пакеты исходя из тех что удалял:
После обновления я предпочитая перезагрузить систему чтобы окончательно избавится от сомнений что что то работает по старой схеме и после перезагрузки перестанет работать.
Проверка после обновления PHP
После обновления первым делом проверим какая версия php в системе:
php -v
= вывод команды =
PHP 7.1.8 (cli) (built: Aug 9 2017 19:19:49) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.1.8, Copyright (c) 1999-2017, by Zend Technologies
Видим что установилась новая версия, но почти со 100% уверенностью могу сказать что при попытке открыть свой интернет ресурс вы обнаружите что он не работает. Вот тут то и пригодятся все наши сохранённые предупреждения при удалении, обновлении и установке новых пакетов.
Ошибки в логах установки/удаления
В моем случае было несколько предупреждений:
warning: /etc/nsswitch.conf created as /etc/nsswitch.conf.rpmnew;
предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave;
предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave.
Как видите система сказала что в двух случаях она создала новые файлы а старые сохранила с пометкой rpmsave. В случае когда система не смогла создать новый файл она создала его с пометкой rpmnew.
Любыми удобными вам способами сохраните копии созданных новых рабочих файлов. Необходимый вам код из старых сохраненных обновлением файлов перенесите в новые рабочие файлы. Мне было необходимо отредактировать два файла /etc/php-fpm.d/www.conf и /etc/php.ini.
На моих системах, с которыми я работаю, мне не доставляет это большого труда, так как весь код что я правлю документируется. Всегда комментирую старый код и пишу новый с пометками. При таком подходе мне проще понять код и тому кто будет работать с системой после меня будет проще разобраться при возникновении проблем.
Настройка PHP-FPM после обновления
Так как у нас работает Nginx и для связки с php используется php-fpm мы проверим необходимую службу:
systemctl status php-fpm.service
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Из вывода мы видим что служба остановлена и отсутствует в автозагрузке. Добавим в автозагрузку, запустим и посмотрим статус:
systemctl enable php-fpm.service
= вывод команды =
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
systemctl start php-fpm.service
= вывод команды говорящей об ошибке запуска=
Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details.
systemctl status php-fpm.service
= вывод части команды =
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Пт 2017-09-15 22:00:06 MSK; 13s ago
Process: 11678 ExecStart=/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf (code=exited, status=78)
Main PID: 11678 (code=exited, status=78)
[15-Sep-2017 22:00:06] ERROR: [/etc/php-fpm.d/www.conf:2] value is NULL for a ZEND_INI_PARSER_ENTRY
сен 15 22:00:06 lemp.sevo44.loc php-fpm[11678]: [15-Sep-2017 22:00:06] ERROR: Unable to include /etc/php-fpm.d/www.conf from /etc/php-fpm.conf at line 2
сен 15 22:00:06 lemp.sevo44.loc php-fpm[11678]: [15-Sep-2017 22:00:06] ERROR: failed to load configuration file '/etc/php-fpm.conf'
Из вывода команды мы видим ошибку во второй строке файла /etc/php-fpm.d/www.conf. Откроем и посмотрим код:
cat /etc/php-fpm.d/www.conf
= вывод команды =
[www]
#Используем порт 9000 по адресу 127.0.0.1
listen = 127.0.0.1:9000;
listen.allowed_clients = 127.0.0.1
#Пользователь и группа от которой работает php
Видим что вторая строке и отключена знаком #. Посмотрев в сохранном созданном установщиком новом файле увидим что все отключения идут знаком ;. Заменив все знаки # на ; сохраним и перезапустим службу и посмотрим статус:
systemctl restart php-fpm.service
= вывод пустой если нет ошибок =
systemctl status php-fpm.service
= вывод команды =
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Пт 2017-09-15 22:02:48 MSK; 4s ago
Main PID: 11749 (php-fpm)
Status: "Ready to handle connections"
CGroup: /system.slice/php-fpm.service
├─11749 php-fpm: master process (/etc/php-fpm.conf)
├─11750 php-fpm: pool www
сен 15 22:02:48 lemp.sevo44.loc systemd[1]: Starting The PHP FastCGI Process Manager...
сен 15 22:02:48 lemp.sevo44.loc systemd[1]: Started The PHP FastCGI Process Manager.
Видим что служба находится в автозагрузке и работает.
Вывод всех параметров PHP 7
Последнее что нам осталось сделать для полного понимания проделанной работы это посмотреть вывод всей информации о версии php. Создадим на работающем ресурсе в корневой директории сайта файл info.php и поместим туда код:
<?phpphpinfo();?>
Достаточно набрать в строке браузера http://IP или ИМЯ/info.php и вы увидите страницу примерно с таким содержанием:
PHP Version 7.1.8
System
Linux lemp.sevo44.loc 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64
Build Date
Aug 9 2017 19:21:59
Server API
FPM/FastCGI
Virtual DirectorySupport
disabled
Configuration File (php.ini) Path
/etc
Loaded Configuration File
/etc/php.ini
Scan this dir for additional .ini files
/etc/php.d
и тд. и тп.
Вывод
Судя по статье может показаться что обновление версии PHP не такое уж и сложное дело но уверяю что эта простота придет только с опытом. Многое зависит от того как долго не обновляли систему, какие ресурсы там работают и какие у каждого в отдельности требования к версии php. В случае если вам досталась система с которой работали разные люди и мало чего комментировали в коде сложностей может возникнуть очень много и единственное что вас спасет от головной боли в случае неправильной работы важных ресурсов это резервное копирование перед выполнением обновления. Лучшим вариантом при обновлении таких систем это сделать клон системы и производить все действия на нем. Конечно при работе с клоном может возникнуть дополнительные сложности но это уже другая тема.
Установка и настройка MediaWiki c визуальным редактором VisualEditor на CentOS 7. Удобная работа с ресурсом как в локальной сети так и с интернета. Подключим сертификат SSL. Удобное добавление информации гарантия хорошего наполнения сайта.
Введение
Для меня работа с любым сайтом это прежде всего удобство добавления нужной информации. Стандартный редактор добавления статей в MwdiaWiki не удобный, так как всё отображение вносимого текста строится вводом определенных знаков. Добавление редактора WikiEditor немного улучшает вид самой панели но не решает проблему с отображением вводимой информации. Существует замечательное дополнение VisualEditor но при установки оно требует наличия на сервере сервиса Parsoid который необходим для работы. Готового решения для установки его на CentOS 7 из пакетов нет. В статье мы и рассмотрим как установить Parsoid и MediaWiki на одной машине с CentOS 7. Работать ресурс будет на базе Nginx в локальной сети. Для удобной работы с ресурсом как в локальной сети так и с интернета мы сделаем запись в DNS необходимого домена указав нужный статический IP.
Установка MediaWiki на Nginx
Нравится мне работать с Nginx поэтому и стараюсь везде его использовать где это возможно.
Для начала нам надо определиться с версиями которые мы будем устанавливать. На сайте из документации по расширению Extension:VisualEditor сказано что стабильная работа гарантирована на версии MediaWiki ≤ 1.28. Можно попробовать установить и на тестовых версиях, но я не сторонник такого подхода, поэтому будем прислушиваться к рекомендациям и устанавливать стабильные версии.
Из предыдущих статей вы можете узнать все необходимое перед установкой MediaWiki:
nginx -t
= вывод команды =
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Применим изменения.
systemctl reload nginx.service
Непосредственная установка MediaWiki
Теперь для начала установки нам надо либо добавить наш сайт на DNS сервер или прописать нужную строчку в необходимый файл на компьютере с которого будем работать с сайтом. Для систем с Linux надо сделать следующее:
Запись необходимо добавлять если в локальной сети нет DNS сервера. В нашем случае DNS присутствует и все локальные компьютеры будут работать с сайтом в локальной сети без дополнительных настроек.
Набрав в браузере необходимый адрес wiki.sevo44.ru мы попадем на страницу установки MediaWiki.
Внимание! В случае появления ошибки при попытке установки /wiki/mw-config/index.php MediaWiki\Services\ServiceDisabledException from line 340 of /storage/c/12/69/colegiovertice3/public_html/wiki/includes/services/ServiceContainer.php: Service disabled: DBLoadBalancer
Выполните действия
cd /var/lib/php/
chown nginx:nginx session/
Внимательно читайте все что выводит установщик! Варианты установки выбирайте сами исходя из своих пожеланий.
Настройка файла LocalSettings.php для MediaWiki
После установки сделаем небольшие доработки которые нужны практически каждому хозяину сайта MediaWiki.
Свой логотип на сайт MediaWiki
Файл должен иметь размер 160х160 пикселей.
vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое изминение =
$wgLogo = "https://wiki.sevo44.ru/wiki_sevo44.png";
Убираем index.php из URL
В настройках Nginx мы добавили нужный параметр осталось добавить нужный код в файл настройки MediaWiki.
vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Скрываем index.php из url
$wgArticlePath = "/$1";
# /Скрываем index.php из url
Добавляем ico на сайт MediaWiki
Загружаем файл favicon.ico в корень сайта и добавляем строчку в файл настройки.
vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
$wgFavicon="../favicon.ico";
Запрет редактирование не авторизованным пользователям
При установке я сознательно не выбирал установку расширений. Сделаем это вручную. Всю необходимую документацию вы можете найти на странице Extension:WikiEditor/ru.
Согласно документации нам необходимо добавить в файл настроек LocalSettings.php небольшой код.
vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Extension WikiEditor
wfLoadExtension('WikiEditor');
# Расширение включено по умолчанию, однако пользователь может отключить его в настройках.$wgDefaultUserOptions['usebetatoolbar']=1;# Enables link and table wizards by default but still allows users to disable them in preferences$wgDefaultUserOptions['usebetatoolbar-cgd']=1;# Показывает вкладки «Предпросмотра» и «Изменений»$wgDefaultUserOptions['wikieditor-preview']=1;# Показывает кнопки «Публикации» и «Отмены» справа сверху$wgDefaultUserOptions['wikieditor-publish']=1;
# / Extension WikiEditor
Я сознательно в коде который редактирую добавляю пометки для последующей удобной работы с ним как самому так и тем кто будет его смотреть после меня.
# Extension WikiEditor — говорит о начале правки кода.
# / Extension WikiEditor — говорит о конце добавляемого кода.
Установка дополнения VisualEditor
Вся документация по установке находится по ссылке Parsoid/Setup но к сожалению готового пакета для CentOS 7 нет. Мы будем использовать документацию Parsoid/Developer Setup в которой указаны варианты установки на другие системы. Все что надо для работы VisualEditor указано в документации по настройке Extension:VisualEditor. На мой взгляд документация немного не точна и размыта.
Установка Parsoid на CentOS 7
Работать Parsoid будет на той же машине что и MediaWiki. Не вижу смысла поднимать отдельно сервер на другой системе для которой есть готовые пакеты.
Запустим команду установки предварительно зайдя в эту папку с консоли.
cd /opt/parsoid
npm install
= вывод части команды =
npm WARN prefer global jshint@2.9.4 should be installed with -g
> dtrace-provider@0.8.5 install /opt/parsoid/node_modules/dtrace-provider
> node scripts/install.js
parsoid@0.7.1 /opt/parsoid
├── abbrev@1.0.9
├── accepts@1.3.3
├── acorn@5.0.3
и тд. и тп.
Произведем тестирование.
npm test
= часть вывода команды =
Везде должно быть - No errors logged.
В дальнейшем выводе везде должны стоять зелёные галочки!
В моем случае тестирование длилось 8 минут.
Перед тем как приступить к дальнейшей настройке скажем серверу где находится наш сайт.
vi /etc/hosts
192.168.1.101 wiki.sevo44.ru
Отредактируем файл localsettings.js для обратной совместимости, и поддержки не статическиx настроек. Сделаем копию и приведем файл к необходимому виду.
cp localsettings.example.js localsettings.js
vi localsettings.js
= вывод команды с необходимыми изменениями =
'use strict';
exports.setup = function(parsoidConfig) {
// Do something dynamic with `parsoidConfig` like,
parsoidConfig.setMwApi({ uri: 'http://wiki.sevo44.ru/api.php', });
};
По пути wiki.sevo44.ru/api.php у вас обязательно должна открыться страница с заголовком «Справка MediaWiki API». Без открытия этой страницы работать Parsoid не будет.
Скопируем образец и настроим конфигурационный файл Parsoid.
cp config.example.yaml config.yaml
vi config.yaml
= вывод команды с необходимыми настройками =
worker_heartbeat_timeout: 300000
logging:
level: info
services:
- module: lib/index.js
entrypoint: apiServiceWorker
conf:
# For backwards compatibility, and to continue to support non-static
# configs for the time being, optionally provide a path to a
# localsettings.js file. See localsettings.example.js
localsettings: ./localsettings.js
# Set your own user-agent string
# Otherwise, defaults to:
# 'Parsoid/<current-version-defined-in-package.json>'
#userAgent: 'My-User-Agent-String'
# Configure Parsoid to point to your MediaWiki instances.
mwApis:
- # This is the only required parameter,
# the URL of you MediaWiki API endpoint.
uri: 'http://wiki.sevo44.ru/api.php'
# The "domain" is used for communication with Visual Editor
# and RESTBase. It defaults to the hostname portion of
# the `uri` property above, but you can manually set it
# to an arbitrary string. It must match the "domain" set
# in $wgVirtualRestConfig.
domain: 'wiki.sevo44.ru' # optional
Запустим Parsoid выполнив команду из папки /opt/parsoid.
cd /opt/parsoid
npm start
= вывод команды =
> parsoid@0.7.1 start /opt/parsoid
> service-runner
{"name":"parsoid","hostname":"lemp.sevo44.loc","pid":3320,"level":30,"levelPath":"info/service-runner","msg":"master(3320) initializing 4 workers","time":"2017-09-10T15:14:18.866Z","v":0}
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3330,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:22.615Z","v":0}
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3330,"level":30,"levelPath":"info","msg":"ready on :8000","time":"2017-09-10T15:14:22.711Z","v":0}
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3340,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:26.381Z","v":0}
/
Domain should be unique in ParsoidConfig#setMwApi calls: wiki.sevo44.loc
(It doesn't have to be an actual domain, just a unique string.)
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3360,"level":30,"levelPath":"info","msg":"loading ...","time":"2017-09-10T15:14:34.026Z","v":0}
{"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid":3360,"level":30,"levelPath":"info","msg":"ready on :8000","time":"2017-09-10T15:14:34.108Z","v":0}
{"name":"parsoid","hostname":"lemp.sevo44.loc","pid":3320,"level":40,"levelPath":"warn/service-runner","msg":"Startup finished","time":"2017-09-10T15:14:34.111Z","v":0}
Самое главное в выводе это отсутствие ошибок и фраза Startup finished говорящая о том что Parsoid успешно запущен.
Оставляем эту консоль в покое и открываем новую где и будем устанавливать VisualEditor. При работе или ошибках в работе визуального редактора мы сможем увидеть всё в выводе консоли. При настройке такой способ очень удобный. В последствии мы настроим автоматический запуск в системе CentOS 7 создав юнита parsoid.service для работы в systemd.
Создание сервиса parsoid.service для работы в SystemD
Создадим файл с необходимыми настройками.
vi /etc/systemd/system/parsoid.service
= необходимые данные =
[Unit]Description=Mediawiki Parsoid web service on node.js
Documentation=http://www.mediawiki.org/wiki/Parsoid
Wants=local-fs.target network.target
After=local-fs.target network.target
[Install]WantedBy=multi-user.target
[Service]Type=simple
User=nobody
Group=nobody
WorkingDirectory=/opt/parsoid#EnvironmentFile=-/etc/parsoid/parsoid.env
ExecStart=/usr/bin/node /opt/parsoid/bin/server.jsKillMode=process
Restart=on-success
PrivateTmp=trueStandardOutput=syslog
systemctl status parsoid.service
● parsoid.service - Mediawiki Parsoid web service on node.js
Loaded: loaded (/etc/systemd/system/parsoid.service; enabled; vendor preset: disabled)
Active: active (running) since Вс 2017-09-10 23:29:06 MSK; 1min 4s ago
Docs: http://www.mediawiki.org/wiki/Parsoid
Main PID: 908 (node)
CGroup: /system.slice/parsoid.service
├─ 908 /usr/bin/node /opt/parsoid/bin/server.js
├─2324 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
├─2384 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
├─2394 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
└─2409 /usr/bin/node /opt/parsoid/node_modules/service-runner/service-runner.js
сен 10 23:29:28 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:32 lemp.sevo44.loc node[908]: Domain should be unique in ParsoidConfig#setMwApi calls: ....loc
сен 10 23:29:32 lemp.sevo44.loc node[908]: (It doesn't have to be an actual domain, just a unique string.)
сен 10 23:29:32 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:32 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: Domain should be unique in ParsoidConfig#setMwApi calls: ....loc
сен 10 23:29:36 lemp.sevo44.loc node[908]: (It doesn't have to be an actual domain, just a unique string.)
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"lib/index.js","hostname":"lemp.sevo44.loc","pid"...":0}
сен 10 23:29:36 lemp.sevo44.loc node[908]: {"name":"parsoid","hostname":"lemp.sevo44.loc","pid":908,...":0}
Hint: Some lines were ellipsized, use -l to show in full.
Видим что все хорошо.
Установка и настройка VisualEditor
Переходим в папку с расширениями и клонируем себе версию которая стабильная для нашей версии MediaWiki.
На сайте разработчика сказано с какими версиями скинов визуальный редактор совместим. Мне нравится стандартный Vector его и будем использовать.
Добавим необходимые настройки в конфугационный файл.
vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= Необходимое дополнение =
# Extension VisualEditor
wfLoadExtension ( 'VisualEditor' );
// Включение по умолчанию для всех ,
$wgDefaultUserOptions['visualeditor-enable'] = 1;
// Дополнительно: Набор VisualEditor по умолчанию для анонимных пользователей
// в противном случае им придется перейти на VE
// $wgDefaultUserOptions['visualeditor-editor'] = "visualeditor";
// Не позволяют пользователям отключить его
$wgHiddenPrefs[] = 'visualeditor-enable';
// ВАРИАНТ: Включить экспериментальный код VisualEditor о функциях
#$wgDefaultUserOptions['visualeditor-enable-experimental'] = 1;
# Для Parsoid
$wgVirtualRestConfig['modules']['parsoid'] = array(
// URL to the Parsoid instance
// Use port 8142 if you use the Debian package
'url' => 'http://wiki.sevo44.ru:8000',
// Parsoid "domain", see below (optional)
'domain' => 'wiki.sevo44.ru',
// Parsoid "prefix", see below (optional)
'prefix' => 'wiki.sevo44'
);
# /Для Parsoid
# /Extension VisualEditor
После всех проделанных действий вы увидите напротив статьи две ссылки «Править» и «Править вики-текст». Дальше рассказывать нет смысла сами всё поймёте.
Доступ к локальному сайту из интернета
Для доступа с интернета необходимо сделать следующее:
Иметь статический IP;
Пробросить до локальной машины необходимый 443 порт;
Сделать запись в DNS указав необходимый IP и доменное имя.
Предпочитаю использовать DNS для домена компании Yandex. Достаточно добавить запись «wiki — A — IP» и через несколько часов всё заработает.
Вывод
Каждый сайт создается для выполнения определенных задач. Ведение общей документации большого количества людей где всегда можно посмотреть всю историю работы с каждой страницей не зря завоевал большого количества пользователей этого ресурса. Упускаю количество дополнений и удобств которые могут сильно улучшить возможности сайта.
Основные моменты работы с базами данных MariaDB из консоли. Не всегда под рукой имеется PhpMyAdmin, который удобен в работе а произвести необходимые работы с базами необходимо. Будьте внимательность при работе в консоли!
Введение
В статье вы узнаете как можно работать с базами данных MariaDB из консоли.
mysql -u root -p
= вывод команды =
Enter password: указываем пароль root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 100985
Server version: 5.5.50-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
Вывод списка имеющихся баз
MariaDB [(none)]> SHOW DATABASES;
= вывод команды =
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wiki_sevo44 |
+--------------------+
4 rows in set (0.01 sec)
Просмотр базы с выводом параметров
MariaDB [(none)]> SHOW CREATE DATABASE `wiki_sevo44`;
= вывод команды =
+-----------+--------------------------------------------------------------------+
| Database | Create Database |
+-----------+--------------------------------------------------------------------+
| wiki_sevo44 | CREATE DATABASE `wiki_sevo44` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-----------+--------------------------------------------------------------------+
1 row in set (0.00 sec)
Подключение к необходимой базе
MariаDB [(none)]> USE wiki_sevo44;
= вывод команды =
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariаDB [wiki-sevo44]>
Для работы с базой необходимо после создания добавить пользователя к этой базе и назначить права.
Добавление базы с параметрами
MariаDB [(none)]> CREATE DATABASE `base` CHARACTER SET utf8COLLATE utf8_general_ci;
= вывод команды =
Query OK, 1 row affected (0.00 sec)
Удаление базы
MariaDB [(none)]> DROP DATABASE `base`;
= вывод команды =
Query OK, 0 rows affected (0.01 sec)
Просмотр пользователей с выводом их прав
MariaDB [(none)]> SELECT User,Host FROM mysql.user;
= вывод команды =
+--------+-----------+
| User | Host |
+--------+-----------+
| root | localhost |
| mysql | localhost |
+--------+-----------+
2 rows in set (0.005 sec)
Права пользователя баз данных MariaDB
В случае необходимости подключатся к базе с других компьютеров необходимо создать пользователя с нужным параметром и дать права на доступ в настройках сервера MariaDB!
Права на доступ к серверу баз данных делается в двух местах:
Параметр bind-address=0.0.0.0 в конфигурационном файле самого сервера баз MariaDB разрешающий подключатся с любого адреса (или укажите конкретный IP) в разделе [mysqld] ;
Права пользователя на возможность удаленного подключения к базе данных.
Для работы с базами мне удобно использовать PhpMyAdmin и эта программа позволяет настроить доступ к базам работающих на разных серверах.
Менять права пользователя root не желательно, но можно создать пользователя и дать ему полные права. Держать ещё одного пользователя с полными правами не разумно, но иногда необходимо. Добавляются пользователю полные права командой:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* to 'имя пользователя'@'%';
После добавления пользователя с полными правами и имеющегося PhpMyAdmin настроенного для подключения к другим серверам баз данных, можно зайти и создать все необходимые базы и пользователей.
Например, ниже представлена полная версия команд после выполнения которых будет создан пользователь sevo44 с полными правами:
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.4.8-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE USER `sevo44`@`%` IDENTIFIED BY 'ПАРОЛЬ';
Query OK, 0 rows affected (0.008 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* to 'sevo44'@'%';
Query OK, 0 rows affected (0.017 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> exit
Bye
Для безопасности я никогда не создаю пользователя с полными правами который может подключатся с удаленных мест. Для каждой базы свой пользователь!
В случае если надо поменять права имеющемуся пользователю это делается следующей командой, после подключения к серверу баз данных:
# Команда смены прав доступа пользователя на подключение с любого адреса (параметр %)
MariaDB [(none)]> UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='имя_пользователя';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
# Команда смены прав доступа на базы
MariaDB [(none)]> UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='имя_пользователя';
Query OK, 0 rows affected (0.03 sec)
Rows matched: 0 Changed: 0 Warnings: 0
Добавление пользователя
# Права на доступ только с localhost
MariаDB [(none)]> CREATE USER `base_user`@localhost IDENTIFIED BY 'ПАРОЛЬ';
# Права на доступ с любого адреса (при использовании знаков в названиях код заключается в кавычки!
MariаDB [(none)]> CREATE USER `base_user`@`%` IDENTIFIED BY 'ПАРОЛЬ';
# Права на доступ с адреса 10.10.0.2 (при использовании знаков в названиях код заключается в кавычки!
MariаDB [(none)]> CREATE USER `base_user`@`10.10.0.2` IDENTIFIED BY 'ПАРОЛЬ';
= правильный вывод команды для любой команды =
Query OK, 0 rows affected (0.10 sec)
Назначение пользователя базе
# При назначении прав выставляем пользователя с нужными правами!
MariaDB [(none)]> GRANT ALL PRIVILEGES ON base.* to base_user@localhost;
= вывод команды =
Query OK, 0 rows affected (0.04 sec)
После всех манипуляция с базами необходимо обновить права доступа
Резервное копирование и восстановление баз MariaDB
Создадим необходимую папку для бэкапов и перейдем в неё
mkdir backup
cd backup
Создание резервной копию базы с указанием даты создания
mysqldump -u base_user -p base > base-dump_10092017.sql
= вывод команды =
Enter password: вводим пароль пользователя базы и жмем Enter
Восстановление резервной копии базы
mysql -u base_user -p base < base-dump_10092017.sql
= вывод команды =
Enter password: вводим пароль пользователя базы и жмем Enter
Вывод
В консоли без проблем можно делать все основные манипуляции с базой данных. Для более удобной работы удобней использовать PhpMyAdmin, установку и настройку которой я рассмотрел в своей статье PhpMyAdmin на Nginx.
FirewallD появился в CentOS 7 и на первый взгляд может вам показаться неудобным. Рассмотрим основные моменты работы с сервисом который удовлетворит большинство потребностей стандартного сервера. Тонкая настройка возможна при доскональном изучении руководства.
Вступление
С появлением FirewallD многие советуют отключать его и пользоваться старым проверенным механизмом iptables. Мне обычно надо открывать доступ по определенным службам или портам, делать шлюз для выхода в интернет и пробрасывать необходимые порты или службы внутрь локальной сети. Все эти настройки делаются просто, если понять суть и логику работы о которой я и расскажу.
Установка и команды работы сервиса FirewallD
Проверка наличия
systemctl status firewalld
= вывод команды =
Unit firewalld.service could not be found.
Особое внимание хочу сразу обратить на параметр —permanent который указывается в командах. Команды введенные в консоли без этого флага будут работать только в период данной сессии. После перезагрузки службы или компьютера все настройки вернутся в начальное состояние. Не забывайте этот важный момент! На практике это очень удобно использовать, когда надо дать временный доступ или настраиваете и хотите проверить как будут работать настройки. Если что то пошло не так достаточно перезагрузить сервер и все вернется в исходное состояние.
Применение изменений FirewallD
После каждого введенного нового правила необходимо их применить чтобы они стали работать
firewall-cmd --reload
= вывод команды =
success
Вывод «success» после любой команды показывает что все хорошо и команда выполнена успешно.
Что такое Зоны в FirewallD
Просмотр списка всех имеющихся зон
firewall-cmd --get-zones
= вывод команды =
work drop internal external trusted home dmz public block
Каждая зона имеет свои установки по умолчанию и имеет определенный набор правил. Вы можете использовать их и настраивать имеющиеся зоны или создать свои с необходимыми настройками.
Добавление своей зоны
firewall-cmd --permanent --new-zone=custom_zone
Важно понять то что каждый сетевой интерфейс может быть привязан только к одной зоне. К любой зоне можно привязать хоть все интерфейсы. Зоной по умолчанию считается public и именно туда и попадут все подключенные сетевые интерфейсы.
Изменение зоны по умолчанию
firewall-cmd --permanent --set-default-zone=home
После этого все новые подключенные сетевые интерфейсы попадут в эту зону.
Примеры настройки FirewallD
Рассмотрим все основные моменты настройки. Первое что нам надо это вывести и посмотреть настройки всех зон.
Просмотр всех зон
firewall-cmd --list-all-zones
= вывод части команды =
work
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
internal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
external
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: yes
forward-ports:
sourceports:
icmp-blocks:
rich rules:
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
Из вывода мы видим настройки каждой зоны. Полный вывод не всегда удобен и поэтому лучше вывести список активных зон.
Вывод активных зон
firewall-cmd --get-active-zones
= вывод команды =
public
interfaces: enp0s3 enp0s8
Видим что есть два сетевых интерфейса которые работают согласно правилам зоны public.
Информация о конкретной зоне
firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
В выводе мы видим по каким правилам работает активная зона.
Создание правил для зоны FirewallD
Правила можно создавать как для сервисов так и для необходимых портов и их диапазонов.
В случае если необходимо понять какие порты работают в сервисе можно это посмотреть в файле (на примере ssh)
cat /usr/lib/firewalld/services/ssh.xml
= вывод команды =
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
Из вывода видно что сервис SSH работает на 22 порту. Все сервисы вы можете посмотреть в папке /usr/lib/firewalld/services/ и при необходимости по аналогии можно добавить любой свой сервис указав все необходимые параметры. Можно изменить порт по которому будет работать ssh в файле или добавить нужный порт в необходимую зону, все зависит от ваших пожеланий.
Добавление разрешение для службы http в зоне public и применим изменении:
firewall-cmd --permanent --zone=public --add-service=http
= вывод команды =
success
firewall-cmd --reload
= вывод команды =
success
Правила для портов
Добавление необходимого порта в зону public
firewall-cmd --permanent --zone=public --add-port=25555/tcp
= вывод команды =
success
firewall-cmd --reload
= вывод команды =
success
Добавление диапазона портов в зоне public
firewall-cmd --permanent --zone=public --add-port=49000-55000/tcp
= вывод команды =
success
firewall-cmd --reload
= вывод команды =
success
Удаление ненужного сервиса с зоны public
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
= вывод команды =
success
firewall-cmd --reload
= вывод команды =
success
Настройка сетевых интерфейсов в FirewallD
Для начала нам надо понять где сидят сетевые интерфейсы
ip addr
= вывод команды =
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:05:ba:20 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.172/24 brd 192.168.0.255 scope global dynamic enp0s3
valid_lft 31948sec preferred_lft 31948sec
inet6 fe80::37:68ea:f655:3c2c/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:a8:9d:bf brd ff:ff:ff:ff:ff:ff
inet 10.10.0.1/24 brd 10.10.0.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fea8:9dbf/64 scope link
valid_lft forever preferred_lft forever
Из вывода видно что enp0s3 работает с внешней сетью а enp0s8 с внутренней.
Отнесем внешнюю сеть в зону external а внутреннюю в зону internal.
Существует два способа назначения интерфейса в зону:
При понимании устройства и принципа работы нового брандмауэра произвести базовые настройки не вызывает сложности. Можно настраивать и более тонко использую все возможности новой системы, но это отдельная тема.
Обслуживание компьютеров, ремонт, лечение вирусов, модернизация. Системы на ОС Linux. Создание и продвижение Интернет проектов. Бесплатные консультации. Офисные АТС. Видеонаблюдение.