# Защита 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: ```bash ./tools/deploy/fix-nginx-oom-protection.sh ``` Этот скрипт: - Создает systemd override для nginx с `OOMScoreAdjust=-1000` (максимальная защита) - Настраивает автоматический перезапуск при падении (`Restart=always`) - Настраивает задержку перед перезапуском (`RestartSec=5`) - Отключает лимит на количество перезапусков ### 2. Проверка и восстановление nginx Для проверки статуса nginx и автоматического восстановления (если нужно): ```bash ./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`: ```ini [Service] # Защита от OOM killer (от -1000 до 1000) # -1000 = никогда не убивать этот процесс OOMScoreAdjust=-1000 # Автоматический перезапуск Restart=always RestartSec=5 StartLimitIntervalSec=0 StartLimitBurst=0 ``` ### Проверка защиты Чтобы проверить, что nginx защищен от OOM killer: ```bash # SSH на сервер ssh root@147.45.152.129 # Проверить OOM score cat /proc/$(pgrep -f 'nginx: master')/oom_score_adj # Должно вывести: -1000 ``` ### Мониторинг Для проверки OOM событий в системных логах: ```bash # Проверить последние OOM убийства dmesg | grep -i "oom\|killed process" | tail -20 # Проверить логи nginx journalctl -u nginx --since "1hour ago" -n 50 ``` ## Автоматический мониторинг (опционально) Можно настроить cron для периодической проверки nginx: ```bash # Добавить в crontab (каждые 5 минут) */5 * * * * /root/mnemo_cards/tools/deploy/check-and-restore-nginx.sh >> /var/log/nginx-check.log 2>&1 ``` ## Дополнительные рекомендации 1. **Мониторинг памяти**: Регулярно проверяйте использование памяти: ```bash 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: ```bash nginx -t ``` 2. Проверьте логи: ```bash journalctl -u nginx -n 50 ``` 3. Проверьте, что systemd override создан: ```bash cat /etc/systemd/system/nginx.service.d/override.conf ``` 4. Перезагрузите systemd: ```bash systemctl daemon-reload systemctl restart nginx ``` ### Nginx все еще падает 1. Проверьте, что OOM protection активна: ```bash cat /proc/$(pgrep -f 'nginx: master')/oom_score_adj ``` 2. Проверьте использование памяти: ```bash 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 после деплоя