Nginx: базовая настройка
Nginx — высокопроизводительный web-сервер и reverse proxy: используется для раздачи статических файлов, настройки HTTPS, проксирования запросов к приложению и виртуальных хостов.
Зачем нужно
Nginx — стандарт для production-серверов. В отличие от Node.js, он эффективно раздаёт статику (тысячи файлов без нагрузки на CPU), умеет SSL-терминацию, обрабатывает сотни тысяч одновременных соединений и не зависает при медленных клиентах (slowloris-атаки).
Где используется
- Раздача статического сайта или SPA (React, Vue)
- Настройка HTTPS с Let's Encrypt через certbot
- Виртуальные хосты — несколько сайтов на одном IP
- Reverse proxy перед Node.js / Python / PHP приложением
Основной контент
Установка (Ubuntu/Debian)
sudo apt update
sudo apt install nginx
# Проверить статус
sudo systemctl status nginx
sudo systemctl enable nginx # автостарт при перезагрузке
# Директории конфигов
/etc/nginx/nginx.conf # главный конфиг
/etc/nginx/sites-available/ # конфиги виртуальных хостов
/etc/nginx/sites-enabled/ # симлинки на активные конфиги
/var/log/nginx/access.log # логи доступа
/var/log/nginx/error.log # логи ошибок
Конфиг для статического сайта
# /etc/nginx/sites-available/mysite
server {
listen 80;
server_name example.com www.example.com;
root /var/www/mysite;
index index.html;
# SPA: неизвестные маршруты → index.html
location / {
try_files $uri $uri/ /index.html;
}
# Кэширование статики
location ~* \.(js|css|png|jpg|ico|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Gzip-сжатие
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1000;
}
Активация конфига и HTTPS
# Активировать сайт (симлинк)
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/
# Проверить синтаксис
sudo nginx -t
# Применить
sudo nginx -s reload
# Установить certbot (Let's Encrypt)
sudo apt install certbot python3-certbot-nginx
# Получить сертификат и автонастроить Nginx
sudo certbot --nginx -d example.com -d www.example.com
Конфиг с HTTPS (после certbot)
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/mysite;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
Полезные команды
nginx -t # проверить конфиг
nginx -s reload # reload без рестарта
systemctl restart nginx # полный рестарт
tail -f /var/log/nginx/error.log # смотреть ошибки
Частые ошибки
- Изменить конфиг без
nginx -t— синтаксическая ошибка приreloadне применяет изменения, иногда роняет Nginx - Раздавать статику из директории с правами
700— Nginx (пользовательwww-data) не может читать файлы - Не настроить gzip — статические ресурсы передаются без сжатия
- Не настроить
ssl_protocols— по умолчанию может включать устаревший TLS 1.0/1.1