Это руководство дает пошаговую инструкцию по установке и настройке Nginx для production-среды на актуальных дистрибутивах Linux 2026 года. Вы получите полностью готовый базовый конфигурационный файл nginx.conf, оптимизированный для производительности и безопасности. Каждая директива сопровождается комментарием, объясняющим её назначение и рекомендуемые значения, что позволяет не просто скопировать настройки, а понять их логику. Все команды и конфигурации проверены на Ubuntu 24.04 LTS и Rocky Linux 9.
Подготовка среды: установка Nginx на актуальные дистрибутивы 2026 года
Инструкции ниже гарантируют установку последней стабильной версии Nginx из официальных репозиториев. Это обеспечивает совместимость, своевременные обновления безопасности и стабильную работу в production. Все шаги актуальны для современных систем.
Установка на Ubuntu 24.04 LTS и производные
Выполните команды последовательно в терминале. Установка из стандартного репозитория предпочтительнее сторонних сборок для production из-за стабильности и интеграции с системой обновлений.
sudo apt update
sudo apt upgrade -y
sudo apt install nginx -y
nginx -v
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
Команда nginx -v выведет установленную версию, например, nginx/1.26.x. Убедитесь, что служба активна (active (running)).
Установка на Rocky Linux 9 / AlmaLinux 9
Для дистрибутивов на базе RHEL используйте менеджер пакетов dnf. Учтите политики SELinux, которые по умолчанию разрешают Nginx доступ к стандартным портам.
sudo dnf update -y
sudo dnf install nginx -y
nginx -v
sudo systemctl enable --now nginx
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo systemctl status nginx
Команды с firewall-cmd открывают порты 80 (HTTP) и 443 (HTTPS) в firewalld. Для работы с нестандартными портами или каталогами может потребоваться настройка контекстов SELinux с помощью semanage и restorecon.
Архитектура и ключевые директивы: понимание основ конфигурации
Конфигурация Nginx состоит из иерархии файлов и контекстов. Понимание этой структуры необходимо для эффективного управления и отладки.
Структура конфигов: от главного файла до виртуальных хостов
Основные конфигурационные каталоги и файлы:
/etc/nginx/nginx.conf– главный конфигурационный файл. Включает настройки глобального уровня (main, events, http)./etc/nginx/conf.d/– каталог для дополнительных конфигураций, которые автоматически подключаются. Файлы должны иметь расширение.conf./etc/nginx/sites-available/– хранит конфигурации виртуальных хостов (серверов)./etc/nginx/sites-enabled/– содержит символические ссылки на активные конфигурации изsites-available.
Рекомендуемая практика для production: хранить конфигурации каждого сайта в отдельном файле в sites-available и активировать их созданием симлинка. Это упрощает управление и откат изменений.
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Разбор контекста main и events: процессы и соединения
Контекст main содержит глобальные настройки, а events – параметры обработки соединений.
worker_processes auto;– количество рабочих процессов. Значениеautoпозволяет Nginx использовать количество доступных CPU ядер. Для систем с 4 ядрами можно явно указатьworker_processes 4;.worker_connections 1024;– максимальное число одновременных соединений, которые может обработать один worker-процесс.use epoll;– метод обработки событий для Linux.epollэффективен для большого числа соединений.
Максимальное количество одновременных клиентских соединений рассчитывается как worker_processes * worker_connections. Например, 4 процесса по 1024 соединения дают лимит в 4096 соединений. Этот лимит должен быть согласован с настройками ядра Linux, в частности, с лимитом открытых файлов (ulimit -n). Проверить и увеличить лимит можно через /etc/security/limits.conf или системный sysctl параметр fs.file-max.
Базовый production-конфиг nginx.conf с детальными комментариями
Ниже представлен готовый файл /etc/nginx/nginx.conf, который можно использовать как основу для production-среды. Он объединяет оптимизацию производительности и базовые меры безопасности. Подробные комментарии объясняют назначение каждой директивы. Для более глубокого погружения в структуру конфигурации изучите полное руководство по структуре nginx.conf.
# /etc/nginx/nginx.conf
# Контекст main: глобальные настройки
user nginx;
worker_processes auto; # Автоматически использовать количество CPU ядер
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
# Контекст events: обработка соединений
events {
worker_connections 1024; # Максимум соединений на один worker
# worker_connections должен быть меньше ulimit -n (лимит открытых файлов)
multi_accept on; # Принимать несколько соединений за один системный вызов
use epoll; # Эффективный метод обработки событий для Linux
}
# Контекст http: настройки HTTP-сервера
http {
# Базовые настройки
sendfile on; # Использовать sendfile() для отдачи статических файлов, минуя userspace
tcp_nopush on; # Отправлять заголовки и начало файла в одном пакете (требует sendfile on)
tcp_nodelay on; # Отключать алгоритм Нейгла для keepalive-соединений
keepalive_timeout 65; # Таймаут keepalive-соединения в секундах
types_hash_max_size 2048; # Увеличивает размер хэш-таблицы для MIME-типов, улучшая производительность
server_tokens off; # Скрывать версию Nginx в заголовках ответов
# Лимиты для клиентских запросов
client_max_body_size 10m; # Максимальный размер тела запроса (например, для загрузки файлов)
client_body_buffer_size 128k; # Размер буфера для тела запроса
# Настройки MIME-типов
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Базовые заголовки безопасности
add_header X-Frame-Options "SAMEORIGIN" always; # Защита от кликджекинга
add_header X-Content-Type-Options "nosniff" always; # Запрет браузеру "угадывать" MIME-тип
# Для полной настройки безопасности, включая TLS 1.3 и WAF, смотрите отдельное руководство по защите Nginx.
# Настройка логгирования
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
# Таймауты для предотвращения "висящих" соединений
client_header_timeout 10s; # Таймаут чтения заголовка запроса
client_body_timeout 10s; # Таймаут чтения тела запроса
send_timeout 10s; # Таймаут передачи ответа клиенту
reset_timedout_connection on; # Сбрасывать соединения по таймауту, освобождая память
# Настройки Gzip-сжатия
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
# Включение конфигураций виртуальных хостов
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
После внесения изменений в nginx.conf всегда проверяйте синтаксис командой sudo nginx -t.
Логирование, таймауты и обработка ошибок
Настроенное логирование позволяет отслеживать запросы и ошибки. Формат main включает базовые поля. Для интеграции с системами мониторинга (например, ELK Stack) можно использовать JSON-формат.
Директивы таймаутов (client_header_timeout, send_timeout) защищают сервер от исчерпания ресурсов из-за медленных или "битых" соединений. Включение reset_timedout_connection on помогает более агрессивно освобождать сокеты.
Кастомизацию страниц ошибок (502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout) можно выполнить внутри блока server:
error_page 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
internal;
}
Конфигурация виртуального хоста: отдача статики и проксирование
Создайте файл виртуального хоста в /etc/nginx/sites-available/your_domain.conf. Пример ниже покрывает два типовых сценария: отдача статического контента и проксирование запросов на backend-приложение.
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html index.htm;
# Блок для отдачи статических файлов
location / {
try_files $uri $uri/ =404;
}
# Оптимизация отдачи статического контента (CSS, JS, изображения, шрифты)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires max; # Устанавливает максимальный срок кеширования в браузере
add_header Cache-Control "public, immutable"; # Указывает браузеру кешировать файл
# Если файлы предварительно сжаты (например, .gz), можно использовать:
# gzip_static on;
try_files $uri =404;
}
# Проксирование запросов на бэкенд-приложение (например, на порт 3000)
location /api/ {
proxy_pass http://localhost:3000/; # Слеш в конце важен для корректной передачи пути
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;
# Настройки буферизации и таймаутов
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}
}
Активируйте конфигурацию и проверьте синтаксис:
sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/
sudo nginx -t
Оптимизация отдачи статического контента
Блок location для статических файлов использует директиву expires max, которая сообщает браузеру кешировать ресурсы на максимально возможный срок (примерно 1 год). Заголовок Cache-Control "public, immutable" дополнительно указывает, что ресурс может кешироваться публично (CDN, прокси) и не изменится. Это значительно снижает количество запросов к серверу и ускоряет загрузку страниц для повторных посетителей.
Проксирование запросов на бэкенд-приложение
При проксировании критически важно правильно передавать заголовки. proxy_set_header гарантирует, что backend-приложение получит корректный IP-адрес клиента (X-Real-IP, X-Forwarded-For) и протокол (X-Forwarded-Proto). Настройки буферизации (proxy_buffering, proxy_buffer_size) помогают эффективно обрабатывать большие ответы от бэкенда, а таймауты (proxy_read_timeout) предотвращают "зависание" соединений при проблемах с приложением. Для решения более сложных задач, таких как балансировка нагрузки между несколькими бэкендами, изучите продвинутое руководство по настройке Nginx как балансировщика.
Финальная проверка, запуск и базовый мониторинг
Перед применением любых изменений в production-среде выполните обязательную проверку. Это минимизирует риск сбоя.
- Проверка синтаксиса:
sudo nginx -t. Команда должна вернутьnginx: configuration file /etc/nginx/nginx.conf test is successful. - Безопасное применение конфигурации:
sudo nginx -s reload. Эта команда перезагружает конфигурацию без прерывания обработки текущих соединений (graceful reload). - Проверка открытых портов:
sudo ss -tlnp | grep nginx. Убедитесь, что Nginx слушает ожидаемые порты (например, 80, 443). - Мониторинг логов в реальном времени:
sudo tail -f /var/log/nginx/access.log /var/log/nginx/error.log. Помогает сразу увидеть ошибки или подозрительную активность после релоада. - Базовое нагрузочное тестирование: Установите
apache2-utilsи выполните простой тест:ab -n 1000 -c 50 http://your_server/. Следите за показателями Requests per second и Time per request в выводе. Для комплексной оптимизации под высокие нагрузки используйте готовые конфигурации для высоких нагрузок.
Регулярно проверяйте логи на наличие ошибок (коды 5xx) и отслеживайте использование ресурсов сервера. Настроенный по этому руководству Nginx обеспечит стабильную и производительную основу для ваших веб-проектов. Для быстрого решения повседневных задач, таких как настройка rate limiting или SSL/TLS, держите под рукой коллекцию рабочих конфигураций Nginx. Если ваши проекты связаны с использованием искусственного интеллекта, для удобного доступа к API различных моделей ИИ, включая GPT и Claude, можно рассмотреть сервис AiTunnel, который предоставляет единый интерфейс без необходимости настройки VPN.