Назад к справочникам
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/ # Веб-файлы (обычно)