Руководство по установке и настройке Nginx

Nginx (произносится «Энжин-Икс») — высокопроизводительный веб-сервер, разработанный Игорем Сысоевым и впервые выпущенный в 2004 году. Он завоевал популярность благодаря своей асинхронной, событийно-ориентированной архитектуре, которая позволяет обрабатывать десятки тысяч соединений одновременно с минимальным потреблением памяти. Nginx отлично подходит для статических файлов, а также как обратный прокси и балансировщик для динамических приложений (например, на PHP, Python, Node.js).

В этой статье мы подробно разберём установку Nginx на основных операционных системах, структуру конфигурационных файлов, базовые и продвинутые настройки, создание серверных блоков (аналог виртуальных хостов в Apache), настройку HTTPS, работу с модулями и многое другое с наглядными примерами.

1. Установка Nginx

Способ установки зависит от вашей операционной системы. Рассмотрим основные варианты.

1.1 Установка на Ubuntu / Debian

В дистрибутивах на основе Debian пакет Nginx доступен в официальных репозиториях.

Bash
# Обновление списка пакетов
sudo apt update

# Установка Nginx
sudo apt install nginx

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

# Запуск сервера
sudo systemctl start nginx

После установки откройте в браузере http://localhost — вы должны увидеть стандартную страницу приветствия Nginx.

Важно: Если порт 80 уже занят другим сервером (например, Apache), остановите его или измените порт в конфигурации Nginx (об этом ниже).

1.2 Установка на CentOS / RHEL / Rocky Linux

В этих дистрибутивах Nginx обычно устанавливается из EPEL-репозитория.

Bash
# Установка EPEL (если ещё не установлен)
sudo dnf install epel-release

# Установка Nginx
sudo dnf install nginx

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

# Запуск сервера
sudo systemctl start nginx

1.3 Установка на Windows

Для Windows Nginx распространяется в виде ZIP-архива:

  1. Скачайте последнюю стабильную версию с официального сайта Nginx.
  2. Распакуйте архив в папку, например, C:\nginx.
  3. Запустите из командной строки: start nginx (из папки C:\nginx).
  4. Для остановки выполните: nginx -s stop
  5. Для перезагрузки конфигурации: nginx -s reload

1.4 Установка из исходных кодов

Если нужна специфическая сборка с дополнительными модулями:

Bash
# Скачивание исходников (замените версию на актуальную)
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# Конфигурация с указанием пути установки и модулей
./configure --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-http_realip_module \
    --with-http_gzip_static_module

# Сборка и установка
make
sudo make install

# Запуск
/usr/local/nginx/sbin/nginx

Подробные инструкции по установке из исходных кодов содержатся в официальной документации Nginx.

2. Структура конфигурационных файлов

В отличие от Apache, у Nginx нет одного большого файла httpd.conf. Конфигурация строится по модульному принципу:

СистемаГлавный конфигурационный файлДополнительные директивы
Ubuntu/Debian/etc/nginx/nginx.conf/etc/nginx/sites-available//etc/nginx/sites-enabled//etc/nginx/conf.d/
CentOS/RHEL/etc/nginx/nginx.conf/etc/nginx/conf.d/
Arch Linux/etc/nginx/nginx.conf/etc/nginx/conf.d/

Главный файл nginx.conf включает в себя блок http, внутри которого могут быть блоки server (виртуальные хосты) и общие настройки.

Синтаксис конфигурационных файлов:

  • Директивы заканчиваются точкой с запятой ;
  • Блоки обозначаются фигурными скобками { ... }
  • Комментарии начинаются с #
  • Вложенные блоки разрешены
  • Вложенность и отступы важны для читаемости

Проверка синтаксиса

Перед перезагрузкой сервера всегда проверяйте конфигурацию:

Bash
nginx -t

Если синтаксис корректен, вы увидите: nginx: configuration file /etc/nginx/nginx.conf test is successful

Это обязательная практика — неправильная конфигурация может привести к падению сервера.

3. Основные директивы nginx.conf

Разберём ключевые директивы, которые вы найдёте в главном конфигурационном файле.

3.1 Базовые настройки

Nginx
# Пользователь, от имени которого работают рабочие процессы
user www-data;

# Количество рабочих процессов (обычно равно числу ядер CPU)
worker_processes auto;

# Файл, в который записывается PID основного процесса
pid /run/nginx.pid;

# Максимальное количество открытых файлов на один рабочий процесс
worker_rlimit_nofile 65535;

3.2 Основной блок events (управление соединениями)

Nginx
events {
    # Максимальное количество соединений на один рабочий процесс
    worker_connections 1024;
     
    # Разрешить приём множества соединений в одном системном вызове
    multi_accept on;
}

