Блог / Статьи

Полезная информация для вашего хостинга

Отказоустойчивый веб-сервер на Raspberry Pi

Отказоустойчивый веб-сервер на Raspberry Pi: построение кластера из двух устройств для 24/7 доступности

Содержание

Представьте: ваш личный блог, портфолио или домашний медиа-сервер — всё это работает на маленьком, тихом, энергоэффективном устройстве размером с кредитную карту. Звучит как фантастика? В 2025 году это реальность благодаря Raspberry Pi — микрокомпьютеру, который изначально создавался для обучения программированию, но стал настоящим хитом среди энтузиастов, системных администраторов и тех, кто ценит контроль над своей инфраструктурой.

Однако есть проблема: одно устройство — одна точка отказа. Отключение электричества, сбой на плате, перегрев — и ваш сайт лежит. Решение — кластеризация: объединение двух (или более) Raspberry Pi в единую отказоустойчивую систему, где при падении одного узла второй мгновенно берёт на себя нагрузку без потери доступности.

В этой статье подробно разбирается процесс создания отказоустойчивого веб-сервера на базе двух Raspberry Pi 4. Рассмотрены все этапы: от выбора комплектующих до настройки автоматического переключения и получения бесплатных SSL-сертификатов. Всё — с примерами кода, конфигурационными файлами и пояснением каждого шага.

Зачем нужен отказоустойчивый кластер на домашнем уровне

Многие считают, что высокая доступность (High Availability, HA) — это прерогатива крупных компаний с дата-центрами и миллионными бюджетами. Однако реальность такова, что даже личный проект может критически зависеть от uptime:

  • Портфолио для поиска работы — недоступность сайта в момент просмотра работодателем может стоить вакансии;
  • Домашний медиа-сервер — семья не сможет смотреть фильмы при сбое;
  • Блог с уникальным контентом — потеря трафика и доверия аудитории;
  • IoT-проекты — умный дом, камеры наблюдения, датчики — всё это требует постоянного доступа к серверу.

Кластер из двух устройств решает эту проблему: если один узел падает, второй продолжает работать. Пользователи даже не заметят переключения.

Аппаратные требования: что нужно для построения кластера

Для создания отказоустойчивого веб-сервера потребуется следующее «железо»:

Raspberry Pi 4 (2 шт.)

Рекомендуется модель с 4 ГБ или 8 ГБ оперативной памяти. Почему именно Pi 4?

  • Гигабитный Ethernet — обеспечивает быструю синхронизацию между узлами;
  • USB 3.0 — для подключения SSD-накопителей;
  • Четырёхъядерный процессор Cortex-A72 — достаточно мощный для веб-сервера с умеренной нагрузкой;
  • Поддержка 64-битных ОС — важно для современного ПО.

SSD-накопители (2 шт., минимум 128 ГБ)

SD-карты — прошлый век. Они медленные, ненадёжные и быстро выходят из строя при интенсивной записи. Вместо них используйте:

  • SSD-диск на 2.5" SATA;
  • Корпус с питанием USB-C;
  • Кабель SATA to USB 3.0.

Пример сборки:

- SSD Samsung 870 EVO 250 ГБ
- Корпус ORICO 2.5" USB 3.0
- Кабель SATA to USB 3.0

Блоки питания и ИБП

Стандартные блоки питания (5В/3А) подойдут для обычной работы. Но для отказоустойчивости нужен источник бесперебойного питания (ИБП). Варианты:

  • Power Bank с функцией ИБП — например, Anker PowerCore+ с поддержкой passthrough;
  • DIY-решение на базе 18650 аккумуляторов — для энтузиастов;
  • Промышленный ИБП — если кластер размещён в серверной.

Минимальное время автономной работы — 2–3 часа. Этого достаточно для большинства кратковременных отключений электричества.

Сетевое оборудование

  • Гигабитный коммутатор — для соединения Pi между собой и с роутером;
  • Патч-корды — категории 5e или выше;
  • Статический внешний IP — или DynDNS для доступа из интернета.

Установка операционной системы и базовая настройка

Для кластера рекомендуется использовать Ubuntu Server 22.04 LTS (64-bit). Почему не Raspberry Pi OS?

  • Лучшая поддержка серверного ПО;
  • Долгосрочная поддержка (5 лет);
  • Стабильные репозитории и пакеты.

Шаг 1: Запись образа на SSD

Скачайте образ с официального сайта:

wget https://cdimage.ubuntu.com/ubuntu/releases/22.04/release/ubuntu-22.04.4-live-server-arm64.iso

Запишите его на SSD с помощью Raspberry Pi Imager или balenaEtcher. При первом запуске система автоматически расширится на весь объём диска.

