Урок 03

Конфигурация nginx.conf

Уровни конфига

Конфиг Nginx — иерархический:

main (nginx.conf)
 ├── events
 └── http
      ├── server (сайт)
      │    └── location (путь)
      ├── server
      └── server

Правило: настройки наследуются сверху вниз.

Три уровня настройки

main — глобальные. Работают везде.

server — для конкретного сайта. server_name example.com.

location — для конкретного URL. location /api { ... }.

Основной nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

http {
    # MIME-типы
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Оптимизация
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;

    # Логи
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;

    # Gzip
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;

    # Размеры
    client_max_body_size 20M;
    client_body_buffer_size 128k;

    # SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # Подключение конфигов
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Разбор ключевых директив

server_tokens off; — скрывает версию Nginx в заголовках. Безопасность — не давать хакерам знать версию.

client_max_body_size 20M; — максимум размера загружаемого файла. По умолчанию 1 МБ — Laravel упадёт при загрузке аватарки. Обязательно увеличь.

gzip_types — что сжимать. HTML, CSS, JS, JSON — сжимать всегда. Картинки, видео — не сжимать, они уже сжаты.

ssl_protocols TLSv1.2 TLSv1.3; — только современные версии. TLSv1.0 и 1.1 устарели, их надо отключать.

ssl_prefer_server_ciphers on; — использовать серверные шифры, а не клиентские.

Что не сжимать

gzip_types
    text/plain
    text/css
    text/xml
    text/javascript
    application/json
    application/javascript
    application/xml
    application/rss+xml
    application/atom+xml
    image/svg+xml
    font/woff
    font/woff2;

Не включай в gzip_types:

  • Картинки (image/jpeg, image/png, image/webp)
  • Видео (video/mp4)
  • PDF
  • Аудио
  • Архивы (application/zip, application/gzip)

Почему: они уже сжаты. Gzip только жрёт CPU впустую.

Таймауты

client_header_timeout 60s;
client_body_timeout 60s;
send_timeout 60s;
keepalive_timeout 65s;
keepalive_requests 100;

keepalive_timeout — сколько держать соединение открытым. Больше — быстрее для повторных запросов.

send_timeout — сколько ждать клиента при отправке.

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

Добавь в http или в server:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;

Что дают:

  • X-Frame-Options — защита от clickjacking
  • X-Content-Type-Options — защита от MIME-sniffing
  • X-XSS-Protection — базовая защита от XSS
  • Referrer-Policy — не палить URL
  • Permissions-Policy — ограничить API браузера

Структура сайтов

Не пиши всё в nginx.conf. Раздели:

/etc/nginx/sites-available/
├── skills-dev.ru
├── api.skills-dev.ru
├── nobleweb.ru
└── catalan.life

Включение:

sudo ln -s /etc/nginx/sites-available/skills-dev.ru /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Отключение:

sudo rm /etc/nginx/sites-enabled/skills-dev.ru
sudo systemctl reload nginx

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

Всегда:

sudo nginx -t

С подробностями:

sudo nginx -T        # вывести весь конфиг с include

Итог

Минимум для веба:

  • sendfile on, gzip on
  • client_max_body_size 20M
  • ssl_protocols TLSv1.2 TLSv1.3
  • server_tokens off
  • Заголовки безопасности
  • Конфиги сайтов в отдельных файлах

Дальше — virtual hosts.