BASH
#nginx#config#reload#test#systemctl#bash#devops

Nginx: проверка конфигурации и безопасная перезагрузка

Правильная последовательность: nginx -t → systemctl reload. Скрипт проверки, обработка ошибок, zero-downtime.

Как использовать

  1. Всегда проверяйте конфигурацию: `nginx -t` перед reload
  2. Используйте `reload` вместо `restart` — не прерывает соединения
  3. Автоматизируйте проверку через скрипт или CI/CD

Правильная последовательность проверки конфигурации Nginx перед перезагрузкой. Никогда не делайте reload без проверки — это может привести к остановке сервера.

Базовая проверка

# Проверка синтаксиса конфигурации
sudo nginx -t

# Если проверка прошла успешно, перезагрузите конфигурацию
sudo systemctl reload nginx

Безопасная перезагрузка с проверкой

#!/bin/bash
# /usr/local/bin/nginx-safe-reload

set -e

echo "🔍 Проверка конфигурации Nginx..."

if sudo nginx -t 2>&1; then
    echo "✅ Конфигурация корректна, перезагружаю nginx..."
    sudo systemctl reload nginx
    
    # Проверка статуса
    sleep 1
    if sudo systemctl is-active --quiet nginx; then
        echo "✅ Nginx перезагружен успешно"
        exit 0
    else
        echo "❌ Nginx не запустился после reload!"
        exit 1
    fi
else
    echo "❌ Ошибка в конфигурации! Nginx не перезагружен."
    exit 1
fi

Использование:

chmod +x /usr/local/bin/nginx-safe-reload
sudo nginx-safe-reload

Проверка с подробным выводом

# Подробный вывод ошибок (stderr → stdout)
sudo nginx -t 2>&1

# Сохранение вывода в файл для анализа
sudo nginx -t > /tmp/nginx-test.log 2>&1
cat /tmp/nginx-test.log

# Проверка конкретного файла конфигурации
sudo nginx -t -c /etc/nginx/nginx.conf

Альтернативные команды перезагрузки

# Через systemctl (рекомендуется)
sudo systemctl reload nginx

# Через nginx напрямую (если systemctl недоступен)
sudo nginx -s reload

# Полный перезапуск (используйте только при необходимости)
sudo systemctl restart nginx

# Плавная перезагрузка (old nginx finishes connections)
sudo nginx -s quit
sudo systemctl start nginx

Проверка статуса после перезагрузки

# Проверка статуса сервиса
sudo systemctl status nginx

# Проверка, что nginx слушает порты
sudo ss -tlnp | grep nginx
# или
sudo netstat -tlnp | grep nginx

# Проверка активных соединений
sudo nginx -T | grep -A 5 "stub_status"  # если включён статус-модуль
curl http://localhost/nginx_status

Автоматизация в CI/CD

# .github/workflows/nginx-test.yml
name: Nginx Config Test

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Test nginx configuration
        run: |
          docker run --rm -v $(pwd):/etc/nginx/conf.d nginx nginx -t

Типичные ошибки

  • Reload без проверкиsystemctl reload nginx без nginx -t
  • Restart вместо reload — прерывает активные соединения
  • Игнорирование ошибок — «и так работает»
  • Нет бэкапа конфига — перед изменениями не сохраняют старую версию

Best practices

  • Всегда делайте nginx -t перед reload
  • Используйте reload вместо restart для zero-downtime
  • Сохраняйте бэкапы конфигов перед изменениями
  • Автоматизируйте проверку в CI/CD пайплайне
  • Мониторьте статус после перезагрузки

Где применять

  • Production: только nginx-safe-reload скрипт
  • Staging: можно nginx -t && systemctl reload
  • Dev: nginx -s reload для быстрой перезагрузки
  • CI/CD: автоматическая проверка в пайплайне

Связанные сниппеты:

Документация: