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