Архив рубрики: CentOS

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

Рассмотрим обновление на PHP 7-ой версии в системе CentOS 7 работающей с Nginx. Произведем настройку после обновления необходимых конфигурационных файлов для работы ресурсов использующих php. Процесс обновления сложный требующий внимания и ответственности.

Введение

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

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

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

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

Удаление старой версии PHP

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

Подготовка перед удалением

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

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

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

rpm -qa | grep php
= вывод команды =
php-pecl-jsonc-1.3.10-2.el7.remi.5.6.x86_64
php-pdo-5.6.31-1.el7.remi.x86_64
php-pecl-memcache-3.0.8-4.el7.remi.5.6.x86_64
php-soap-5.6.31-1.el7.remi.x86_64
php-mbstring-5.6.31-1.el7.remi.x86_64
php-common-5.6.31-1.el7.remi.x86_64
php-xml-5.6.31-1.el7.remi.x86_64
php-cli-5.6.31-1.el7.remi.x86_64
php-pear-1.10.5-2.el7.remi.noarch
php-gd-5.6.31-1.el7.remi.x86_64
php-mysqlnd-5.6.31-1.el7.remi.x86_64
php-xmlrpc-5.6.31-1.el7.remi.x86_64
php-imap-5.6.31-1.el7.remi.x86_64
php-fpm-5.6.31-1.el7.remi.x86_64
php-snmp-5.6.31-1.el7.remi.x86_64
php-pecl-zip-1.15.1-1.el7.remi.5.6.x86_64
php-process-5.6.31-1.el7.remi.x86_64
php-odbc-5.6.31-1.el7.remi.x86_64
php-ldap-5.6.31-1.el7.remi.x86_64
php-opcache-5.6.31-1.el7.remi.x86_64

Исходя из вывода удалим все эти пакеты. Новую версию php мы будем устанавливать с другого репазитория. Репозиторий remi нам больше не нужен и мы его удалим.

Удаление PHP 5.6

Удалим одной командой:

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

Внимательно смотрим лог обновления на предмет ошибок и предупреждений! Сохраните все ошибки и предупреждения. Уверяю в последствии это сильно сократит время в настройке после обновления!

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

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

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

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

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

yum repolist

Установка PHP 7.1

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

yum install php71w-fpm php71w-pdo php71w-soap php71w-mbstring php71w-common php71w-xml php71w-cli php71w-pear php71w-gd php71w-mysqlnd php71w-xmlrpc php71w-imap php71w-fpm php71w-snmp php71w-process php71w-odbc php71w-ldap php71w-opcache

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

Можем уставим все что есть, но решать вам самим что для вас лучше:

yum install php70w-cli php70w-common php70w-bcmath php70w-dba php70w-devel php70w-embedded php70w-fpm php70w-gd php70w-imap php70w-interbase php70w-intl php70w-ldap php70w-mbstring php70w-mcrypt php70w-mysql php70w-odbc php70w-opcache php70w-pdo php70w-pdo_dblib php70w-pear php70w-process php70w-pspell php70w-recode php70w-tidy php70w-xml php70w-xmlrpc

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

Проверка после обновления 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 и поместим туда код:

<?php phpinfo(); ?>

Достаточно набрать в строке браузера 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 Directory Support 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

Установка и настройка 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:

Ниже я лишь приведу некоторые моменты и необходимые настройки для работы MediaWiki на NGINX.

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

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

cd /web/sites/wiki.sevo44.ru

Скачаем необходимую нам версию.

wget https://releases.wikimedia.org/mediawiki/1.28/mediawiki-1.28.2.tar.gz
= вывод команды =
--2017-09-10 14:30:11-- https://releases.wikimedia.org/mediawiki/1.28/mediawiki-1.28.2.tar.gz
Распознаётся releases.wikimedia.org (releases.wikimedia.org)... 91.198.174.217, 2620:0:862:ed1a::3:d
Подключение к releases.wikimedia.org (releases.wikimedia.org)|91.198.174.217|:443... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: 32965916 (31M) [application/x-gzip]
Сохранение в: «mediawiki-1.28.2.tar.gz»

100%[======================================>] 32 965 916 2,35MB/s за 11s

2017-09-10 14:30:23 (2,77 MB/s) - «mediawiki-1.28.2.tar.gz» сохранён [32965916/32965916]

