Передовые виртуальные и выделенные серверы для проектов любой сложности и структуры.
 Подписывайтесь на Telegram канал!

Настроим веб-сервер LEMP использующий службы Nginx, MariaDB и PHP на сборке CSS от Calculate Linux (Gentoo). Давно успешно использую версии Calculate Linux на рабочих компьютерах и прошло время применения на рабочих серверах.

Введение

На своем рабочем компьютере я уже давно использую дистрибутивы Calculate Linux и вот добрались руки до внедрения этого дистрибутива на рабочие сервера. Работать с системой Gentoo без большого опыта в системах Linux очень сложно, но разработчики Calculate Linux сильно упростили установку и работу с системой и постоянно ведут работы по улучшению своих утилит. Пакеты как правило используются свежие что не может не радовать. Настроим первый рабочий сервер на сборке CSS на котором будут работать интернет ресурсы. СSS это самый минимальный набор очень похожий на то как выглядит дистрибутивы c понятием minimall в CentOS или netinst в Debian.

Настройка времени на LEMP сервере

За правильность времени отвечает локализация в системе. Смена локализации в дистрибутивах Calculate Linux выполняется командой:

cl-setup-locale --timezone Europe/Moscow 
= вывод команды =
 * Настройка локализации и времени ... [ ok ] 
 * Система настроена!

Проверим время на сервере lepm:

date
=вывод команды =
Пн ноя 13 19:14:56 MSK 2017

Время отстаёт на 3 часа. Посмотрим время UTC:

date -u
= вывод команды =
Пн ноя 13 16:15:04 UTC 2017

Видим что разница в 3 часа а значит локализация работает правильно остается только правильно настроить время UTC.

Установим пакет с помощью которого мы исправим время на правильное:

emerge -av net-misc/ntp

При установке любого пакета на lepm сервер добавляйте команду —ask! Команда выведет всю информацию перед установкой и ознакомившись с ней вам надо будет принять решение.

Произведем синхронизацию с сервером времени:

ntpdate pool.ntp.org

Настройка Iptables скриптом

По умолчанию iptables работает и полностью открыт в чем можно убедиться выполнив команду:

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

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

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

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

vim /root/iptables.sh
= необходимые добавления =
#!/bin/bash 
# Очистка всех цепочек iptables
iptables -F 
iptables -X 
iptables -Z 
# Политики для трафика, не соответствующего ни одному правилу
iptables -P INPUT DROP 
iptables -P FORWARD DROP 
iptables -P OUTPUT ACCEPT 
# Разрешаем Ping
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Прочие настройки
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT 
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT 
iptables -A INPUT -p tcp --syn --dport 113 -j REJECT --reject-with tcp-reset 
# Доступ по ssh 
iptables -A INPUT -p TCP --dport 22 -j ACCEPT 
# Доступ к webserver по http и https
iptables -A INPUT -p TCP --dport 80 -j ACCEPT 
iptables -A INPUT -p TCP --dport 443 -j ACCEPT 
# Сохраняем правила 
#Calculate/Gentoo хранит в /var/lib/iptables/rules-save 
rc-service iptables save

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

chmod +x /root/iptables.sh

Осталось выполнить скрипт для внесения правил:

Будьте очень внимательны при составлении скрипта дабы не потерять доступ к серверу! Убедитесь что порт для доступа к ssh в скрипте соответствует работающему на сервере!

sh /root/iptables.sh     
= вывод команды =
iptables          | * Saving iptables state ...       [ ok ]

Просмотр правил iptables

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

iptables -L -v -n 
= вывод команды =
Chain INPUT (policy DROP 31 packets, 2260 bytes) 
 pkts bytes target     prot opt in     out     source               destination          
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 0 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11 
    6   504 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8 
   91  8220 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED 
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0            
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11 
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 12 
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:113 flags:0x17/0x02 reject-with tcp-reset 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 
 
Chain FORWARD (policy DROP 0 packets, 0 bytes) 
 pkts bytes target     prot opt in     out     source               destination          
 
Chain OUTPUT (policy ACCEPT 80 packets, 9864 bytes) 
 pkts bytes target     prot opt in     out     source               destination

