mnemo_cards/tools/deploy/NGINX_OOM_PROTECTION.md

162 lines
5.7 KiB
Markdown
Raw Normal View History

2026-01-03 13:48:08 +00:00
# Защита 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 после деплоя