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

161 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Защита 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 после деплоя