Шаг 2: Настройка сети

Отредактируйте файл /etc/netplan/00-installer-config.yaml:

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 192.168.1.101/24  # Для первого узла
        - 192.168.1.102/24  # Для второго узла
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

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

sudo netplan apply

Шаг 3: Обновление системы и установка базовых пакетов

sudo apt update && sudo apt upgrade -y
sudo apt install -y vim htop curl wget git ntp openssh-server

Floating VIP Cyberpunk Futuristic

Настройка виртуального плавающего IP-адреса с Keepalived

Keepalived — это демон, который управляет виртуальным IP-адресом (VIP), переключая его между узлами в зависимости от их состояния. Для пользователя сайт всегда доступен по одному и тому же адресу, даже если физически он работает на разных серверах.

Установка Keepalived

sudo apt install -y keepalived

Конфигурация первого узла (мастер)

Создайте файл /etc/keepalived/keepalived.conf:

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass raspberry2025
    }
    
    virtual_ipaddress {
        192.168.1.110/24
    }
    
    # Проверка доступности веб-сервера
    track_script {
        chk_nginx
    }
}

vrrp_script chk_nginx {
    script "/usr/bin/pgrep nginx"
    interval 2
    weight 2
    fall 2
    rise 1
}

Конфигурация второго узла (бэкап)

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass raspberry2025
    }
    
    virtual_ipaddress {
        192.168.1.110/24
    }
    
    track_script {
        chk_nginx
    }
}

vrrp_script chk_nginx {
    script "/usr/bin/pgrep nginx"
    interval 2
    weight 2
    fall 2
    rise 1
}

Запуск службы

sudo systemctl enable --now keepalived

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

Установка и настройка балансировщика нагрузки HAProxy

HAProxy (High Availability Proxy) — это мощный балансировщик нагрузки, который распределяет входящие запросы между несколькими серверами. В нашем случае он будет работать на том же виртуальном IP, обеспечивая прозрачное переключение.

Установка

sudo apt install -y haproxy

Конфигурация

Отредактируйте файл /etc/haproxy/haproxy.cfg:

 

global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000
    timeout client 50000
    timeout server 50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

frontend http_front
    bind 192.168.1.110:80
    bind 192.168.1.110:443 ssl crt /etc/ssl/certs/raspberrypi.pem
    stats uri /haproxy?stats
    default_backend http_back

backend http_back
    balance roundrobin
    server pi1 192.168.1.101:80 check
    server pi2 192.168.1.102:80 check
Перезапуск службы
sudo systemctl restart haproxy
sudo systemctl enable haproxy

 

Теперь все запросы на 192.168.1.110 будут распределяться между двумя узлами.

Data Sync Trees Digital Abstraction

Установка веб-сервера Nginx на оба узла

На каждом Raspberry Pi установите веб-сервер:

sudo apt install -y nginx

Базовая конфигурация

Отредактируйте файл /etc/nginx/sites-available/default:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
    
    server_name _;
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    # Health check endpoint
    location /health {
        return 200 "OK\n";
        add_header Content-Type text/plain;
    }
}

Создание уникальной страницы для каждого узла

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

# На первом узле
echo "<h1>Raspberry Pi Cluster - Node 1</h1><p>This is the primary server.</p>" | sudo tee /var/www/html/index.html

# На втором узле
echo "<h1>Raspberry Pi Cluster - Node 2</h1><p>This is the backup server.</p>" | sudo tee /var/www/html/index.html

Запуск Nginx

sudo systemctl enable --now nginx

Синхронизация файлов между узлами с rsync и inotify

Если вы обновляете контент на одном узле, он должен автоматически появиться на другом. Для этого используется связка rsync + inotify-tools.

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

sudo apt install -y rsync inotify-tools

Настройка SSH-ключа для беспрепятственной синхронизации

На первом узле сгенерируйте ключ:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
ssh-copy-id Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.

Создание скрипта синхронизации

Создайте файл /usr/local/bin/sync_web.sh:

#!/bin/bash

SOURCE_DIR="/var/www/html"
DEST_DIR="Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.:/var/www/html"
LOG_FILE="/var/log/web_sync.log"

inotifywait -m -r -e modify,create,delete,move "$SOURCE_DIR" |
while read path action file; do
    echo "$(date): $action on $file" >> $LOG_FILE
    rsync -avz --delete "$SOURCE_DIR/" "$DEST_DIR/" >> $LOG_FILE 2>&1
done

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

sudo chmod +x /usr/local/bin/sync_web.sh

Запуск в фоновом режиме

Создайте systemd-юнит /etc/systemd/system/web-sync.service:

 