Распаковываем архив.

tar -zxvf mediawiki-1.28.2.tar.gz

Переименовываем папку mediawiki-1.28.2 в www.

mv mediawiki-1.28.2 www

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

chown -R nginx:nginx /web/sites/wiki.sevo44.ru

Параметры настройки MediaWiki для Nginx c SSL

Создадим необходимые настройки для работы MediaWiki в Nginx c SSL сертификатом.

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

vi /etc/nginx/conf.d/wiki.sevo44.conf
= необходимые параметры =
# wiki.sevo44.ru
server {
# Переводим на nttps. http2 - включит работу сайта по этому протоколу!
listen 443 ssl http2;
#listen 80;
server_name wiki.sevo44.ru www.wiki.sevo44.ru;
root /web/sites/wiki.sevo44.ru/www/;
index index.php index.html index.htm;
access_log /web/sites/wiki.sevo44.ru/log/access.log main;
error_log /web/sites/wiki.sevo44.ru/log/error.log;
# Для ssl
ssl_certificate /etc/letsencrypt/live/wiki.sevo44.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.sevo44.ru/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#### ssl_ciphers "HIGH:!RC4:!aNULL:!MD5:!kEDH";
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header Strict-Transport-Security 'max-age=604800';
#/ Для ssl
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^/(.*)$ /index.php?title=$1&$args;
}
location ^~ /maintenance/ {
return 403;
}
 
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
try_files $uri /index.php;
expires max;
log_not_found off;
}
location = /_.gif {
expires max;
empty_gif;
}
location ^~ /cache/ {
deny all;
}
#gzip on; #включаем сжатие gzip для ускорения отдачи страниц
#gzip_min_length 1000;
#gzip_proxied expired no-cache no-store private auth;
#gzip_types text/plain application/xml;
location ~ \.php$ {
#try_files $uri $uri/ /index.php?$args;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param DOCUMENT_ROOT /web/sites/wiki.sevo44.ru/www/;
fastcgi_param SCRIPT_FILENAME /web/sites/wiki.sevo44.ru/www$fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /web/sites/wiki.sevo44.ru/www$fastcgi_script_name;
fastcgi_param PHP_VALUE "
max_execution_time = 30
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 32M
max_input_time = 60
date.timezone = Europe/Moscow
#always_populate_raw_post_data = -1
";
include fastcgi_params;
fastcgi_param QUERY_STRING $query_string;
#fastcgi_param REQUEST_METHOD $request_method;
#fastcgi_param CONTENT_TYPE $content_type;
#fastcgi_param CONTENT_LENGTH $content_length;
#fastcgi_intercept_errors on;
#fastcgi_ignore_client_abort off;
#fastcgi_connect_timeout 60;
#fastcgi_send_timeout 180;
#fastcgi_read_timeout 180;
#fastcgi_buffer_size 128k;
#fastcgi_buffers 4 256k;
#fastcgi_busy_buffers_size 256k;
#fastcgi_temp_file_write_size 256k;
}
}
# Редирект с http
server {
listen 80;
server_name wiki.sevo44.ru www.wiki.sevo44.ru;
rewrite ^ https://wiki.sevo44.ru$request_uri? permanent;
}

Проверим правильность.

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 надо сделать следующее:

cat /etc/hosts
= необходимое дополнение =
192.168.1.101 wiki.sevo44.ru

Запись необходимо добавлять если в локальной сети нет 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";

Запрет редактирование не авторизованным пользователям

Добавим нужный код в файл настройки MediaWiki.

vi /web/sites/wiki.sevo44.ru/www/LocalSettings.php
= необходимое дополнение =
# Запрет редактирования не авторизованным
$wgGroupPermissions['*']['createaccount'] = true;
$wgGroupPermissions['*']['read'] = true;
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createtalk'] = false;
# /Запрет редактирования не авторизованным

Установка дополнения WikiEdit

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

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

yum install nodejs npm vim-enhanced git policycoreutils-python
= вывод команды =
Ошибка: Пакет: 1:nodejs-6.11.1-1.el7.x86_64 (epel)
 Необходимо: http-parser >= 2.7.0
Ошибка: Пакет: 1:nodejs-6.11.1-1.el7.x86_64 (epel)
 Необходимо: libhttp_parser.so.2()(64bit)