Видим что все правила что нам надо выполнились.

Смена порта SSH сервера

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

  • Меняется порт в файле настройки
vim /etc/ssh/sshd_config
= вывод команды с необходимыми изменениями =
#Port 22
Port 20000
  • Перезапускается сервис SSH
/etc/init.d/sshd restart 
= вывод команды =
sshd         | * Caching service dependencies ...     [ ok ] 
sshd         | * Stopping sshd ...                    [ ok ] 
sshd         | * Starting sshd ...                    [ ok ]

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

ssh -p 20000 root@192.168.0.100

Установка и настройка Nginx на Calculate Linux

Хорошую альтернативу Apach придумал Игорь Сысоев. Работать одно удовольствие, а главное все быстро и идеально подходит для высоко нагруженных сайтов. Для мало нагруженных увеличение скорости тоже очень важно. После перехода с Apach на Nginx скорость работы ресурсов приятно радует. Стараюсь везде использовать Lemp сервер в замену старому Lamp работающему на Apach.

За основу взяли инструкция с Wiki Gentoo. Всё на русском и очень подробно описано.

Установка Nginx

Установим главный компонент Lemp сервера:

emerge -av www-servers/nginx
= вывод команды =
Local copy of remote index is up-to-date and will be used.

* IMPORTANT: 2 news items need reading for repository 'gentoo'.
* Use eselect news read to view new items.

These are the packages that would be merged, in order:

Calculating dependencies... done!
[binary N ] www-servers/nginx-1.12.1 USE="http http-cache http2 ipv6 pcre ssl threads -aio -debug -libatomic (-libressl) -luajit -pcre-jit -rtmp (-selinux) -vim-syntax" NGINX_MODULES_HTTP="access auth_basic autoindex browser charset empty_gif fastcgi geo gzip limit_conn limit_req map memcached proxy referer rewrite scgi split_clients ssi upstream_hash upstream_ip_hash upstream_keepalive upstream_least_conn upstream_zone userid uwsgi -addition -auth_ldap -auth_pam -auth_request -cache_purge -dav -dav_ext -degradation -echo -fancyindex -flv -geoip -gunzip -gzip_static -headers_more -image_filter -lua -memc -metrics -mogilefs -mp4 -naxsi -perl -push_stream -random_index -realip -secure_link -security -slice -slowfs_cache -spdy -sticky -stub_status -sub -upload_progress -upstream_check -xslt" NGINX_MODULES_MAIL="-imap -pop3 -smtp" NGINX_MODULES_STREAM="-access -geo -geoip -limit_conn -map -realip -return -split_clients -ssl_preread -upstream_hash -upstream_least_conn -upstream_zone"

Would you like to merge these packages? [Yes/No] yes
>>> Emerging binary (1 of 1) www-servers/nginx-1.12.1::gentoo
>>> Installing (1 of 1) www-servers/nginx-1.12.1::gentoo
>>> Recording www-servers/nginx in "world" favorites file...
>>> Jobs: 1 of 1 complete Load avg: 0.49, 0.16, 0.06

* Messages for package www-servers/nginx-1.12.1:

*
* This nginx installation comes with a mitigation for the HTTPoxy
* vulnerability for FastCGI, SCGI and uWSGI applications by setting
* the HTTP_PROXY parameter to an empty string per default when you
* are sourcing one of the default
*
* - 'fastcgi_params' or 'fastcgi.conf'
* - 'scgi_params'
* - 'uwsgi_params'
*
* files in your server block(s).
*
* If this is causing any problems for you make sure that you are sourcing the
* default parameters _before_ you set your own values.
* If you are relying on user-supplied proxy values you have to remove the
* correlating lines from the file(s) mentioned above.
*
>>> Auto-cleaning packages...

>>> No outdated packages were found on your system.

* IMPORTANT: 2 news items need reading for repository 'gentoo'.
* Use eselect news read to view new items.

Запуск и проверка работы

Стандартная конфигурация nginx предполагает работу с корневым каталогом в /var/www/localhost/htdocs. Установка создаёт только каталог /var/www/localhost, без папки htdocs и индексного файла.

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

