Установка Nginx на Ubuntu, Debian, ALT Linux, RedOS и CentOS | SecureFlow

Установка Nginx на Ubuntu, Debian, ALT Linux, RedOS и CentOS

Постер статьи

Содержание

Что такое Nginx и зачем он нужен?

Nginx (Engine X) — это лёгкий и высокопроизводительный веб‑сервер с открытым исходным кодом, впервые появившийся в 2004 году под редакцией Игоря Сысоева. Благодаря событийной (асинхронной) архитектуре, Nginx способен обрабатывать десятки тысяч одновременных соединений с минимальным потреблением памяти и CPU, что делает его одним из самых популярных серверов в мире: по состоянию на начало 2025 года более 30 % всех веб‑сайтов используют Nginx в качестве сервера.

  • Обратное проксирование и балансировка нагрузки. Nginx умеет принимать входящие запросы и распределять их между несколькими серверами приложений (PHP‑FPM, Node.js, Python, Go и др.), что повышает отказоустойчивость и упрощает горизонтальное масштабирование.
  • Отдача статического контента. Благодаря оптимизированной системе sendfile и буферизации, Nginx быстро отдаёт файлы (HTML, CSS, JS, изображения, видео), минимизируя задержки.
  • Поддержка SSL/TLS «из коробки». Можно легко подключить сертификаты от Let's Encrypt или коммерческих провайдеров, настроить HSTS и OCSP Stapling для повышения безопасности.
  • Кэширование. Встроенный механизм proxy_cache и fastcgi_cache позволяет хранить ответы от бэкенда в памяти или на диске, уменьшая нагрузку на серверы приложений и ускоряя выдачу повторяющихся запросов.
  • Гибкие возможности по расширению. Существует масса модулей (официальных и сторонних), позволяющих обрабатывать HTTP/2, HTTP/3 (QUIC), WebSocket, а также писать собственные скрипты на Lua.

В результате правильная конфигурация Nginx положительно влияет на скорость загрузки страниц, снижает задержки, улучшает метрики Core Web Vitals и, как следствие, повышает позиции сайта в поисковой выдаче.

1. Подготовка окружения для установки Nginx

Перед началом работы убедитесь, что:

  • У вас есть доступ к серверу с правами root или пользователем, входящим в группу sudo.
  • Сервер подключён к интернету и обновлены системные репозитории.

Совет по безопасности:
На продакшн‑серверах лучше выполнять команды через sudo для минимизации рисков, а не оставаться в среде root дольше, чем нужно. Чтобы выйти из root‑сессии, используйте exit или нажмите Ctrl+D.

1.1 Ubuntu / Debian

sudo -i

1.2 RedOS / ALT Linux

su -

2. Установка Nginx на различные дистрибутивы

По умолчанию в официальных репозиториях многие дистрибутивы содержат достаточно актуальные пакеты Nginx. Однако если требуется самая свежая стабильная или mainline‑версия, можно подключить официальный репозиторий от nginx.org (рекомендуется для продакшн‑систем).

Обновляем системные пакеты и устанавливаем утилиты:

2.1 Ubuntu / Debian

sudo apt update
sudo apt install -y nginx

2.2 RedOS / CentOS Stream 10

sudo dnf update -y
sudo dnf install -y nginx

2.3 ALT Linux

В ALT Linux по умолчанию обычный пользователь не входит в группу wheel, поэтому ему нужно предоставить соответствующие права для использования sudo. Чтобы это сделать, выполните следующие шаги:

  1. Переключитесь на пользователя root
    su -
    
  2. Добавьте нужного пользователя в группу wheel
    Замените имя_пользователя на реальное имя пользователя:
    usermod -aG wheel имя_пользователя
    
  3. Откройте файл /etc/sudoers
    nano /etc/sudoers
    
  4. Разрешите членам группы wheel выполнять команды через sudo
    Найдите строку:
    #WHEEL_USERS ALL=(ALL:ALL) ALL
    
    и удалите символ # в начале строки, чтобы получилось:
    WHEEL_USERS ALL=(ALL:ALL) ALL
    
  5. Выйдите из-под root и проверьте sudo
    exit
    
    Теперь попробуйте выполнить любую команду с sudo, например:
    sudo whoami
    
    Ожидается, что в ответе будет root.

Теперь обновите список пакетов и установите nginx

sudo apt-get update -y
sudo apt-get install -y nginx

3. Запуск и автозапуск службы

После установки запускаем и включаем автозапуск:

sudo systemctl enable --now nginx

Проверяем статус:

sudo systemctl status nginx

Если Nginx запущен успешно, вы увидите строчку:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since

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

Конфигурация Nginx организована в виде иерархии:

/etc/nginx/
├── nginx.conf
├── conf.d/
│   └── default.conf
├── sites-available/        # (Debian/Ubuntu/ALT Linux)
│   └── example.com.conf
├── sites-enabled/          # (Debian/Ubuntu/ALT Linux)
│   └── example.com.conf -> ../sites-available/example.com.conf
├── snippets/
│   ├── ssl-params.conf
│   └── fastcgi-php.conf
└── mime.types