Как видим установить не удалось из за того что http-parser должен быть >= 2.7.0.

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

yum install https://kojipkgs.fedoraproject.org//packages/http-parser/2.7.1/3.el7/x86_64/http-parser-2.7.1-3.el7.x86_64.rpm

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

yum -y install nodejs npm vim-enhanced git policycoreutils-python

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

node --version
v6.11.1

Создадим папку opt в корне сервера куда и будем устанавливать.

mkdir /opt
cd /opt

Выполним клонирование.

git clone https://gerrit.wikimedia.org/r/p/mediawiki/services/parsoid
= вывод команды =
Cloning into 'parsoid'...
remote: Counting objects: 502, done
remote: Finding sources: 100% (124/124)
remote: Getting sizes: 100% (69/69)
remote: Compressing objects: 100% (2232324/2232324)
remote: Total 49985 (delta 46), reused 49937 (delta 40)
Receiving objects: 100% (49985/49985), 12.28 MiB | 1.72 MiB/s, done.
Resolving deltas: 100% (40561/40561), done.

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

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.js
KillMode=process
Restart=on-success
PrivateTmp=true
StandardOutput=syslog

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

systemctl enable parsoid.service
systemctl start parsoid.service

Проверим как работает сервис.

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.

cd /web/sites/wiki.sevo44.ru/www/extensions/
git clone -b REL1_28 https://gerrit.wikimedia.org/r/p/mediawiki/extensions/VisualEditor.git
= вывод команды =
Cloning into 'VisualEditor'...
remote: Counting objects: 2101, done
remote: Finding sources: 100% (109865/109865)
remote: Getting sizes: 100% (9091/9091)
remote: Compressing objects: 100% (368092/368092)
remote: Total 109865 (delta 87211), reused 109794 (delta 87171)
Receiving objects: 100% (109865/109865), 20.18 MiB | 1.18 MiB/s, done.
Resolving deltas: 100% (87211/87211), done.

Перейдем в папку VisualEditor и выполним важную команду без которой по заверению разработчиков визуальный редактор работать не будет!

cd ./VisualEditor
git submodule update --init
= вывод команды =
Submodule 'lib/ve' (https://gerrit.wikimedia.org/r/p/VisualEditor/VisualEditor.git) registered for path 'lib/ve'
Cloning into 'lib/ve'...
remote: Counting objects: 3549, done
remote: Finding sources: 100% (108614/108614)
remote: Getting sizes: 100% (5062/5062)
remote: Compressing objects: 100% (468795/468795)
remote: Total 108614 (delta 91819), reused 108561 (delta 91798)
Receiving objects: 100% (108614/108614), 20.37 MiB | 1.29 MiB/s, done.
Resolving deltas: 100% (91819/91819), done.
Submodule path 'lib/ve': checked out '5fc8c7f0fe9da80aa97c456fa323acb8685bb792'

На сайте разработчика сказано с какими версиями скинов визуальный редактор совместим. Мне нравится стандартный 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

После всех проделанных действий вы увидите напротив статьи две ссылки «Править» и «Править вики-текст». Дальше рассказывать нет смысла сами всё поймёте.

Доступ к локальному сайту из интернета

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

  1. Иметь статический IP;
  2. Пробросить до локальной машины необходимый 443 порт;
  3. Сделать запись в DNS указав необходимый IP и доменное имя.

Предпочитаю использовать DNS для домена компании Yandex. Достаточно добавить запись «wiki — A — IP» и через несколько часов всё заработает.

Вывод

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

MariaDB работа из консоли

Основные моменты работы с базами данных MariaDB из консоли. Не всегда под рукой имеется PhpMyAdmin, который удобен в работе а произвести необходимые работы с базами необходимо. Будьте внимательность при работе в консоли!

Введение

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

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

Просмотр из консоли баз 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 [wiki-sevo44]> SHOW tables;
= вывод команды =
+-----------------------+
| Tables_in_wiki_sevo44 |
+-----------------------+
| l10n_cache |
| langlinks |
| log_search |
| logging |
| module_deps |
| objectcache |
| user_former_groups |
| user_groups |
| user_newtalk |
| user_properties |
| valid_tag |
| watchlist |
+-----------------------+
12 rows in set (0.00 sec)

Просмотр содержания нужной таблицы

MariаDB [wiki-sevo44]> SELECT * FROM page;
= вывод команды =
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
| page_id | page_namespace | page_title | page_restrictions | page_is_redirect | page_is_new | page_random | page_touched | page_links_updated | page_latest | page_len | page_content_model | page_lang |
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
| 1 | 0 | Заглавная_страница | | 0 | 1 | 0.6843282599 | 20170826182609 | NULL | 1 | 1035 | wikitext | NULL |
| 2 | 0 | Тестовая 3 | | 0 | 1 | 0.485584249082 | 20170830191050 | 20170830191052 | 2 | 20 | wikitext | NULL |
| 3 | 0 | Тестовая | | 0 | 1 | 0.027751067675 | 20170831130200 | 20170831130201 | 3 | 19 | wikitext | NULL |
| 4 | 0 | Тестовая 2 | | 0 | 0 | 0.213026978763 | 20170831131024 | 20170831131025 | 6 | 1120 | wikitext | NULL |
+---------+----------------+-------------------------------------+-------------------+------------------+-------------+----------------+----------------+--------------------+-------------+----------+--------------------+-----------+
4 rows in set (0.00 sec)

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

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

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

MariаDB [(none)]> CREATE DATABASE `base` CHARACTER SET utf8 COLLATE 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!

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

  1. Параметр bind-address=0.0.0.0 в конфигурационном файле самого сервера баз MariaDB разрешающий подключатся с любого адреса (или укажите конкретный IP) в разделе [mysqld] ;
  2. Права пользователя на возможность удаленного подключения к базе данных.

Для работы с базами мне удобно использовать 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)

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

