mnemo_cards/tools/deploy/NGINX_OOM_PROTECTION.md
2026-01-03 16:48:08 +03:00

5.7 KiB
Raw Permalink Blame History

Защита nginx от OOM killer и автоматическое восстановление

Проблема

При сборке Flutter web приложения на сервере процесс сборки может потреблять много памяти, что приводит к падению nginx из-за OOM (Out of Memory) killer.

Решение

Реализованы два механизма защиты:

  1. Защита от OOM killer - настройка systemd для защиты nginx от убийства при нехватке памяти
  2. Автоматическое восстановление - настройка systemd для автоматического перезапуска nginx при падении

Использование

1. Настройка защиты nginx от OOM killer

Запустите скрипт для настройки systemd override:

./tools/deploy/fix-nginx-oom-protection.sh

Этот скрипт:

  • Создает systemd override для nginx с OOMScoreAdjust=-1000 (максимальная защита)
  • Настраивает автоматический перезапуск при падении (Restart=always)
  • Настраивает задержку перед перезапуском (RestartSec=5)
  • Отключает лимит на количество перезапусков

2. Проверка и восстановление nginx

Для проверки статуса nginx и автоматического восстановления (если нужно):

./tools/deploy/check-and-restore-nginx.sh

Этот скрипт:

  • Проверяет, запущен ли nginx
  • Проверяет, отвечает ли nginx на запросы
  • Автоматически восстанавливает nginx, если он упал
  • Показывает информацию о памяти и OOM событиях

3. Автоматическая проверка после деплоя

Скрипт деплоя (tools/deploy/web-app/deploy.sh) автоматически проверяет и восстанавливает nginx после перезапуска.

Что было настроено

Systemd Override для nginx

Создается файл /etc/systemd/system/nginx.service.d/override.conf:

[Service]
# Защита от OOM killer (от -1000 до 1000)
# -1000 = никогда не убивать этот процесс
OOMScoreAdjust=-1000

# Автоматический перезапуск
Restart=always
RestartSec=5
StartLimitIntervalSec=0
StartLimitBurst=0

Проверка защиты

Чтобы проверить, что nginx защищен от OOM killer:

# SSH на сервер
ssh root@147.45.152.129

# Проверить OOM score
cat /proc/$(pgrep -f 'nginx: master')/oom_score_adj
# Должно вывести: -1000

Мониторинг

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

# Проверить последние OOM убийства
dmesg | grep -i "oom\|killed process" | tail -20

# Проверить логи nginx
journalctl -u nginx --since "1hour ago" -n 50

Автоматический мониторинг (опционально)

Можно настроить cron для периодической проверки nginx:

# Добавить в crontab (каждые 5 минут)
*/5 * * * * /root/mnemo_cards/tools/deploy/check-and-restore-nginx.sh >> /var/log/nginx-check.log 2>&1

Дополнительные рекомендации

  1. Мониторинг памяти: Регулярно проверяйте использование памяти:

    free -h
    
  2. Swap: Убедитесь, что на сервере настроен swap (функция setup_swap в config.sh)

  3. Ограничение памяти для сборки: Рассмотрите возможность ограничения памяти для процесса сборки Flutter через переменные окружения:

    • DART_VM_OPTIONS="--old-gen-heap-size=1024"
    • NODE_OPTIONS="--max-old-space-size=256"
  4. Сборка на отдельном сервере: Для больших проектов рассмотрите возможность сборки на отдельном сервере или в CI/CD пайплайне.

Устранение неполадок

Nginx не запускается после настройки

  1. Проверьте конфигурацию nginx:

    nginx -t
    
  2. Проверьте логи:

    journalctl -u nginx -n 50
    
  3. Проверьте, что systemd override создан:

    cat /etc/systemd/system/nginx.service.d/override.conf
    
  4. Перезагрузите systemd:

    systemctl daemon-reload
    systemctl restart nginx
    

Nginx все еще падает

  1. Проверьте, что OOM protection активна:

    cat /proc/$(pgrep -f 'nginx: master')/oom_score_adj
    
  2. Проверьте использование памяти:

    free -h
    ps aux --sort=-%mem | head -10
    
  3. Рассмотрите увеличение swap или ограничение памяти для других процессов

Файлы

  • tools/deploy/fix-nginx-oom-protection.sh - настройка защиты от OOM killer
  • tools/deploy/check-and-restore-nginx.sh - проверка и восстановление nginx
  • tools/deploy/web-app/deploy.sh - обновлен для проверки nginx после деплоя