3.3 Блок http (глобальные настройки веб-сервера)

Nginx
http {
    # Базовые MIME-типы
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Формат логов
    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;

    # Основные настройки производительности
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    
    # Таймауты соединений
    keepalive_timeout 65;
    types_hash_max_size 2048;
    
    # Сжатие 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/rss+xml;

    # Подключение файлов с настройками виртуальных хостов
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

3.4 Базовый блок server (виртуальный хост по умолчанию)

Nginx
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    
    server_name _;
    
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

4. Серверные блоки (Server Blocks / Виртуальные хосты)

В Nginx виртуальные хосты называются серверными блоками и описываются внутри блока http с помощью директивы server. Аналогично Apache, они позволяют размещать несколько сайтов на одном IP-адресе.

4.1 Настройка серверных блоков

Шаг 1: Создайте директории для сайтов:

Bash
# Создание папок для сайтов
mkdir -p /var/www/site1.com/html
mkdir -p /var/www/site2.com/html

# Создание тестовых страниц
echo "<h1>Site 1</h1>" > /var/www/site1.com/html/index.html
echo "<h1>Site 2</h1>" > /var/www/site2.com/html/index.html

Шаг 2: Создайте конфигурационные файлы в /etc/nginx/sites-available/:

Nginx
# /etc/nginx/sites-available/site1.conf
server {
    listen 80;
    server_name site1.com www.site1.com;
    root /var/www/site1.com/html;
    index index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}
Nginx
# /etc/nginx/sites-available/site2.conf
server {
    listen 80;
    server_name site2.com www.site2.com;
    root /var/www/site2.com/html;
    index index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

Шаг 3: Активируйте сайты, создав символические ссылки в sites-enabled/:

Bash
ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/

Шаг 4: Проверьте конфигурацию и перезагрузите Nginx:

Bash
nginx -t
systemctl reload nginx

4.2 Серверный блок по умолчанию

Bash
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /var/www/default;
    index index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

Серверный блок с default_server будет обслуживать запросы, которые не соответствуют ни одному другому блоку.

4.3 Обработка нескольких доменов

Nginx
server {
    listen 80;
    server_name example.com www.example.com site1.net www.site1.net;
    root /var/www/multi-site/html;
}

4.4 Использование location для разных URI

Nginx
server {
    listen 80;
    server_name example.com;
    root /var/www/example/html;
    
    # Обработка статики
    location /static/ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
    
    # Обработка изображений
    location /images/ {
        expires 1y;
        add_header Cache-Control "public";
    }
    
    # Проксирование на бэкенд (например, Node.js)
    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;
    }
}

💡 Этот блок подходит для WebSocket-соединений (например, Socket.io). Заголовки Upgrade и Connection обязательны, иначе соединение будет сбрасываться.

Регулярные выражения в location и map легко допустить ошибку — одна лишняя слеш или пробел ломает правило. В конструкторе Nginx-правил на codestack.space можно собрать типовые сценарии (кеширование, прокси, редиректы) и получить готовый блок конфигурации без ручного подбора regex.

5. Модули Nginx

Nginx поддерживает динамическую загрузку модулей (начиная с версии 1.9.11). В отличие от Apache, большинство модулей компилируются статически или загружаются через директиву load_module.

5.1 Основные модули

МодульНазначение
ngx_http_ssl_moduleПоддержка HTTPS (SSL/TLS)
ngx_http_v2_moduleПоддержка HTTP/2
ngx_http_proxy_moduleПроксирование запросов на бэкенд
ngx_http_upstream_moduleБалансировка нагрузки
ngx_http_gzip_moduleСжатие ответов
ngx_http_rewrite_moduleПерезапись URL (встроен)
ngx_http_realip_moduleПередача реального IP клиента через прокси

5.2 Подключение динамического модуля

Nginx
# В самом начале nginx.conf
load_module /usr/lib/nginx/modules/ngx_http_image_filter_module.so;

5.3 Условная обработка с помощью map

Nginx
http {
    map $http_user_agent $mobile {
        default 0;
        ~*iPhone 1;
        ~*Android 1;
    }
    
    server {
        location / {
            if ($mobile) {
                rewrite ^ /mobile/ redirect;
            }
        }
    }
}

6. Настройка HTTPS (SSL/TLS)

6.1 Создание самоподписанного сертификата

Bash
# Создание директории для сертификатов
sudo mkdir -p /etc/nginx/ssl

# Генерация сертификата (замените SERVER_FQDN на ваше доменное имя)
sudo openssl req -x509 -nodes \
    -addext "subjectAltName=DNS:SERVER_FQDN,DNS:www.SERVER_FQDN" \
    -days 730 \
    -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/nginx.key \
    -out /etc/nginx/ssl/nginx.crt

6.2 Настройка серверного блока для HTTPS

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

    root /var/www/example/html;
    index index.html;

    # SSL-сертификаты
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    # Настройки SSL для повышения безопасности
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    # ssl_prefer_server_ciphers on;  # не требуется в современных версиях
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

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

Такие заголовки, как HSTS, CORS и защита от кликджекинга, удобно добавлять готовыми блоками. Конструктор правил позволяет выбрать нужные опции и получить корректный фрагмент для вставки в server или http.

6.3 Перенаправление HTTP → HTTPS

Nginx
server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

7. Nginx как обратный прокси и балансировщик

Одно из самых частых применений Nginx — проксирование запросов к внутренним сервисам (Node.js, Python, PHP-FPM, Java и т.д.).

7.1 Проксирование на PHP-FPM

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

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

⚠️ Важно: SCRIPT_FILENAME должен указывать на реальный путь к файлу на диске. Если root задан в server, а не в location, убедитесь, что $document_root подставляется корректно.

7.2 Проксирование на Node.js / Express

Nginx
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

7.3 Балансировка нагрузки (upstream)

Nginx
http {
    upstream backend {
        # Стратегия распределения: round-robin по умолчанию
        server backend1.example.com weight=3;
        server backend2.example.com weight=1;
        server backend3.example.com backup;  # резервный
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

Для балансировки и upstream-пулов можно использовать шаблоны: в конструкторе есть заготовки под разные стратегии (round-robin, weight, backup) с пояснениями, что делает каждый параметр.

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

8.1 systemd (Ubuntu/Debian/CentOS 7+)

Bash
# Запуск
sudo systemctl start nginx

# Остановка
sudo systemctl stop nginx

# Перезапуск (для применения изменений конфигурации)
sudo systemctl restart nginx

# Плавный перезапуск (без разрыва соединений)
sudo systemctl reload nginx

# Проверка статуса
sudo systemctl status nginx

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

8.2 Сигналы Nginx (без systemd)

Bash
# Быстрый перезапуск (новый мастер-процесс)
nginx -s reload

# Плавная остановка (завершение обработки запросов)
nginx -s quit

# Немедленная остановка
nginx -s stop

# Повторное открытие лог-файлов (ротация логов)
nginx -s reopen

9. Настройка фаервола

Не забудьте открыть порты:

Ubuntu (UFW):

Bash
sudo ufw allow 'Nginx Full'   # HTTP (80) и HTTPS (443)

CentOS/RHEL (firewalld):

Bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

⚠️ Перед открытием портов убедитесь, что у сервера есть публичный IP и правила фаервола хостинга (например, панель Reg.ru, AWS, DigitalOcean) также разрешают входящие соединения на 80/443.

10. Безопасность

10.1 Скрытие версии Nginx

Nginx
# В блоке http
server_tokens off;   # Убирает версию из заголовков и страниц ошибок

10.2 Ограничение доступа по IP

Nginx
location /admin/ {
    allow 192.168.1.0/24;
    deny all;
}

10.3 Защита от кликджекинга и XSS

Nginx
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;

10.4 Ограничение количества запросов (лимитирование)

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

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

💡 limit_req_zone можно объявить только в блоке http, а limit_req — в server или location.

11. Кеширование статики

Nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|woff2)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
    # Отключение логов для статики (для производительности)
    access_log off;
}

Мини-чеклист для быстрой проверки конфигурации:

nginx -t — синтаксис в порядке

systemctl reload nginx — применены изменения

Открыты порты 80 и 443 в фаерволе ОС и панели хостинга

Проверены права на файлы и папки (www-data / nginx)

Для PHP — проверен сокет FPM и пути к файлам

12. Заключение

Мы рассмотрели полный цикл работы с Nginx: от установки до тонкой настройки и использования в качестве прокси-сервера и балансировщика. Ключевые выводы:

  1. Всегда проверяйте конфигурацию командой nginx -t перед перезагрузкой.
  2. Используйте серверные блоки (server) для разделения сайтов — это аналог виртуальных хостов в Apache.
  3. Применяйте схему sites-available / sites-enabled для удобного управления сайтами (на Debian/Ubuntu это работает из коробки).
  4. Активно используйте проксирование — Nginx отлично справляется с ролью шлюза для динамических приложений.
  5. Настраивайте кеширование и сжатие для статики, чтобы ускорить загрузку страниц.
  6. Обеспечьте безопасность: скрывайте версию, настраивайте заголовки, используйте лимиты запросов и HTTPS.

Nginx — это мощный, гибкий и очень быстрый инструмент. Он подходит как для небольших проектов, так и для крупных высоконагруженных систем. Освоив его настройку, вы сможете строить надёжные и производительные веб-инфраструктуры.