mkdir /var/www/localhost/htdocs
 echo 'Hello, sevo44!' > /var/www/localhost/htdocs/index.html

Пакет nginx включает в себя init-скрипт, позволяющий останавливать, запуска и перезапускать службу веб-сервера. Для запуска службы nginx выполним следующую команду:

/etc/init.d/nginx start
= вывод команды =
nginx  | * Checking nginx' configuration ...            [ ok ] 
nginx  | * Starting nginx ...                           [ ok ]

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

rc-update add nginx default

Чтобы проверить, что nginx работает и есть доступ, в консоли сервера выполним команду которая откроет страницу сайта воспользовавшись консольным веб-клиентом curl:

curl http://localhost
= вывод команды =
Hello, sevo44!

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

curl: (7) Failed to connect to 192.168.0.141 port 80: В соединении отказано

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

Конечно лучше в сети иметь DNS сервер куда прописать пути для всех ресурсов работающих на lemp сервере. Если этого нет, то достаточно добавить код в нужный файл на локальном компьютере и доступ будет осуществлять по требуемому имени. Вот пример как будет выглядеть строка для моего PhpMyAdmin который будет работать по адресу pmalempcss.sevo44.loc на машине с ip адресов 192.168.0.141:

vim /etc/hosts
= необходимое добавление =
192.168.0.141 pmalempcss.sevo44.loc

Главный конфигурационный файл NGINX

Все настройки как самого Nginx так и ресурсов которые на нем работают прописываются в файле /etc/nginx/nginx.conf.

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

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

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig
vim /etc/nginx/nginx.conf
= часть вывода команды с пояснениями =
 user nginx nginx;
 worker_processes 4; --- выставляем по количеству процессоров

Варианты конфигурации для сайтов

Дальше надо определится как будем работать с настройкой сайтов.
Существует два пути:

  • редактирование всё в одном файле,
  • для каждого сайта сделать свой файл настроек.

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

Для этого в файле /etc/nginx/nginx.conf в блоке http добавим в конце нужную строку и удалим блоки server. В результате получим такой код:

cat /etc/nginx/nginx.conf 
= вывод команды с информацией он необходимых изменениях =
user nginx nginx; 
worker_processes 4; 
 
error_log /var/log/nginx/error_log info; 
 
events { 
        worker_connections 1024; 
        use epoll; 
} 
 
