Zabbix на страже: как я свои VPS под прицел поставил
Зачем вообще Zabbix?
Zabbix — это система мониторинга с открытым кодом, которая с ума сходит от цифр и фактов. Он следит за состоянием серверов, нагрузкой на процессор, памятью, дисковым пространством, сетевыми сервисами и ещё кучей всего. Можно настроить умные тревоги и получать пуши, если сервер вдруг решит устроить забастовку. Ну или если ваш сайт начнёт падать и тормозить.
Кроме того, у Zabbix есть мощнейший инструмент — API Zabbix, который позволяет программно управлять всей системой мониторинга. Через этот API можно запускать команды, изменять настройки, перезапускать службы, добавлять и удалять хосты, а также автоматизировать массу задач — всё это из одного окна и без лишних кликов мышью. Но об этом в другой раз.
У меня теперь появилось несколько VPS, на которых крутятся разные сервисы. Сейчас я смотрю, как на дашборде моего хостинга всё работает, но понимаю, что в будущем могу пользоваться разными хостингами и хотелось бы мониторить всё централизованно. Плюс, Zabbix — это не просто про сервера, он умеет следить за отдельными сервисами, а не только за железом.
Так что решил поднять Zabbix на новом VPS, чтобы испытать всю эту мощь мониторинга своими руками. Характеристики моей боевой машины: Ubuntu 22.04, одно ядро, 1 Гиг оперативы и 10 Гб SSD. Для сайта, Telegram-ботов и VPN-сервера хватит за глаза — чисто чтобы побаловаться и поучиться. Для серьезных дел, конечно, лучше выбрать железо помощнее.
Содержание:
Установка бесплатного SSL-сертификата (Let’s Encrypt) на Nginx для вашдомен.рф
На данном этапе я устанавливаю бесплатный SSL-сертификат от Let’s Encrypt, прежде всего для собственной безопасности и спокойствия. Мне гораздо комфортнее использовать HTTPS, даже если мой Zabbix будет торчать наружу. При этом я уверен, что при правильной настройке сложных логинов и паролей можно обеспечить достаточную защиту доступа, имхо, когда ломанут — тогда и поставлю доступ только с рабочего места и из дома)). Certbot позволяет быстро и автоматически получить и настроить сертификат, добавляя дополнительный уровень безопасности без лишних сложностей.
1. Установите Certbot и модуль Nginx для SSL:
sudo apt install certbot python3-certbot-nginx
2. Получите и установите сертификат для вашего домена:
sudo certbot --nginx -d вашдомен.рф
- Следуйте инструкциям: укажите email, согласитесь с условиями, разрешите редирект с http на https.
- Сертификат автоматически установится, конфиг Nginx будет изменён.
3. Проверьте работу:
- Зайдите на https://вашдомен.рф — должна открыться стандартная страница Nginx, по протоколу https.
Лайфхак для параноиков
Есть удобный лайфхак: если по каким-то причинам у тебя порт 80 обычно закрыт (например, правилами файрвола), можно добавить в кронтаб задачу, которая в определённое время (например, раз в неделю ночью) временно открывает порт 80, обновляет сертификат и сразу закрывает порт обратно. Так твой сервер большую часть времени защищён, а Let’s Encrypt всегда сможет продлить сертификат.
- Открой crontab для редактирования:
sudo crontab -e - Добавь строку:
0 3 * * 0 ufw allow 80 && certbot renew --quiet && ufw deny 80 - Такой способ действительно помогает, если беспокоишься о лишних открытых портах, но хочешь автоматизировать продление сертификатов. В этом случае можно закрыть порт 80 в ufw, так как cron выполняет задания от имени root и в нужное время откроет порт, обновит сертификат и затем закроет порт обратно. Это удобный и безопасный метод для обеспечения автоматического обновления сертификатов без постоянного открытия порта 80.
- Открой crontab для редактирования:
Усиление безопасности VPS
Изменение порта SSH
Далее я изменяю стандартный порт SSH с 22 на другой нестандартный. Это простая, но эффективная мера для повышения безопасности сервера, так как большинство автоматических атак пытаются использовать стандартный порт. Таким образом уменьшается риск взлома через перебор паролей.
- Откройте конфиг SSH:
sudo nano /etc/ssh/sshd_config
- Найдите и измените строку:
наPort 22
(или любой другой свободный порт, например, 12345).Port 22222
- Сохраните файл, перезапустите SSH:
sudo systemctl restart ssh
!Не закрывайте существующее соеденение, пока не протестируете подключение по новому порту, иначе можно заблокировать себя.
Настройка файервола UFW
Затем настраиваем файервол UFW, чтобы ограничить доступ к серверу. Я разрешаю трафик для 443 порта (https), новый порт SSH (указанный ранее), а также порт 10050 для получения данных от Zabbix агента. Благодаря этим настройкам сервер становится более защищённым, пропуская только необходимый трафик.
- Включите UFW, если еще не включен:
sudo ufw enable
- Разрешите новый SSH-порт:
sudo ufw allow 22222/tcp
(или другой порт, который вы указали в sshd_config).
- Откройте порт 443 (доступ HTTPS):
sudo ufw allow 443/tcp
- Откройте стандарнтый порт 10050 или любой свободный для Zabbix Agent:
sudo ufw allow 10050/tcp
- Проверьте правила UFW (итоговый набор правил):
sudo ufw status
Пример вывода:
22222/tcp ALLOW Anywhere
433/tcp ALLOW Anywhere
10050/tcp ALLOW Anywhere
Надо учесть, что по умолчанию все входящие соединения блокируются, кроме явно разрешённых в правилах UFW. Поэтому, если вы не откроете порт 80, обновление сертификата через Let’s Encrypt не пройдёт. В таком случае можно либо открыть порт 80 на постоянно - sudo ufw allow 80/tcp, либо воспользоваться лайфхаком из пункта 3.
Установка и настройка Zabbix Server
После подготовки VPS я приступаю к установке и настройке сервера мониторинга Zabbix. Это позволяет мне наблюдать за состоянием и производительностью моих серверов. На этом этапе я устанавливаю необходимые компоненты Zabbix, настраиваю базу данных и запускаю службы, чтобы иметь доступ к веб-интерфейсу и начать мониторинг.
1. Обновите систему
sudo apt update
sudo apt upgrade -y
2. Установите нужные пакеты (MariaDB, PHP и дополнения)
sudo apt install mariadb-server php php-mbstring php-gd php-xml php-bcmath php-ldap php-mysql php-zip -y
3. Создайте базу данных и пользователя для Zabbix
sudo mysql
В консоли MySQL выполните:
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'Ваш пароль';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
FLUSH PRIVILEGES;
EXIT;
4. Скачайте и установите официальный репозиторий Zabbix 6.0-4
Никто не запрещает ставить 6.0-6, или свежее, если уже есть. Я предпочел обкатаную версию.
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4+ubuntu22.04_all.deb
sudo dpkg -i zabbix-release_6.0-4+ubuntu22.04_all.deb
sudo apt update
5. Установите сервер и агента Zabbix
sudo apt install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-sql-scripts zabbix-agent -y
6. Добавьте начальные данные в базу
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix
Вас попросят ввести пароль от пользователя zabbix (тот, что на шаге 3 зовется “Ваш пароль”).
7. Настройте Zabbix Server
Откройте файл /etc/zabbix/zabbix_server.conf:
sudo nano /etc/zabbix/zabbix_server.conf
Найдите строку DBPassword= и пропишите ваш пароль:
DBPassword=Ваш пароль
Сохраните файл (Ctrl+O, Enter, Ctrl+X).
8. Запустите и проверьте сервисы
sudo systemctl restart zabbix-server zabbix-agent apache2
sudo systemctl enable zabbix-server zabbix-agent apache2
sudo systemctl status zabbix-server.service
9. Проверьте веб-интерфейс
Откройте в браузере:
https://вашдомен.рф
Если открывается веб-интерфейс zabbix, то все получилось!
Следуйте инструкциям мастера — там понадобятся параметры базы данных из шага 3.
Примечание:
1.Стандартный логин и пароль для входа в веб-интерфейс zabbix Admin/zabbix
2.Zabbix устанавливается с учётом локалей, доступных на веб-сервере; если установлена только английская локаль, интерфейс будет на английском — при необходимости можно добавить русскую системную локаль на сервер и перезапустить веб-сервер (nginx или apache) для появления русского языка в списке выбора.
Теперь сервер полностью готов к приёму данных от других машин: мы установили Zabbix, получили SSL-сертификат, открыли нужные порты и настроили безопасность — следующим шагом переходим к установке Zabbix agents на наши VPS для централизированного мониторинга.
Установка и настройка zabbix agents на наши vps.
1. Добавьте официальный репозиторий Zabbix
wget https://repo.zabbix.com/zabbix/6.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.0-4+ubuntu22.04_all.deb
sudo dpkg -i zabbix-release_6.0-4+ubuntu22.04_all.deb
sudo apt update
2. Установите Zabbix-agent
sudo apt install zabbix-agent -y
3. Настройте Zabbix-agent
Откройте конфиг /etc/zabbix/zabbix_agentd.conf:
sudo nano /etc/zabbix/zabbix_agentd.conf
- Укажите IP вашей Zabbix-системы:
Server=<IP_ZABBIX_SERVER> ServerActive=<IP_ZABBIX_SERVER> - Задайте уникальное имя хоста (как он будет отображаться в zabbix-server):
Hostname=<UNIQUE_HOSTNAME> - Стандартный порт 10050, или укажите другой если ставили нестандартный в настройках ufw на zabbix сервере:
ListenPort=10050
4. Откройте нужные порты на vps
sudo ufw allow 10050/tcp
Если используете другой порт — откройте его.
5. Запустите и проверьте статус агента
sudo systemctl restart zabbix-agent
sudo systemctl enable zabbix-agent
sudo systemctl status zabbix-agent
6. Добавление хоста на Zabbix Server
Чтобы начать мониторинг, откройте веб-интерфейс Zabbix, перейдите в раздел Configuration → Hosts → Create host. Укажите имя хоста (точно как в настройках агента), IP-адрес, выберите группу и добавьте стандартный шаблон (например, Template OS Linux). После сохранения хост начнёт отправлять метрики в течение минуты — проверить это можно в разделе Monitoring → Latest data.
Согласование сервисов с Zabbix Server и мониторинг приложений
Теперь, когда Zabbix agents установлены на ваших VPS и корректно связаны с сервером мониторинга, агенты уже автоматически передают все стандартные системные метрики: загрузку CPU, память, дисковое пространство, сетевой трафик и многие другие параметры. Эти показания можно сразу видеть в интерфейсе Zabbix спустя несколько минут после регистрации хоста на сервере.
Однако для мониторинга конкретных пользовательских сервисов и приложений (например, бота, сайта или веб-сервера) одной только установки агента недостаточно. Чтобы получать события, логи и индивидуальные показатели от каждого сервиса, необходимо:
-
На сервере Zabbix создать отдельные items (элементы данных) для каждого интересующего файла лога или метрики. Например, можно добавить item для отслеживания ошибок в логе Telegram-бота.
-
Но необходимо убедиться, что сервисы ведут логирование не только в системный журнал (journalctl/systemd), а также в отдельный файл (например, /var/log/telegram-bot/bot.log.)
-
Для примера возьму своего Perplexity Api + TGBot, там я настраивал базовое логирование в системый журнал
logging.basicConfig(level=logging.INFO). Перенаправляем логи в/var/log/telegram-bot/bot.log:logging.basicConfig( filename='/var/log/telegram-bot/bot.log', level=logging.INFO, format='%(asctime)s %(levelname)s %(name)s %(message)s' -
Теперь можно перейти на сервер Zabbix и добавить этот лог в items: создайте новый элемент данных с типом “Zabbix agent (active)”, укажите ключ вида log[/var/log/telegram-bot/bot.log] и тип информации “Log”. После сохранения агент начнёт передавать новые строки лога на сервер, где вы сможете анализировать их через триггеры и шаблоны для быстрого реагирования на ошибки или важные события.
Этот пример был для Telegram-бота, но с остальными сервисами принцип похожий, хотя настройка немного отличается. Например, сайт на Hugo — это статичный генератор, и он не создаёт логов в обычном смысле. Однако можно отслеживать доступность и время отклика главной страницы с помощью веб-сценария Zabbix: добавляете URL сайта, указываете шаги проверки, и система будет показывать график отклика на дашборде. Это удобно для контроля, что сайт работает нормально. Также можно добавить мини-окно с сайтом по URL, но моя тема почему-то не подтягивается — зато сразу видно, если сайт недоступен.
Для панели S-UI настройка тоже другая: в интерфейсе панели можно выбрать путь к файлу логов, куда будут записываться события. Остаётся только создать в Zabbix элемент данных с ключом log[указанный_путь] и добавить его на дашборд.
Таким образом, на дашборде Zabbix я собрал всё что мне было нужно: URL сайта (тема не подгружается, но доступность видна), состояние серверов, код ответа и время отклика главной страницы, метрики железа (нагрузка на CPU, память, пинг агентов), сетевой трафик, логи VPN-сервера и Telegram-бота. Теперь статус всех сервисов доступен в одном окне, и я могу следить за ними в любое время из любой точки мира.
То есть самое главное — собрать все логи нужного сервиса в одном месте, а на сервере Zabbix создать items для соответствующего хоста. Когда файл с логами начнёт читаться сервером, настроить визуализацию графиков и отчётов будет значительно проще, чем кажется на первый взгляд.