Создание шаблона VDS с Zabbix 5 на CentOS 8

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

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!



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

С 5-ой версией в Zabbix пришло множество улучшений, среди которых множество новых шаблонов и плагинов для различных сервисов, новые интеграции с системами оповещений и уведомлений, улучшена визуализация, а так же улучшена безопасность, за счет добавления пользовательских секретных макросов для хранения такой чувствительной информации как пароли и API-ключи и возможности включить шифрование между компонентами Zabbix с использованием TLS.

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



Как мы создавали этот образ: требования к серверу


Для использования Zabbix 5 рекомендуется использовать 2 Гб RAM и 2 ядра CPU.

Основные файлы Zabbix занимают около 20 Мб, дополнительно вам понадобится место для хранения базы данных, резервных копий, которое будет зависить от количества узлов которые вы планируете мониторить и количества хранимых метрик.

Веб-интерфейс Zabbix может использовать Apache или Nginx с PHP 7.2+, а в качестве базы данных MySQL, PostgreSQL, Oracle или SQLite.

Мы будем создавать образ с использованием Nginx и MySQL.

Подготовка образа


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

sudo dnf update -y

Добавим постоянное разрешение для входящего трафика на http/80, https/443, tcp/10051 (zabbix trapper) порты и перезагрузим правила файрвола:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=10051/tcp

Применим новые правила файрвола:
sudo systemctl reload firewalld

Установим nginx:

dnf install nginx -y

Запустим и включим сервер Nginx:

sudo systemctl start nginx
sudo systemctl enable nginx

Установим PHP, PHP-FPM, и требуемые модули PHP:

dnf install php-fpm php-cli php-mysqlnd php-json php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip -y

Установим MySQL Server:

dnf install mysql-server -y

Включим и запустим сервер MySQL:

systemctl start mysqld
systemctl enable mysqld

Так как мы делаем шаблон для VDS, а они могут быть медленными, добавим задержку старта mysqld 30 секунд, иначе могут быть проблемы со стартом сервера при первоначальной загрузке системы:

sudo sed -i '/Group=mysql/a \
ExecStartPre=/bin/sleep 30
' /usr/lib/systemd/system/mysqld.service

Изменим группу и пользователя из под которого будет работать nginx внеся изменения в /etc/php-fpm.d/www.conf:

sudo sed -i --follow-symlinks 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf
sudo sed -i --follow-symlinks 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf

Изменим владельца каталога сессий PHP так же соответственно на nginx:

sudo chown -R nginx. /var/lib/php/session

Удалим строки с коментариями из файла конфигурации /etc/nginx/nginx.conf (что бы не было двойных срабатываний для sed):

sudo sed -i -e '/^[ \t]*#/d'  /etc/nginx/nginx.conf

Добавим в /etc/nginx/nginx.conf настройки компрессии gzip

sudo sed -i '/types_hash_max_size 2048;/a \
\
    gzip on;\
    gzip_static on;\
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;\
    gzip_comp_level 9;\
    gzip_proxied any;\
    gzip_min_length 1000;\
    gzip_disable "msie6";\
    gzip_vary on; \
' /etc/nginx/nginx.conf

Добавим в /etc/nginx/nginx.conf настройки индексного файла index.php:

sudo sed -i '/        root         \/usr\/share\/nginx\/html;/a \
        index index.php index.html index.htm;\
' /etc/nginx/nginx.conf

Добавим настройки для дефолтного сервера обработку php через сокет php-fpm, отключим лог для статических файлов, увеличим время expire, отключим лог доступа и ошибок для favicon.ico и robots.txt и запретим доступ к файлам .ht для всех:

sudo sed -i '/        location \/ {/a \
		try_files $uri $uri/ /index.php?q=$uri&$args;\
        }\
    \
        location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {\
        access_log off;\
        expires max;\
        }\
    \
        location ~ \.php$ {\
        try_files  $uri =404;\
        fastcgi_pass   unix:/run/php-fpm/www.sock;\
        fastcgi_index index.php;\
        include fastcgi_params;\
        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;\
        }\
    \
        location = /favicon.ico {\
        log_not_found off;\
        access_log off;\
        }\
    \
        location = /robots.txt {\
        allow all;\
        log_not_found off;\
        access_log off;\
        }\
    \
        location ~ /\.ht {\
        deny all;' /etc/nginx/nginx.conf