http { 
        include /etc/nginx/mime.types; 
        default_type application/octet-stream; 
 
        log_format main 
                '$remote_addr - $remote_user [$time_local] ' 
                '"$request" $status $bytes_sent ' 
                '"$http_referer" "$http_user_agent" ' 
                '"$gzip_ratio"'; 
 
        client_header_timeout 10m; 
        client_body_timeout 10m; 
        send_timeout 10m; 
 
        connection_pool_size 256; 
        client_header_buffer_size 1k; 
        large_client_header_buffers 4 2k; 
        request_pool_size 4k; 
 
        gzip off; 

        # Скрываем версию nginx
        server_tokens off;
 
        output_buffers 1 32k; 
        postpone_output 1460; 
 
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
 
        keepalive_timeout 75 20; 
 
        ignore_invalid_headers on; 
 
        index index.html; 
 
        include /etc/nginx/conf.d/*.conf; 
 
}

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

mkdir /etc/nginx/conf.d

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

vim /etc/nginx/conf.d/local.conf
= необходимые добавления c комментариями =
 server {
# Порт на котором работает ресурс
 listen 80;
# Название ресурса по которому будет осуществляться доступ
 server_name localhost;
# Пути куда будут писаться логи
access_log /var/log/nginx/localhost.access_log main;
error_log /var/log/nginx/localhost.error_log info;
# Корневая папка ресурса
root /var/www/localhost/htdocs;
}

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

Проверим и произведем применение изменений:

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

/etc/init.d/nginx reload 
= вывод команды =
nginx  | * Checking nginx' configuration ...             [ ok ] 
nginx  | * Refreshing nginx' configuration ...           [ ok ]

Команды управления Nginx

/etc/init.d/nginx stop - остановка
/etc/init.d/nginx start - запуск
/etc/init.d/nginx restart - перезагрузка
nginx -t - проверка изменений в файлах настройки
/etc/init.d/nginx reload - применение изменений

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

Установка PHP для NGINX

Для поддержки php в конфигурацию сайта работающего под nginx необходимо добавить определенный код. В данном примере nginx обменивается информацией с процессом PHP через UNIX-сокет. В блок server надо добавить блок location в котором и будут описаны правила работы с php.

 http {
 ...
 server {
 ...
 location ~ \.php$ {
 try_files $uri =404;
 include /etc/nginx/fastcgi.conf;
 fastcgi_pass unix:/run/php-fpm.socket;
 }
 }
 }

Установка  PHP

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

eix dev-lang/php
= вывод команды =
* dev-lang/php
 Доступные версии: 
 (5.6) 5.6.33 5.6.34 ~5.6.35
 (7.0) 7.0.27 7.0.28 ~7.0.29
 (7.1) 7.1.13 ~7.1.14 7.1.15 ~7.1.16
 (7.2) ~7.2.4

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

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

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

vim /etc/portage/package.mask/custom
= необходимые данные =
>dev-lang/php-7.1

Согласно этого параметра установка версий выше 7.1 запрещена.

Для такой конфигурации Lepm сервера необходимо собрать PHP с поддержкой менеджера процессов FastCGI (dev-lang/php), включив USE-флаг fpm. Для дистрибутива Calculate Linux необходимо выполнить команду:

echo "dev-lang/php fpm" >> /etc/portage/package.use/custom

Советую сразу добавить флаг dev-lang/php mysqli иначе не будет работать PhpMyAdmin из за ошибки «Расширение mysqli не найдено. Пожалуйста, проверьте ваши настройки PHP.» и флагdev-lang/php postgres если планируйте работать с базами PostresQL. Сборка PHP не быстрая имейте это ввиду.

echo "dev-lang/php mysqli postgres" » /etc/portage/package.use/custom

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

echo "dev-lang/php mysqli -postgres" » /etc/portage/package.use/custom

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

Установим PHP с включенными USE-флагоми:

emerge -av dev-lang/php
= вывод части команды =
[binary N ] dev-lang/php-7.0.28:7.1::gentoo USE="acl berkdb bzip2 cgi cli crypt ctype curl exif fileinfo filter fpm ftp gd gdbm hash iconv intl ipv6 json mysql mysqli nls opcache pdo phar posix postgres readline session simplexml sockets ssl threads tokenizer truetype unicode webp xml xmlreader xmlwriter zip zlib -apache2 -bcmath -calendar -cdb -cjk -coverage -debug -embed -enchant (-firebird) -flatfile -gmp -imap -inifile -iodbc -kerberos -ldap -ldap-sasl -libedit -libressl -mhash -mssql -oci8-instant-client -odbc -pcntl -phpdbg -qdbm -recode (-selinux) -session-mm -sharedmem -snmp -soap -spell -sqlite (-systemd) -sysvipc {-test} -tidy -wddx -xmlrpc -xpm -xslt" 

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

Использование UNIX-сокета для взаимодействия Nginx c PHP является предпочтительным и рекомендуемым вариантом!

Информации о версии PHP

php -v
= вывод команды =
PHP 7.2.2 (cli) (built: Feb 19 2018 03:15:04) ( ZTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
 with Zend OPcache v7.2.2, Copyright (c) 1999-2018, by Zend Technologies

Информация о расширениях PHP

Вывод информации о всех имеющихся и работающих расширениях можно командой:

php -m 
= вывод команды =
[PHP Modules] 
bz2 
Core 
ctype 
curl 
date 
dba 
dom 
exif 
fileinfo 
filter 
ftp 
gd 
gettext 
hash 
iconv 
json 
libxml 
mbstring 
mcrypt 
mysqli 
mysqlnd 
openssl 
pcre 
PDO 
pdo_mysql 
pdo_sqlite 
Phar 
posix 
pspell 
readline 
Reflection 
session 
SimpleXML 
sockets 
SPL 
sqlite3 
standard 
tokenizer 
xml 
xmlreader 
xmlwriter 
Zend OPcache 
zip 
zlib 
 
[Zend Modules] 
Zend OPcache

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

Главные настройки находятся в файле php-fpm.conf нам необходимо проверить только наличие необходимой строки:

cat /etc/php/fpm-php7.0/php-fpm.conf 
= необходимый параметр =
include=/etc/php/fpm-php7.0/fpm.d/*.conf

Скопируем и внесем изменения в файл настроек php.ini:

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

Перед запуском php-fpm на lemp сервере нам осталось скопировать оригинал и провести редактирование пула (pool) который будет обслуживать все сайты:

cp /etc/php/fpm-php7.0/fpm.d/www.conf /etc/php/fpm-php7.0/fpm.d/www.conf_orig
vim /etc/php/fpm-php7.0/fpm.d/www.conf
= результат после редактирования =
[www]
user = nginx
group = nginx
;Запуск PHP с поддержкой UNIX-сокета
listen = /run/php-fpm.socket
listen.owner = nginx
listen.group = nginx
pm = dynamic
pm.max_children = 20
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

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

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

/etc/init.d/php-fpm start 
= вывод команды =
php-fpm           | * Testing PHP FastCGI Process Manager configuration ...   [ ok ] 
php-fpm           | * Starting PHP FastCGI Process Manager ...                [ ok ]

Добавим php-fpm в автозагрузку:

rc-update add php-fpm default

Перезагрузим nginx с измененной конфигурацией:

/etc/init.d/nginx reload

Проверка работы php-fpm для Nginx

Самый простой способ это добавить файл с кодом который будет выводить информацию о php и запустить его. Добавим файл с кодом:

vim /var/www/localhost/htdocs/info.php
= необходимый код для добавления =
<?php phpinfo(); ?>

Теперь в браузере наберем нужный путь http://localhost/info.php и в случае успешной настройки увидим страницу с выводом обо всех параметрах php.

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

За основу взята инструкция с Wiki Gentoo.

Обычно я маскирую версию MariaDB по аналогии с версией PHP. У каждого ресурса использующего PHP и базу данных MySQL есть требования к версиям. Чтобы избежать проблемы после обновления лучше обновлять эти версии вручную.

Установим на Lemp сервер MariaDB командой:

emerge -av mariadb

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

emerge --config dev-db/mariadb
= вывод команды с пояснениями =
Configuring pkg... 
 
 * Trying to get password for mysql 'root' user from 'mysql' section ... 
 * Trying to get password for mysql 'root' user from 'client' section ... 
 * Please provide a password for the mysql 'root' user now 
 * or through the /root/.my.cnf file. 
 * Avoid ["'\_%] characters in the password 
    > вводим пароль для root
 * Retype the password 
    > повторяем пароль
 * Creating the mysql database and setting proper permissions on it ... 
 = часть вывода не показана =

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

rc-update add mysql default
= вывод команды =
* service mysql added to runlevel default

Запустим:

rc-service mysql start
= вывод команды =
mysql  | * Checking mysqld configuration for mysql ...    [ ok ] 
mysql  | * Starting mysql ...                             [ ok ]

 Правила доступа к серверу MariaDB

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

vim /etc/mysql/my.cnf
= необходимое изминение =
# Доступ со всех компьютеров
bind-address = 0.0.0.0
# Доступ только с определеного компьютера
#bind-address = 10.10.0.2

Удаление бинарных лог-файлов MySQL

Очень быстро вы заметите что размер папки /var/lib/mysql с базами будет сильно увеликиватся. Увеличение размера дают бинарные лог-файлы MySQL (mysql-bin.000001, mysql-bin.000002 и тд.) для организации репликации, когда несколько баз данных и для восстановления данных в случае сбоя.

Решим эту проблемму очисткой данных свыше 5 дней добавив в секцию [mysqld] конфигурационного файла /etc/mysql/my.cnf, следующие параметры:

vim /etc/mysql/my.cnf
= необходимые параметры =
# Активируем бинарные логи.
log-bin
# Время хранения логов 5 дней
expire_logs_days = 5

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

rc-service mysql restart

Варианты работы с базами MariaDB

Возможно несколько вариантов работы с базами на сервере Lemp. Рассмотрим вариант работы с базами с помощью программы PhpMyAdmin работающую в любом браузере и работу с базами в консоли.

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

Ранее я описывал установку PhpMyAdmin для дистрибутива CentOS. Статья подойдет и для установки на любой другой дистрибутив.

Вначале я произвел установку командой emerge phpmyadmin но мне не понравился этот вариант и я установил всё руками.

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

  • Папка с файлами устанавливается без папки setup в которой лежат файлы для создания конфигурационного файла PhpMyAdmin,
  • Инструкция описывает настройку для Apach,
  • Файл настройки для Nginx не создается.

Создадим необходимые папки:

mkdir -p /var/www/pma/{logs,backup}

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

cd /var/www/pma
wget https://files.phpmyadmin.net/phpMyAdmin/4.7.5/phpMyAdmin-4.7.5-all-languages.zip

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

emerge -av unzip

Распакуем архив zip:

unzip /var/www/pma/phpMyAdmin-4.7.5-all-languages.zip -d /var/www/pma

Переименуем папку phpMyAdmin-4.7.5-all-languages в www:

mv /var/www/pma/phpMyAdmin-4.7.5-all-languages /var/www/pma/www

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

chown -R nginx:nginx /var/www/pma

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

vim /etc/nginx/conf.d/pma.conf  
= вывод команды =
# pmalempcss.sevo44.loc
server { 
        listen 80; 
        server_name pmalempcss.sevo44.loc; 
 
        access_log /var/www/pma/logs/pma.access_log main; 
        error_log /var/www/pma/logs/pma.error_log info; 
 
        root /var/www/pma/www/; 
 
        index index.php index.html index.htm; 
 
 
        location ~ \.php$ { 
               try_files $uri =404; 
               include /etc/nginx/fastcgi.conf; 
               fastcgi_pass unix:/run/php-fpm.socket; 
           } 
 
}

Запустим http://pmalempcss.sevo44.loc/setup откроется страница с выбором параметров и последующим сохранением файла настроек phpmyadmin.

После того как файл настроек config.inc.php будет добавлен в корень сайта доступ к этой папке будет закрыт!

Создадим файл с необходимыми нам настройками PhpMyAdmin:

vim /var/www/pma/www/config.inc.php
= необходимый код для добавления =
<?php
/*
 * Generated configuration file
 * Generated by: phpMyAdmin 4.7.5 setup script
 * Date: Sat, 18 Nov 2017 15:51:14 +0000
 */

/* Servers configuration */
$i = 0;

/* Server: localhost [1] */
$i++;
$cfg['Servers'][$i]['verbose'] = '';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['port'] = '';
$cfg['Servers'][$i]['socket'] = '';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';

/* End of servers configuration */

$cfg['DefaultLang'] = 'ru';
$cfg['blowfish_secret'] = '5"+y<2TqP+qrobW`%c!!9"BRYdIVZGIL';
$cfg['ServerDefault'] = 1;
$cfg['UploadDir'] = '/var/www/pma/backup';
$cfg['SaveDir'] = '/var/www/pma/backup';
?>

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

chown nginx:nginx /var/www/pma/www/config.inc.php

Подключение к удаленному MariaDB серверу

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

vim /var/www/pma/www/config.inc.php 
= необходимый код для добавления =
/* Server: glpi [2] */
$i++;
$cfg['Servers'][$i]['verbose'] = 'glpi';
$cfg['Servers'][$i]['host'] = '10.10.0.6';
$cfg['Servers'][$i]['port'] = '';
#$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['socket'] = '';
#$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';

Колличество блоков может быть не ограниченно.

Работа с базами в консоли

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

Ротация логов сайтов

Перед настройкой убедитесь что установлен пакет app-admin/logrotate отвечающий за ротацию!

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

eix app-admin/logrotate
eix logrotate 
* app-admin/logrotate 
     Доступные версии:      3.9.1 3.12.3-r1 ~3.12.3-r2 3.13.0 {acl +cron selinux} 
     Домашняя страница:     https://github.com/logrotate/logrotate 
     Описание:              Rotates, compresses, and mails system logs 
 
Найдено 1 совпадение.

Видим что в версии CSS его нет. Установим:

emerge -av app-admin/logrotate

Настроим ротацию логов PhpMyAdmin раз в сутки и будем хранить 60 дней. По аналогии я настраиваю так же ротацию и для других веб ресурсов.

vim /etc/logrotate.d/sites
= необходимые параметры =
# Указываем в каждой строчке необходимый сайт
/var/www/pma/logs/*log
{
create 0644 nginx nginx
daily
rotate 60
missingok
notifempty
compress
sharedscripts
postrotate
test -r /run/nginx.pid && kill -USR1 `cat /run/nginx.pid`
 endscript
}

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

logrotate -f /etc/logrotate.conf

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

Настройка Cron

После установки app-admin/logrotate для работы устанавливается cronie работу которого можно проверить выполнив команду:

/etc/init.d/cronie status
= вывод команды =
 * status: started

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

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

eix -Ic app-admin/
= вывод команды =
[I] app-admin/apache-tools (2.4.27{tbz2}@10.08.2017): Useful Apache tools - htdigest, htpasswd, ab, htdbm
[I] app-admin/eselect (1.4.8@23.03.2017): Gentoo's multi-purpose configuration and management tool
[I] app-admin/logrotate (3.13.0{tbz2}@22.11.2017): Rotates, compresses, and mails system logs
[I] app-admin/metalog (3-r2{tbz2}@21.11.2017): A highly configurable replacement for syslogd/klogd
[I] app-admin/perl-cleaner (2.25@06.04.2017): User land tool for cleaning up old perl installs
Найдено 5 совпадение.

Выясняется что установлен app-admin/metalog. Проверим его состояние:

/etc/init.d/metalog status
= вывод команды =
 * status: stopped

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

rc-update add metalog default
/etc/init.d/metalog start

Теперь мы увидели папку /var/log/cron в которой находится файл где пишутся логи заданий cron. В моем случае файл выглядит так:

cat /var/log/cron/current
= часть вывода команды =
Nov 30 23:00:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:00:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:00:01 [run-crons] (root) CMD (/etc/cron.hourly/clocksync)
Nov 30 23:10:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:10:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:20:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:20:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:23:01 [CROND] (root) CMD (/usr/bin/nice -n19 /usr/bin/ionice -c3 /usr/sbin/cl-core --method update --schedule -p --wait-another-update off &>/dev/null)
Nov 30 23:30:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:30:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
Nov 30 23:40:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)
Nov 30 23:40:01 [CROND] (nginx) CMD (php -f /var/www/nextcloud/htdocs/cron.php )
 - Last output repeated twice -
Nov 30 23:50:01 [CROND] (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons)

Лог быстро будет расти поэтому сразу сделаем ему ротацию создав необходимый файл с параметрами:

vim /etc/logrotate.d/cron
= необходимый код =
/var/log/cron/current
{
daily
rotate 60
missingok
notifempty
compress
}

Результат

Базовая настройка lemp сервера произведена без особых сложностей в системе Calculate Linux полностью совместимой с Gentoo . Основная задача настройки сводилась к тому чтобы в будущем установить облачное хранилище NextCloud на этом веб-сервере. В следующей статье NextCloud установка на Nginx будет рассказано про установку NextCloud. Расскажу как подключить бесплатный сертификат SSL. Настроим работу облачного хранилища как в локальной сети так и с интернета. Настроим дополнительные расширения которые сильно улучшают функционал облачного хранилища.

Понравилась статья? Поделитесь ей с друзьями!
Пожалуйста, оставляйте свои комментарии

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

Один комментарий для статьи “LEMP сервер на Calculate Linux

  1. Hi! I could have sworn I’ve been to this blog before but after looking at
    a few of the posts I realized it’s new to me. Regardless,
    I’m definitely happy I came across it and I’ll be bookmarking it and checking back frequently!

Добавить комментарий

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