[Unit]
Description=Web Content Sync Service
After=network.target

[Service]
Type=simple
User=pi
ExecStart=/usr/local/bin/sync_web.sh
Restart=always

[Install]
WantedBy=multi-user.target
Запустите службу:

sudo systemctl enable --now web-sync

 

Теперь любое изменение в /var/www/html на первом узле будет мгновенно синхронизироваться со вторым.

Получение бесплатных SSL-сертификатов Let's Encrypt

Для обеспечения безопасности и доверия пользователей необходимо использовать HTTPS. Let's Encrypt предоставляет бесплатные сертификаты, которые автоматически обновляются.

Установка Certbot

sudo apt install -y certbot python3-certbot-nginx

Получение сертификата

Выполните на активном узле:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Сертификат будет автоматически добавлен в конфигурацию Nginx.

Синхронизация сертификатов между узлами

Добавьте в скрипт синхронизации:

rsync -avz /etc/letsencrypt/ Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.:/etc/letsencrypt/

Автоматическое обновление

Certbot уже настроен на автоматическое обновление через systemd-таймер. Проверьте:

sudo systemctl list-timers | grep certbot

Тестирование отказоустойчивости: реальный сценарий переключения

Теперь пришло время проверить, работает ли кластер так, как задумано.

Тест 1: Проверка виртуального IP

ping 192.168.1.110

Вы должны получить ответ. Затем проверьте, на каком узле сейчас активен VIP:

ip addr show eth0 | grep 192.168.1.110

Тест 2: Имитация сбоя первого узла

На первом узле остановите Nginx:

sudo systemctl stop nginx

Keepalived обнаружит это через 2–3 секунды и переключит виртуальный IP на второй узел. Проверьте:

curl http://192.168.1.110

Вы должны увидеть страницу второго узла. В логах Keepalived:

tail -f /var/log/syslog | grep keepalived

Тест 3: Восстановление первого узла

Запустите Nginx снова:

sudo systemctl start nginx

Если приоритет выше, виртуальный IP может вернуться на первый узел (в зависимости от настроек).

Тест 4: Отключение питания

Физически отключите питание первого узла. Второй должен принять нагрузку за 3–5 секунд. Подключите питание обратно — кластер восстановится автоматически.

Failover Digital Abstraction

Мониторинг состояния кластера

Для постоянного контроля над состоянием кластера настройте мониторинг.

HAProxy Stats

Добавьте в конфигурацию HAProxy:

listen stats
    bind 192.168.1.110:8888
    stats enable
    stats uri /
    stats auth admin:yourpassword

Теперь статистика доступна по адресу http://192.168.1.110:8888.

Telegram-бот для уведомлений

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

#!/bin/bash
# /usr/local/bin/notify_failover.sh

BOT_TOKEN="your_bot_token"
CHAT_ID="your_chat_id"
MESSAGE="⚠️ Failover detected! Virtual IP switched to $(hostname)"

curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
  -d chat_id=$CHAT_ID \
  -d text="$MESSAGE" > /dev/null

Добавьте вызов этого скрипта в секцию notify_master Keepalived.

Оптимизация производительности и энергопотребления

Настройка ZRAM

Raspberry Pi имеет ограниченную оперативную память. ZRAM создаёт сжатый swap в RAM:

sudo apt install -y zram-tools
echo "ALGO=zstd" | sudo tee -a /etc/default/zramswap
echo "PERCENT=50" | sudo tee -a /etc/default/zramswap
sudo systemctl restart zramswap

Ограничение частоты CPU

Для снижения энергопотребления и нагрева:

sudo apt install -y cpufrequtils
echo 'GOVERNOR="powersave"' | sudo tee /etc/default/cpufrequtils

Мониторинг температуры

vcgencmd measure_temp

Рекомендуется установить радиаторы или активное охлаждение при температуре выше 70°C.

Заключение: кластер Raspberry Pi как основа для обучения и продакшена

Построение отказоустойчивого веб-сервера на двух Raspberry Pi — это не просто техническое упражнение. Это практический способ понять принципы работы распределённых систем, балансировки нагрузки, синхронизации данных и автоматического восстановления.

Такой кластер подходит для:

  • Обучения — отличная площадка для изучения DevOps-практик;
  • Личных проектов — блог, портфолио, медиа-сервер;
  • Тестирования — развёртывание новых технологий без риска для продакшена;
  • IoT-инфраструктуры — умный дом, камеры, датчики.

При этом стоимость всего решения — менее 543 BYN, а энергопотребление — около 10–15 Вт на устройство. Это делает его экономически выгодной альтернативой облачным VPS для небольших проектов.