Установим wget требуемый для установки certbot:

sudo dnf install wget -y

Скачаем исполняемый файл certbot с оффсайта:

cd ~
wget https://dl.eff.org/certbot-auto

Переместим certbot в /usr/local/bin/:

mv certbot-auto /usr/local/bin/certbot-auto

И назначим права и владельцем root:

chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto

Установим зависимости certbot: (ответ Y в конвеер на вопрос установки зависимостей, и --install-only, что бы не инициировать установку сертификатов на данном этапе):

yes | certbot-auto --install-only

Установим репозиторий Zabbix, что бы дать пользователю возможность его без проблем обновлять:

dnf install https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm -y

Установим сервер, агент и утилиты Zabbix:

dnf install zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get -y

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

Создадим базу данных Zabbix (так же можно запустить клиент mysql и вводить команды заключенные в двойные кавычки в интерактивном режиме):

mysql -uroot -e "CREATE DATABASE zabbix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin;"

Создадим пользователя mysql zabbix с пустым паролем:

mysql -uroot -e "CREATE USER 'zabbix'@'localhost' IDENTIFIED BY '';"

Предоставим все привелегии пользователю zabbix на базу zabbix

mysql -uroot -e "GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';"

Загрузим схему zabbix в базу данных:

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix zabbix

Установим шаблон конфигурации Zabbix для Nginx:

dnf install zabbix-nginx-conf -y

Удалим подстроку из дефолтного конфига nginx, т.к. default_server будет определен в zabbix.conf:

sed -i --follow-symlinks 's/default_server//g' /etc/nginx/nginx.conf

Добавим строку default_server в конфигурацию сервера zabbix для Nginx:

sed -i '/#        server_name     example.com;/a \
        listen          80 default_server;\
        server_name     _;\
' /etc/nginx/conf.d/zabbix.conf

Изменим пользователя PHP-FPM с apache на nginx для Zabbix:

sed -i --follow-symlinks 's/user = apache/user = nginx/g' /etc/php-fpm.d/zabbix.conf
sed -i --follow-symlinks 's/group = apache/group = nginx/g' /etc/php-fpm.d/zabbix.conf

Установим временную зону в php.ini (Zabbix проверяет наличие этой настройки при установке):

sed -i --follow-symlinks 's/;date.timezone =/date.timezone = Europe\/Moscow/g' /etc/php.ini


Назначим владельцем каталога /etc/zabbix nginx (для корректной записи конфигурации веб-сервером):

chown -R nginx. /etc/zabbix

Назначим группу каталога zabbix для /etc/zabbix/zabbix_* (Для чтения файлов конфигурации Zabbix сервером и агентом):

chown :zabbix /etc/zabbix/zabbix_*

Перезапустим и активируем сервисы Zabbix server и Zabbix agent:

systemctl restart zabbix-server zabbix-agent nginx php-fpm
systemctl enable zabbix-server zabbix-agent php-fpm

Далее создадим скрипт в домашнем каталоге root который по запросу пользователя сгенерирует и установит пароли для root и zabbix и скорректирует их в конфигурации сервера Zabbix и веб-интерфейса Zabbix. Воспользуемся перенаправлением heredoc с делимитером POSTINSTALL, что бы записать скрипт «как есть», без раскрытия специальных символов:

cat <<"POSTINSTALL" > /usr/local/bin/secure_mysql
#!/bin/bash
# Сгенерируем пароль для пользователей MySQL root и zabbix, используя openssl с вырезанием символов =+/ и сохраним их в переменных:
ZABBIXPASS="$(openssl rand -base64 29 | tr -d "=+/" | cut -c1-25)"
ROOTPASS="$(openssl rand -base64 29 | tr -d "=+/" | cut -c1-25)"
# Установим новые пароли пользователям:
mysql -uroot -e "ALTER USER 'zabbix'@'localhost' IDENTIFIED BY '$ZABBIXPASS';"
mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$ROOTPASS';"
# И выведем их в консоль
echo "New password for zabbix@localhost: $ZABBIXPASS"
echo "New password for root@localhost: $ROOTPASS"
# Запишем новый пароль zabbix в /etc/zabbix/zabbix_server.conf:
sed -i --follow-symlinks "s/# DBPassword=/DBPassword=${ZABBIXPASS}/g" /etc/zabbix/zabbix_server.conf
# Запишем новый пароль zabbix в /etc/zabbix/web/zabbix.conf.php:
sed -i --follow-symlinks "s/\['PASSWORD'\]\s*=\s''/\['PASSWORD'\] = '${ZABBIXPASS}'/g" /etc/zabbix/web/zabbix.conf.php
# Перезапустим затронутые сервисы:
systemctl restart zabbix-server zabbix-agent nginx php-fpm
# Обнулим переменные
ZABBIXPASS=
ROOTPASS=
# Удалим файл, так как после того как пароли установлены, он более не нужен:
rm -f /usr/local/bin/secure_mysql
POSTINSTALL

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

