📚ByteGuide
Назад к справочникам

Nginx Quick Reference

Краткий справочник по Nginx: основные команды, конфигурация, SSL, кеширование

📝 Основные команды

Управление сервисом

# Запуск/остановка/перезагрузка
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx    # Без даунтайма (рекомендуется)

# Статус
sudo systemctl status nginx

# Автозапуск при загрузке системы
sudo systemctl enable nginx
sudo systemctl disable nginx

Проверка конфигурации

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

# Просмотр версии и модулей
nginx -v
nginx -V    # Полная информация о сборке

Логи

# Просмотр логов в реальном времени
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

# Последние N строк
sudo tail -n 100 /var/log/nginx/error.log

# Поиск ошибок
sudo grep "error" /var/log/nginx/error.log

# Очистка логов
sudo truncate -s 0 /var/log/nginx/access.log

⚙️ Базовая конфигурация

Простой reverse proxy

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Static files

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    location / {
        try_files $uri $uri/ =404;
    }

    # Кеширование статики
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Upstream (load balancing)

upstream backend {
    # Round-robin (по умолчанию)
    server backend1.example.com;
    server backend2.example.com;
    
    # С весами
    # server backend1.example.com weight=3;
    # server backend2.example.com weight=1;
    
    # Least connections
    # least_conn;
    
    # IP hash (sticky sessions)
    # ip_hash;
    
    keepalive 32;
}

server {
    listen 80;
    
    location / {
        proxy_pass http://backend;
    }
}

🔒 SSL/TLS

Установка Let's Encrypt

# Установка Certbot
sudo apt install certbot python3-certbot-nginx -y

# Получение сертификата
sudo certbot certonly --webroot \
  -w /var/www/certbot \
  -d example.com \
  -d www.example.com \
  --email your@email.com \
  --agree-tos

# Автообновление
sudo certbot renew --dry-run

# Добавить в cron
0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

HTTPS конфигурация (A+)

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name example.com;

    # SSL сертификаты
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    # SSL protocols and ciphers
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers off;
    
    # SSL session
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    
    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
}

# HTTP -> HTTPS redirect
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

🛡️ Security Headers

Основные заголовки безопасности

# HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

# Защита от clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;

# Защита от MIME sniffing
add_header X-Content-Type-Options "nosniff" always;

# XSS Protection
add_header X-XSS-Protection "1; mode=block" always;

# Referrer Policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

# Permissions Policy
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

# CSP (Content Security Policy)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;

💾 Кеширование

Proxy cache

# В http блоке
proxy_cache_path /var/cache/nginx 
                 levels=1:2 
                 keys_zone=my_cache:10m 
                 max_size=1g 
                 inactive=60m 
                 use_temp_path=off;

# В server/location блоке
location / {
    proxy_cache my_cache;
    proxy_cache_valid 200 60m;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
    proxy_cache_lock on;
    
    add_header X-Cache-Status $upstream_cache_status;
    
    proxy_pass http://backend;
}

Browser cache

# Изображения, шрифты
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp|woff|woff2)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

# CSS, JS (с версионированием)
location ~* \.(css|js)$ {
    expires 1y;
    add_header Cache-Control "public, immutable";
}

# HTML - не кешировать
location ~* \.html$ {
    expires -1;
    add_header Cache-Control "no-cache, no-store, must-revalidate";
}

Очистка кеша

# Удалить весь кеш
sudo rm -rf /var/cache/nginx/*

# Перезагрузить Nginx
sudo systemctl reload nginx

🚦 Rate Limiting

Базовая конфигурация

# В http блоке - создаём зону
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;

# В server/location - применяем
location / {
    limit_req zone=general burst=20 nodelay;
    limit_req_status 429;
    
    proxy_pass http://backend;
}

# Параметры:
# rate=10r/s    - 10 запросов в секунду
# burst=20      - позволяет всплеск до 20 запросов
# nodelay       - не задерживать запросы в пределах burst

Разные лимиты для разных путей

# В http блоке
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;

# В server блоке
location /api/ {
    limit_req zone=api burst=10 nodelay;
    proxy_pass http://backend;
}

location / {
    limit_req zone=general burst=20 nodelay;
    proxy_pass http://backend;
}

Connection limit

# В http блоке
limit_conn_zone $binary_remote_addr zone=addr:10m;

# В server блоке
limit_conn addr 10;  # Максимум 10 одновременных соединений с одного IP

📦 Сжатие

Gzip

gzip on;
gzip_vary on;
gzip_min_length 1000;        # Не сжимать файлы меньше 1KB
gzip_comp_level 6;           # Уровень сжатия (1-9)
gzip_types
    text/plain
    text/css
    text/javascript
    text/xml
    application/json
    application/javascript
    application/xml
    application/rss+xml
    image/svg+xml;
gzip_disable "msie6";

Brotli (если установлен модуль)

brotli on;
brotli_comp_level 6;
brotli_types
    text/plain
    text/css
    application/json
    application/javascript
    text/xml
    application/xml
    image/svg+xml;

🔧 Troubleshooting

Проверка портов

# Какие порты слушает Nginx
sudo netstat -tulpn | grep nginx

# Проверка что порт свободен
sudo lsof -i :80

Проверка процессов

# Список процессов Nginx
ps aux | grep nginx

# Убить зависший процесс
sudo killall nginx
sudo systemctl start nginx

Анализ логов

# Топ 10 IP по запросам
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

# Топ 10 самых популярных URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

# Количество 404 ошибок
grep " 404 " /var/log/nginx/access.log | wc -l

# Количество 5xx ошибок
grep " 5[0-9][0-9] " /var/log/nginx/access.log | wc -l

Тестирование конфигурации

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

# Вывод текущей конфигурации
sudo nginx -T

# Проверка SSL
openssl s_client -connect example.com:443 -servername example.com

# Проверка HTTP/2
curl -I --http2 https://example.com

📋 Полезные переменные

$host                   # Имя хоста из запроса
$remote_addr            # IP адрес клиента
$request_uri            # Полный URI запроса
$scheme                 # http или https
$server_name            # Имя сервера из конфигурации
$request_method         # GET, POST, etc.
$request_time           # Время обработки запроса
$upstream_cache_status  # HIT, MISS, BYPASS, EXPIRED
$binary_remote_addr     # IP в бинарном виде (для rate limiting)
$http_user_agent        # User-Agent клиента
$http_referer           # Referer
$ssl_protocol           # TLS версия
$ssl_cipher             # Используемый cipher

📁 Структура файлов

/etc/nginx/
├── nginx.conf                    # Главный конфиг
├── sites-available/              # Доступные сайты
│   └── example.com               # Конфиг сайта
├── sites-enabled/                # Активные сайты (симлинки)
│   └── example.com -> ../sites-available/example.com
├── conf.d/                       # Дополнительные конфиги
├── snippets/                     # Переиспользуемые куски конфига
└── modules-enabled/              # Подключенные модули

/var/log/nginx/
├── access.log                    # Access логи
└── error.log                     # Error логи

/var/cache/nginx/                 # Кеш
/var/www/                         # Веб-файлы (обычно)

🔗 Полезные ссылки