MariаDB [(none)]> FLUSH PRIVILEGES;
= вывод команды =
Query OK, 0 rows affected (0.02 sec)

Выход с сервера MariaDB

Выход производиться командой

MariаDB [(none)]> exit
= вывод команды =
Bye

Резервное копирование и восстановление баз 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 базовая настройка

FirewallD появился в CentOS 7 и на первый взгляд может вам показаться неудобным. Рассмотрим основные моменты работы с сервисом который удовлетворит большинство потребностей стандартного сервера. Тонкая настройка возможна при доскональном изучении руководства.

Вступление

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

Установка и команды работы сервиса FirewallD

Проверка наличия

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

Установка

Установим FirewallD вез вопросов

yum -y install firewalld

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

systemctl enable firewalld
systemctl start firewalld

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

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

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

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

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

Опция —permanent для FirewallD

Особое внимание хочу сразу обратить на параметр —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

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

Правила для сервисов

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

firewall-cmd --get-services
= вывод команды =
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server

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

Существует два способа назначения интерфейса в зону:

  • Удалить из текущей зоны и добавить в новую;
  • Сразу назначить в нужную зону.

Удаление и добавление

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

Назначение в нужную зону

firewall-cmd --permanent --zone=external --change-interface=enp0s3
firewall-cmd --permanent --zone=internal --change-interface=enp0s8

Настройка интернет шлюза

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

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

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

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

firewall-cmd --permanent --zone=external --add-masquerade

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

Проброс порта на внутреннюю сеть

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

Пробросим порт на котором работает SSH до компьютера внутренней сети с адресом 10.10.0.10

firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toaddr=10.10.0.10

firewall-cmd --reload

Можно пробросить входящие на 22 порт с изменением порта назначения (с 22 на 20155):

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

firewall-cmd --reload

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

###
firewall-cmd --get-active-zones
= посмотрим активные зоны =
internal
 interfaces: enp0s8
external
 interfaces: enp0s3
###
firewall-cmd --list-all --zone=internal
= посмотрим внутреннюю зону =
internal (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s8
 sources: 
 services: mdns samba-client ssh http https
 ports: 
 protocols: 
 masquerade: no
 forward-ports: 
 sourceports: 
 icmp-blocks: 
 rich rules: 
###
firewall-cmd --list-all --zone=external
= посмотрим внешнюю зону =
external (active)
 target: default
 icmp-block-inversion: no
 interfaces: enp0s3
 sources: 
 services: ssh
 ports: 
 protocols: 
 masquerade: yes
 forward-ports: port=22:proto=tcp:toport=:toaddr=10.10.0.10
 sourceports: 
 icmp-blocks: 
 rich rules:

Результат

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

PXE загрузочный сервер

Настроим загрузочный PXE сервер. Загрузить настроенную операционную систему на компьютере без жесткого диска всегда приятно. Использовать утилиты для диагностики и работы с жесткими дисками удобно и практично. Настройка на любом дистрибутиве Linux.

Введение

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

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

  • Загружать операционную систему Calculate Linux,
  • Проверить память программой Memtest86+,
  • Проверить жесткие диски программами MHDD и Victoria,
  • Работать с жесткими дисками программой Clonezilla.

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

Подготовка системы для работы PXE сервера

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

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

yum -y install dhcp xinetd tftp tftp-server nfs-utils syslinux

Настройка DHCP сервера

В локальной сети должен работать только один сервер DHCP.

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

Параметры сетевой карты которая смотрит во внутреннюю сеть:

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=no
IPV6_DEFROUTE=no
IPV6_PEERDNS=no
IPV6_PEERROUTES=no
IPV6_FAILURE_FATAL=no
NAME=enp0s8
UUID=d785f929-dcfb-436a-8ba7-59189a394aa6
DEVICE=enp0s8
# Загрузка при старте
ONBOOT=yes
IPADDR=192.168.1.1
PREFIX=24

Как видна моя внутренняя локальная сеть будет 192.168.1.0/24

Приведем конфигурационный файл DHCP сервера к следующему виду:

vim /etc/dhcp/dhcpd.conf
= вывод команды с необходимыми изменениями =
default-lease-time 32400;
max-lease-time 604800;
min-lease-time 7200;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0 {
option domain-name "sevo44.loc";
option domain-name-servers 192.168.1.1;
range 192.168.1.150 192.168.1.220;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option ntp-servers 192.168.1.1;
#PXE SERVER IP
next-server 192.168.1.1;
filename "pxelinux.0";
}

Добавляем в автозагрузку:

systemctl enable dhcpd

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

systemctl start dhcpd

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

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

host hp4530 {
hardware ethernet 64:31:50:95:b1:b7; 
fixed-address 192.168.1.5;
}

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

systemctl restart dhcpd

Настройка TFTP сервера

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

vim /etc/xinetd.d/tftp
= вывод команды с необходимыми изменениями =
service tftp
 {
 socket_type = dgram
 protocol = udp
 wait = yes
 user = root
 server = /usr/sbin/in.tftpd
 # Путь для расположения файлов
 server_args = -s /var/lib/tftpboot
 # Для включения поменяем yes на no
 disable = no
 per_source = 11
 cps = 100 2
 flags = IPv4
 }

Добавляем в автозагрузку:

systemctl enable xinetd

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

systemctl start xinetd

Настройка NFS сервера

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

vim /etc/exports
= вывод команды с необходимыми изменениями =
/var/lib/tftpboot/ 192.168.1.0/24(rw,no_root_squash)

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

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

/sevo44/pve/backup 192.168.0.100(rw,sync,no_root_squash,no_all_squash)

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

  • /sevo44/pve/backup — расшариваемая директория;
  • 192.168.0.100 — IP адрес клиента с которого может быть подключение (можно указать 192.168.0.0/24 тогда будет возможность подключения для всей под сети);
  • rw – доступ на чтение и запись (может принимать значение ro-только чтение);
  • sync – синхронный режим доступа(может принимать обратное значение- async). sync (async) — указывает, что сервер должен отвечать на запросы только после записи на диск изменений, выполненных этими запросами. Опция async указывает серверу не ждать записи информации на диск, что повышает производительность, но понижает надежность, т.к. в случае обрыва соединения или отказа оборудования возможна потеря данных;
  • no_root_squash – запрет подмены uid/gid для суперпользователя (root). По умолчанию пользователь root на клиентской машине не будет иметь доступа к разделяемой директории сервера. Этой опцией мы снимаем это ограничение. В целях безопасности этого лучше не делать;
  • all_squash / no_all_squash — установка подмены идентификатора от всех пользователей all_squash — подмена запросов от ВСЕХ пользователей (не только root) на анонимного uid/gid, либо на пользователя, заданного в параметре anonuid/anongid. Используется обычно для публичного экспорта директорий. no_all_squash — запрет подмены uid/gid для от всех пользователей.

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

mkdir -p /sevo44/pve/backup
chmod -R 777 /sevo44/pve/backup

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

firewall-cmd --permanent --add-port=111/tcp
firewall-cmd --permanent --add-port=54302/tcp
firewall-cmd --permanent --add-port=20048/tcp
firewall-cmd --permanent --add-port=2049/tcp
firewall-cmd --permanent --add-port=46666/tcp
firewall-cmd --permanent --add-port=42955/tcp
firewall-cmd --permanent --add-port=875/tcp
firewall-cmd --permanent --zone=public --add-service=nfs
firewall-cmd --permanent --zone=public --add-service=mountd
firewall-cmd --permanent --zone=public --add-service=rpc-bind
= применим изменения =
firewall-cmd --reload

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

Добавляем в автозагрузку:

systemctl enable nfs-server

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

systemctl start nfs-server

Создание загрузочного меню PXE сервера

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

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot
cp /usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot
cp /usr/share/syslinux/memdisk /var/lib/tftpboot
cp /usr/share/syslinux/mboot.c32 /var/lib/tftpboot
cp /usr/share/syslinux/chain.c32 /var/lib/tftpboot

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

mkdir /var/lib/tftpboot/pxelinux.cfg

Создание главного меню PXE сервера

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

Создадим файл главного меню:

mcedit /var/lib/tftpboot/pxelinux.cfg/default
= необходимые параметры с комментариями =
default vesamenu.c32
# Фон для меню
menu background backgrounds/fon.png
prompt 0
# Время через которое стартует первый пункт меню
timeout 100

menu title ##### PXE BOOT MENU: #####

Label 10
menu label Calculate 17 KDE & SEVO44
kernel live/calculate/cld17kde/boot/vmlinuz
append initrd=live/calculate/cld17kde/boot/initrd root=nfs:192.168.1.1:/var/lib/tftpboot/live/calculate/cld17kde calculate=lang:ru_RU,keymap:ru_RU,timezone:Europe/Moscow rw selinux=0

LABEL # ADMIN SETTINGS

LABEL 20
# Пароль для запуска
menu passwd 777
MENU LABEL Utilits
KERNEL vesamenu.c32
APPEND pxelinux.cfg/utilits

Label # BOOT LOCAL

label 30
menu label Boot from local drive
localboot 0

Файл фонового изображения меню должен быть размером 640х480 пикселей, в формате PNG или JPEG.

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

mkdir /var/lib/tftpboot/live
mkdir /var/lib/tftpboot/backgrounds

Загружаем необходимый iso образ любыми удобными вам способами и копируем содержимое в нужную папку.

При использовании образа с графической оболочкой KDE для стабильной работы необходимо использовать 4 G оперативной памяти!

Приведу лишь команды которые необходимы для монтирования и размонтирования образа iso:

mount -o loop /root/calculate_kde_sevo44.iso /mnt/iso
umount /mnt/iso

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

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

Моё главное меню:

Создание подменю для PXE сервера

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

Мой файл подменю для utilits выглядит так:

mcedit /var/lib/tftpboot/pxelinux.cfg/utilits
= вывод команды с пояснениями =
default vesamenu.c32
menu background backgrounds/fon.png

menu title ##### Utilits: #####

label # TEST

LABEL 10
MENU LABEL Memtest86+
KERNEL utilits/memtest86

LABEL 11
MENU LABEL MHDD
kernel memdisk
initrd utilits/mhdd32ver4.6.iso
append iso raw

LABEL 12
MENU LABEL Victoria 3.5 HDD
kernel memdisk
initrd utilits/v35.iso
append iso raw

label # Backup/Recovery

LABEL 20
MENU LABEL Clonezilla Live 2.5.2-17
KERNEL utilits/zilla/live/vmlinuz
APPEND initrd=utilits/zilla/live/initrd.img boot=live username=user union=overlay config components quiet noswap edd=on nomodeset nodmraid locales=ru_RU.UTF-8 keyboard-layouts=NONE ocs_live_run="ocs-live-general" ocs_live_extra_param="" video=uvesafb:mode_option=1024x768-16 ocs_live_batch=no net.ifnames=0 nosplash noprompt fetch=tftp://192.168.1.1/utilits/zilla/live/filesystem.squashfs

Label ###
LABEL 30
MENU LABEL NEXT
KERNEL vesamenu.c32
APPEND pxelinux.cfg/default

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

Скачать утилиты использованные в данном описании.

Моё меню с утилитами:

Видео

На видео показано как работает система Calculate Linux которую я настроил под свои нужды запускаемая с помощью PXE сервера.

Вывод

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

Conky удобный мониторинг системы

Рассмотрим основные моменты по работе с замечательной программой Conky которая позволяет выводить на рабочий стол любые параметры вашей системы показывая все процессы компьютера в реальном времени. Универсальная настройка для любой OC Linux.

Вступление

Удобное и информативное отображение параметров системы и особенно отображение тех параметров которые мне хочется видеть была одной из моих главных пожеланий при настройке любой системы. Первое время я пытался добавлять на панели разные аплеты с выводом информации, но все это не совсем удобно. Когда первый раз познакомился с Сonky мне было не удобно настраивать его и каждый раз при переустановке системы лезть в настройки и настраивать. К моей радости один из пользователей Calculate Linux, который регулярно выкладывает свои сборки, в сборку добавляет свой подход к настройкам Conky его то я и взял за основу.

Установка Conky

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

Calculate Linux или Gentoo:

emerge conky

Debian

apt-get install conky

CentOS

yum install conky

Управление Conky

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

conky

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

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

Остановить можно командой из под пользователя:

killall conky

Удобный подход к работе с Conky

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

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

  • Ложу папку my_conky туда куда мне удобно,
  • Папку со шрифтами копирую в папку /usr/share/fonts/,
  • Добавляю в автозагрузку файл start-conky.sh в котором прописаны параметры запуска.

Файл необходимо сделать запускаемым. В консоли команда: chmod +x /путь до/start-conky.sh

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

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

Файл настроек Conky

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

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

###############################
# Настройки Алексея Долотова #
# для сайта sevo44.ru #
###############################
update_interval 1
total_run_times 0
net_avg_samples 1
cpu_avg_samples 1
if_up_strictness link
# imlib_cache_size 0
double_buffer yes
no_buffers yes
format_human_readable
#######################
# Текстовые настройки #
#######################
use_xft yes
xftfont Ubuntu:size=8
override_utf8_locale yes
text_buffer_size 2048
#####################
# Оконная специфика #
#####################
own_window_class Conky
own_window yes
#own_window_type conky
own_window_argb_visual yes
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
border_inner_margin 4
border_outer_margin 1
alignment top_right
gap_x 15
gap_y 15
minimum_size 182 700
maximum_width 182
default_bar_size 60 8
# use_xft yes
# xftfont caviar dreams:size=8
# xftalpha 0.5
# uppercase no
#########################
# Графические настройки #
#########################
# draw_outline no
draw_borders no
draw_graph_borders no
draw_shades yes
default_color cccccc
color0 D3D2D5
color1 77507b
color2 F2F2F2
color3 5C3566
######################################
# Начало кода вывода после кода TEXT #
######################################
TEXT
###########
# Система #
###########
!!! Часть кода скрыл. Все увидите в скаченном архиве my_conky !!!
#########
# Конец #
#########

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

Под моим контролем всегда:

  • Состояние работы процессора,
  • Загруженность памяти и какие ресурсы кушают больше всего,
  • Какие приложения занимают ресурсы процессора,
  • Информация о свободном месте на диске,
  • Результат работа обоих сетевых карт, проводной и wi-fi,
  • Информация о назначенных IP адресах.

Результат

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

Duplicity для бэкапа VDS

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

Введение

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

Установка Duplicity

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

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

yum -y install epel-release

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

yum -y install duplicity

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

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

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

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

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

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

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

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

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

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

yum -y install davfs2

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

mkdir /mnt/ydisk_backup_vds

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

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

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

umount /mnt/ydisk_backup_vds

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

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

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

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

mkdir /restore

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

Работа с Duplicity

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Результат

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

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

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

Введение

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

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

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

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

yum -y install epel-release

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

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

Отключим SELinux:

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

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

setenforce 0

Настройка FirewallD

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

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

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

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

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

yum -y install firewalld

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

systemctl enable firewalld
systemctl start firewalld

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

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

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

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

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

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

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

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

Проверим:

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

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

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

yum install proftpd proftpd-utils

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

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

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

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

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

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

ftpasswd: entry created

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

systemctl enable proftpd
systemctl start proftpd

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

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

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

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

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

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

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

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

ftptop

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

 ftpwho

Логи сервиса

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

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

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

Настройка:

 

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

Вывод

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