chmod +x /usr/local/bin/secure_mysql

На данном этапе все настройки выполнены, остается выключить сервер и сделать снапшот:

shutdown -h now

После этого, развернув новый сервер из образа, мы, в роли пользователя, можем перейти по ссылке с адресом сервера, например: http://vps_ip_address/
На странице DB connection оставить настройки по умолчанию, так как на данном этапе у пользователя MySQL zabbix пустой пароль. На странице Zabbix server details, можно указать название экземпляра сервера в поле Name, или оставить пустым.
После этого войдем в панель управления с логином Admin и паролем zabbix (логин и пароль по умолчанию для новых установок сервера Zabbix), и в разделе Administration — UsersAdmin установим новый пароль для учетной записи администратора сервера.
Что бы обезопасить себя от возможных инцидентов связанных с SQL-иньекциями, мы сгенерируем пароли для пользователей MySQL root и zabbix подключившись к серверу через ssh и выполнив скрипт:

secure_mysql

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

New password for zabbix@localhost: sdfiUB34xudgsRMiwKdd90spW
New password for root@localhost: Z1b0HjjyDJYQEtXqNWPaSySnH

Скрипт установит пароли в конфигурационных файлах сервера Zabbix, поэтому на этом этапе установку можно считать завершенной.

Настройка HTTPS


Опционально можно настроить использование сертификатов Let's Encrypt с помощью ранее установленного certbot'a, для этого необходимо указать действующее доменное имя сервера в файле /etc/nginx/conf.d/zabbix.conf исправив параметр server, например:

server_name zabbix.mydomainname.ru;

Перезапустим веб-сервер:

service nginx restart

Запустим certbot:

/usr/local/bin/certbot-auto --nginx

Введем свой e-mail, cогласимся с условиями сервиса (A), Подписка на рассылку (опционально) (N), выберем доменные имена для которых нужно издать сертификат (Enter для всех).

В случае если все прошло без ошибок, мы увидим сообщение об успешной выдаче сертификатов и настройке сервера:

Congratulations! You have successfully enabled ...

После этого подключения на 80 порт будут перенаправляться на 443 (https).
Добавим в /etc/crontab для автоматического обновления сертификатов:
# Cert Renewal
30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"


Готово, теперь у нас есть готовый сервер Zabbix с настроенными сертификатами Let's Encrypt!

Для владельцев бизнеса: предложите свой софт


Если вы — разработчик софта, который разворачивают и используют на VPS, то мы можем включить вас в маркетплейс. Так мы можем помочь вам привести новых клиентов, трафик и узнаваемость. Пишите нам

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


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

Чего вам не хватает в маркетплейсе RUVDS?

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



Источник: https://habr.com/ru/company/ruvds/blog/526598/


Интересные статьи

Интересные статьи

Предисловие: в моем случае нужен был загрузочный usb накопитель c "HirensBootCD", но потратил день я так и не нашел нормальной статьи как его сделать из под mac os, а также все ...
Данное руководство, является "форком" одноименной статьи про CentOS 5.9, и учитывает особенности новой OS. На данный момент в AWS Marketplace нет официального образа Centos8 от centos....
Здравствуйте. Меня зовут Сергей, и в этой статье я расскажу о том, как мы сделали арт-объект для мероприятия Burning Man. Я расскажу о технической стороне, не касаясь самого мероприятия. Ну, почт...
Cтатья будет полезна тем, кто думает какую выбрать CMS для интернет-магазина, сравнивает различные движки, ищет в них плюсы и минусы важные для себя.
Всем привет! Сегодня делимся с вами познавательным материалом, перевод которого подготовлен специально для студентов курса «ReactJS/React Native-разработчик». Итак, начнем. Все мы видел...