Создание шаблона VDS с Zabbix 5 на CentOS 8
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 — Users — Admin установим новый пароль для учетной записи администратора сервера.
Что бы обезопасить себя от возможных инцидентов связанных с 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?
Что каждый уважающий себя хостинг должен обязательно включить в свой маркетплейс?