5.7 KiB
Защита nginx от OOM killer и автоматическое восстановление
Проблема
При сборке Flutter web приложения на сервере процесс сборки может потреблять много памяти, что приводит к падению nginx из-за OOM (Out of Memory) killer.
Решение
Реализованы два механизма защиты:
- Защита от OOM killer - настройка systemd для защиты nginx от убийства при нехватке памяти
- Автоматическое восстановление - настройка 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
Дополнительные рекомендации
-
Мониторинг памяти: Регулярно проверяйте использование памяти:
free -h -
Swap: Убедитесь, что на сервере настроен swap (функция
setup_swapвconfig.sh) -
Ограничение памяти для сборки: Рассмотрите возможность ограничения памяти для процесса сборки Flutter через переменные окружения:
DART_VM_OPTIONS="--old-gen-heap-size=1024"NODE_OPTIONS="--max-old-space-size=256"
-
Сборка на отдельном сервере: Для больших проектов рассмотрите возможность сборки на отдельном сервере или в CI/CD пайплайне.
Устранение неполадок
Nginx не запускается после настройки
-
Проверьте конфигурацию nginx:
nginx -t -
Проверьте логи:
journalctl -u nginx -n 50 -
Проверьте, что systemd override создан:
cat /etc/systemd/system/nginx.service.d/override.conf -
Перезагрузите systemd:
systemctl daemon-reload systemctl restart nginx
Nginx все еще падает
-
Проверьте, что OOM protection активна:
cat /proc/$(pgrep -f 'nginx: master')/oom_score_adj -
Проверьте использование памяти:
free -h ps aux --sort=-%mem | head -10 -
Рассмотрите увеличение swap или ограничение памяти для других процессов
Файлы
tools/deploy/fix-nginx-oom-protection.sh- настройка защиты от OOM killertools/deploy/check-and-restore-nginx.sh- проверка и восстановление nginxtools/deploy/web-app/deploy.sh- обновлен для проверки nginx после деплоя