4.1 Главный файл: /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log warn;

events {
    worker_connections 1024;
    # Ограничивает число соединений на один worker.
    # При worker_processes auto и 4 ядрах CPU получится до 4096 соединений.
    multi_accept on;
}

http {
    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;

    sendfile        on;
    tcp_nopush      on;
    aio             on;
    keepalive_timeout  65;
    client_max_body_size 100m;

    # Включаем сжатие (gzip) для текстовых и JSON-ответов
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
    # Включаем HTTP/2 (при наличии SSL в server-блоках достаточно listen 443 ssl http2;)
    
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
  • user www-data; — определяет системного пользователя, под которым будут работать рабочие процессы.
  • worker_processes auto; — Nginx сам определит оптимальное число worker-процессов по количеству ядер CPU.
  • worker_connections — максимальное число одновременных соединений на один worker. Общее максимальное количество соединений = worker_processes × worker_connections.
  • sendfile on; и tcp_nopush on; ускоряют отдачу статических файлов.
  • aio on; позволяет Nginx использовать асинхронный ввод‑вывод, что дополнительно снижает нагрузку.
  • client_max_body_size 100m; указывает максимальный размер тела запроса (например, при загрузке файлов).

4.2 Каталоги с дополнительными конфигурациями

4.2.1 /etc/nginx/conf.d/

Файлы *.conf в этом каталоге автоматически подключаются из главного nginx.conf. Обычно здесь размещают:

  • Глобальные правила проксирования (upstream-блоки)
  • Общие шаблоны (templates) для нескольких сайтов
  • Конфигурации, не входящие в sites-available

Пример /etc/nginx/conf.d/load_balancer.conf:

upstream backend {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    least_conn;
}

server {
    listen 80;
    server_name api.example.com;

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

4.2.2 /etc/nginx/sites-available/ и /etc/nginx/sites-enabled/

Примечание (Debian/Ubuntu/ALT Linux).
На CentOS/RedOS обычно каталогов sites-available и sites-enabled нет, всё хранится в conf.d/. В других дистрибутивах можно вручную создать такие каталоги для удобства.

  1. sites-available/ — здесь лежат конфигурации виртуальных хостов для каждого домена, но они не активны до создания символической ссылки.
  2. sites-enabled/ — ссылки на файлы из sites-available/. При перезагрузке Nginx активируются только они.

Чтобы включить сайт:

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

Чтобы отключить:

sudo rm /etc/nginx/sites-enabled/example.com.conf

Пример sites-available/example.com.conf:

server {
    listen       80;
    server_name  example.com www.example.com;
    root         /var/www/example.com/html;
    index        index.html index.htm index.php;

    # Обработка запросов к статическим файлам
    location / {
        try_files $uri $uri/ =404;
    }

    # Проксирование /api/ на внутренний backend
    location /api/ {
        proxy_pass http://127.0.0.1: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;
    }

    # Обработка PHP через PHP-FPM
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }

    # Настройка логов для этого сайта
    access_log  /var/log/nginx/example.com.access.log  main;
    error_log   /var/log/nginx/example.com.error.log warn;
}
  • listen 80; — прослушивать HTTP-порт 80.
  • server_name example.com www.example.com; — доменные имена, по которым обрабатывается трафик.
  • root /var/www/example.com/html; — корневая папка сайта.
  • index index.html index.htm index.php; — при обращении к директории отдаёт эти файлы по умолчанию.
  • try_files $uri $uri/ =404; — попытаться вернуть файл, затем папку, иначе выдать 404.
  • location /api/ { proxy_pass http://127.0.0.1:3000; ... } — проксирование запросов в бэкенд-сервис.
  • location ~ \.php$ { ... } — регулярное выражение: обрабатывает все .php файлы через FastCGI.

4.2.3 /etc/nginx/snippets/

Содержит «сниппеты» — фрагменты конфигураций для включения в разные server- и location-блоки, чтобы не дублировать код.

  • fastcgi-php.conf (Debian/Ubuntu) — включает основные параметры для PHP-FPM:
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    include fastcgi.conf;
    
  • ssl-params.conf — рекомендуемые безопасные настройки SSL/TLS:
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    

5. Базовые блоки конфигурации Nginx

5.1 events { … }

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;      # Для Linux-ядра; на других ОС выбирается автоматически
}
  • worker_connections — максимальное количество соединений, обрабатываемых одним worker.
  • multi_accept on; — позволяет воркеру сразу принимать все ожидающие соединения, а не по одному.
  • use epoll; — рекомендуемый метод для Linux. На системах BSD/Cross-Platform используется kqueue или select.

5.2 http { … }

http {
    sendfile on;
    tcp_nopush on;
    aio on;
    directio 512;
    keepalive_timeout 65;
    client_max_body_size 100m;
    client_body_buffer_size 128k;

    gzip on;
    gzip_min_length 1024;
    gzip_buffers 4 16k;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_vary on;

    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 warn;

    # Настройка кеша для проксирования
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
  • directio 512; позволяет использовать прямой ввод‑вывод для больших файлов (>512 байт).
  • client_body_buffer_size 128k; буфер для тела запроса (например, при загрузке файлов).
  • proxy_cache_path /var/cache/nginx …; настраивает дисковый кэш для проксируемых ответов.

5.3 server { … }

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm index.php;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include snippets/ssl-params.conf;

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

    location /api/ {
        proxy_pass http://127.0.0.1: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;
        proxy_cache my_cache;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

    access_log /var/log/nginx/example.com.access.log main;
    error_log  /var/log/nginx/example.com.error.log warn;
}
  • listen 443 ssl http2; — подключаем SSL и включаем HTTP/2.
  • include snippets/ssl-params.conf; — подключаем безопасные параметры SSL/TLS.
  • location /api/ { ... } proxy_cache my_cache; — пример включения кэша для бэкенда.

5.4 location { … }

  • location = /favicon.ico { log_not_found off; access_log off; } — пример отключения логов для favicon.
  • location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; } — отдаём статические файлы с заголовком Expires, чтобы браузеры кэшировали их 30 дней.
  • location ~ \.php$ { ... } — регулярное выражение для обработки PHP‑скриптов.

Приоритет сопоставления location:

1. Точное совпадение (=).
2. Префиксное совпадение (длиннейший префикс).
3. Регулярные выражения (~, ~*, ^~).
4. Стандартное префиксное совпадение (самое длинное).

6. Проверка синтаксиса и перезагрузка

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

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

sudo nginx -t

Если ошибок нет, вы увидите:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если есть ошибки, Nginx подскажет строку и файл, где проблема.

6.2 Плавная перезагрузка (graceful reload)

Чтобы применить новые настройки без разрыва активных соединений:

sudo systemctl reload nginx
# или
sudo nginx -s reload

Nginx запустит новые worker‑процессы с новой конфигурацией, а старые завершат обработку текущих запросов и завершатся самостоятельно.

6.3 Полная перезагрузка / рестарт

Если нужно перезапустить службу «насильно»:

sudo systemctl restart nginx

При этом все активные соединения будут сброшены, и запустятся новые процессы.

6.4 Диагностика ошибок

Просмотр статуса службы

sudo systemctl status nginx

Логи systemd

sudo journalctl -u nginx --since "1 hour ago"

Логи Nginx:

  • /var/log/nginx/error.log — основные ошибки (по умолчанию уровень «warn»).
  • /var/log/nginx/access.log — все запросы к серверу.

Если после изменений Nginx не стартует, обычно в error.log или journalctl видно, какая директива или файл ошибок.

7. Дополнительные советы по оптимизации

Тюнинг worker_processes и worker_connections

worker_processes auto; обычно достаточно, но при специфических нагрузках можно задать вручную.

worker_connections увеличивайте пропорционально ожидаемому трафику. Например, для сайта с 100 000 одновременными посетителями при 4 ядрах:

worker_processes 4;
worker_connections 16384;

Общее максимальное число соединений: 4 × 16384 = 65 536.

Буферизация и таймауты

client_body_buffer_size 128k;
client_body_timeout 20s;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
send_timeout 5s;

Эти параметры помогают защититься от «медленных» клиентов и предотвратить DDoS‑атаки.

Кэширование

proxy_cache: ускоряет выдачу контента, если бэкенд не успевает отвечать.

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_zone:10m max_size=5g inactive=60m use_temp_path=off;

А в server-блоке:

location / {
    proxy_cache my_zone;
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404      1m;
}

fastcgi_cache: аналогично для PHP/FastCGI.

HTTP/2 и HTTP/3

Для включения HTTP/2 достаточно добавить http2 в параметр listen:

listen 443 ssl http2;

Для HTTP/3 (QUIC) потребуется собранный модуль Quiche и дополнительная настройка, что выходит за рамки базовой статьи.

Заключение

В этой статье мы кратко рассмотрели:

  • Что такое Nginx и его ключевые функции (обратное проксирование, отдача статического контента, SSL/TLS, кэширование).
  • Как установить Nginx на популярных дистрибутивах Linux (Ubuntu/Debian, CentOS, RedOS, ALT Linux).
  • Основную структуру конфигурационных файлов: nginx.conf, каталоги conf.d/, sites-available/ и sites-enabled/, snippets/.
  • Базовые блоки конфигурации: events, http, server, location.
  • Проверку синтаксиса, перезагрузку службы и основные команды для диагностики.
  • Несколько советов по оптимизации производительности и кэшированию.

Теперь у вас есть представление, как быстро развернуть и настроить Nginx для стандартных задач: от простого статического сайта до проксирования приложения. Дальше можно углубиться в темы балансировки нагрузки, расширенного кэширования и мониторинга.

Если вы собираетесь проксировать приложения на Go, рекомендуем ознакомиться с обзором возможностей фреймворка Gin, где подробно разобрано, как с ним работать и какие функции он предоставляет. Это отличный выбор для написания быстрых и лёгких веб-приложений.

Удачи в настройке и эксплуатации Nginx!