162 lines
5.7 KiB
Markdown
162 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 после деплоя
|
|||
|
|
|