Код
#статьи

Сервер Nginx: как он работает и как его настроить

Знакомимся с устройством самого популярного в России сервера, сравниваем его с Apache и разбираемся в конфигурациях.

Иллюстрация: Cookie Studio / Freepik / Nginx / Colowgee для Skillbox Media

Сайты в интернете работают на веб-серверах, которые обрабатывают запросы пользователей и отвечают на них. Сегодня один из самых популярных веб-серверов — Nginx, в этом году он отмечает 20-летний юбилей. В этой статье, совместно с Дмитрием Зайцевым, инженером и CTO Flocktory, расскажем о нём.

Содержание

Эксперт

Дмитрий Зайцев

CTO Flocktory, программный директор профессии «DevOps-инженер» в Skillbox, директор программного комитета DevOpsConf.

Что такое Nginx

Nginx (Engine X, или «Энджин-икс») — это программное обеспечение с открытым исходным кодом для создания веб-серверов. Оно принимает запрос клиента, например браузера, обрабатывает его и возвращает ответ.

Сейчас на Nginx размещено 34% всех сайтов в интернете, что делает его самым популярным веб-сервером в мире.

 Веб-серверКоличество размещённых сайтов на 1 января 2024 года, в процентах
Nginx34,1
Apache30,4
Cloudflare21,6
LiteSpeed13,0
Microsoft IIS5,1

Nginx был разработан Игорем Сысоевым в 2002 году в качестве альтернативы серверу Apache, который тогда занимал более 60% рынка. В 2004 году продукт был опубликован для свободного использования, а в 2011-м Игорь с партнёрами организовали свою фирму.

Один из её продуктов — Nginx Plus, платная версия ПО. Она отличается от опенсорсной возможностью мониторить активность сервера, продвинутыми правилами балансировки нагрузки, наличием поддержки и другими техническими нюансами.

Как работает Nginx

Nginx работает как обычный сервер — он получает запросы от клиента, например браузера, и отправляет ему запрашиваемые файлы. Это может быть HTML- и CSS-код, текст, изображения, видео и JS-скрипты, необходимые для отрисовки страницы.

Общий принцип взаимодействия клиента и сервера
Иллюстрация: Polina Vari для Skillbox Media

Но есть особенности. Nginx работает асинхронно с событийно-ориентированной моделью обработки запросов. Благодаря этому он может поддерживать множество соединений без блокирования ввода и вывода. Разберёмся, что это значит.

Например, когда клиент отправляет запрос на передачу ему большого видеофайла, Nginx запускает операцию передачи, а затем освобождает поток обработки запросов, чтобы он мог получить и обработать другие запросы. Когда операция передачи завершается, Nginx обрабатывает результаты и продолжает выполнение других задач.

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

Схема работы Nginx
Инфографика: Майя Мальгина для Skillbox Media

Nginx может быть не только классическим веб-сервером. Его используют и для:

  • Создания прокси-серверов. Если количество запросов большое, то сам Nginx может не справляться с их обработкой. В этом случае он выступает в роли прокси: принимает запрос от клиента, передаёт его отдельному серверу для обработки, получает ответ и возвращает клиенту.
  • SSL/TLS-терминации. Nginx поддерживает оба протокола, обеспечивая шифрование и дешифрование данных. Поэтому его можно использовать в качестве посредника между клиентом и основным веб-сервером, снижая нагрузку на последний.

Nginx или Apache

Перед созданием сайта стоит определиться с вариантом веб-сервера. Чаще всего разработчики выбирают между Nginx и Apache.

Коротко

Nginx — лидер по скорости обработки статического контента, который одинаков для всех пользователей. Например, карточки товаров в онлайн-магазине, лендинги, новостные сайты и так далее.

Apache больше подходит для динамического контента. Это всё, что генерируется во время запроса клиента и может изменяться от запроса к запросу.

Интересно, что сайт может работать на двух разных веб-серверах одновременно. В этом случае Nginx будет принимать все запросы и самостоятельно обрабатывать статический контент, а динамический — переправлять Apache.

Подробно

Nginx и Apache различаются принципом работы, возможностью конфигурирования, наличием модулей и другими характеристиками. Рассмотрим некоторые из них.

ХарактеристикаApacheNginx
Принцип работыНа каждый запрос клиента создаётся отдельный процесс. Но возможна работа и с одним мастер-процессомОдин мастер-процесс, создающий дочерние процессы для обработки запросов клиента
Возможность конфигурированияОбработка запросов настраивается на уровне каталогов при помощи файла .htaccess. В нём можно определить порядок аутентификации, авторизации, права доступа отдельных пользователей и другоеТонкой настройки на уровне каталогов нет. Можно задать конфигурацию для мастер-процесса, контролирующего работу всего веб-сервера
Работа с модулямиДополнительные модули могут быть подключены при работающем сервереДополнительные модули должны быть выбраны и скомпилированы с ядром сервера. «Горячее» подключение невозможно
Поддержка операционных системРаботает на всех Unix-подобных ОС и WindowsПоддерживает большинство Unix-подобных ОС. На Windows имеются ограничения функциональности
Простота настройкиТребуется настройка на нескольких уровнях операционной системы, в том числе отдельных файлов .htaccessПростая настройка на этапе сборки или одного конфигурационного файла

Подготовка и установка Nginx

Веб-сервер Nginx можно установить на разные операционные системы: Linux (дистрибутивы Ubuntu, Debian, CentOS и другие), Unix-подобные (например, FreeBSD или облачные) или macOS.

Важно!

Если вы решите разместить сервер локально, например на компьютере с Windows, то сделать это можно только с ограничениями, установив бета-версию. Подробно почитать об этом можно в официальной документации.

Мы же в этом разделе рассмотрим установку Nginx на Ubuntu, размещённой на хостинге. Это один из основных сценариев использования веб-сервера.

Установить дистрибутив Nginx можно несколькими способами: с официального сайта, скачав необходимый пакет для Linux, или из репозитория Ubuntu, где он присутствует по умолчанию. Выберем второй вариант, как самый удобный.

Перед установкой Nginx вам потребуется выбрать и оплатить хостинг. После этого войдите в его панель управления под стандартной учётной записью, имеющей привилегию на запуск команды sudo.

Используя систему управления пакетами apt, обновите установочные дистрибутивы из репозитория:

sudo apt update

Теперь установите сам Nginx:

sudo apt install nginx

После завершения установки добавьте сервер в список на автозагрузку:

sudo systemctl enable nginx

Всё готово к его настройке.

Настройка сервера Nginx

В Linux-системах популярной и простой утилитой для настройки политик безопасности является UFW (Uncomplicated Firewall). По умолчанию в ней стоит запрет на все входящие соединения. Поэтому откроем нужные нам порты:

  • 22 — для удалённого доступа по SSH;
  • 80 — для связи между клиентом и сервером по протоколу HTTP;
  • 443 — для связи между клиентом и сервером по протоколу HTTPS.

Установите UFW и предоставьте ей доступ к веб-серверу:

sudo nano /etc/ufw/applications.d/nginx.ini

Проверьте список доступных для UFW приложений:

sudo ufw app list

Среди них должен быть Nginx:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Внесите разрешения на открываемые порты:

sudo ufw allow 'Nginx HTTP

Чтобы проверить их статус, введите:

sudo ufw status

Ответ должен выглядеть так:

To                        Action      From
OpenSSH                   ALLOW       Anywhere                  
Nginx HTTP                ALLOW       Anywhere                  
OpenSSH (v6)              ALLOW       Anywhere (v6)             
Nginx HTTP (v6)           ALLOW       Anywhere (v6)

Проверьте работоспособность сервера:

sudo service nginx status

Если он запущен и активен, то вернётся ответ Active: active (running) since….

Чтобы проверить доступность по HTTP, то есть статус портов для входящих запросов, откройте в браузере страницу сервера.

Если всё настроено как надо, вы увидите сообщение:

Скриншот: Microsoft

Остаётся проверить наличие сервера в списке на автозагрузку:

sudo systemctl is-enabled nginx

В ответ должно вернуться enabled.

Для управления Nginx используются базовые команды. Основные из них:

  • sudo systemctl start nginx — запуск веб-сервера;
  • sudo systemctl restart nginx — перезапуск;
  • sudo systemctl reload nginx — перезагрузка;
  • sudo systemctl stop nginx — отключение;
  • sudo systemctl status nginx — проверка состояния сервера;
  • sudo nginx -t — тестирование конфигурации.

Иерархия каталогов Nginx

Для анализа работы сервера и ручного внесения изменений в файлы стоит знать расположение и иерархию наиболее важных папок:

  • /var/www/html — начальная страница;
  • /etc/nginx — директория с основными файлами настроек;
  • etc/nginx/nginx.conf — главный конфигурационный файл Nginx;
  • /etc/nginx/sites-available — каталог с конфигурациями для каждого из сайтов, содержащий информацию о них: имя, IP и другое;
  • /etc/nginx/sites-enabled — в отличие от предыдущей директории, здесь содержатся конфигурации только активных сайтов, которые обслуживаются Nginx;
  • /etc/nginx/snippets — сниппеты для подключения к основной конфигурации сервера;
  • /var/log/nginx — директория с логами событий.

Конфигурация Nginx

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

Директивы прописываются автоматически при установке и настройке Nginx, но при необходимости можно их редактировать или даже импортировать сторонний файл.

Есть два уровня конфигурации: глобальный и локальный. Первый отвечает за работу всего сервера, а локальный — отдельных сайтов.

Синтаксис параметров конфигурации такой: Имя_директивы [Значение1] [Значение2] [Значение3…];

В качестве разделителя выступает знак табуляции или пробел. Завершается параметр обязательно точкой с запятой.

Посмотрим на то, как выглядит простая директива:

access_log /var/nginx/access.log main;

Пример с двойным значением:

index index.html index.htm;

Также параметры могут быть блочными, состоящими из нескольких строк. Отдельные блоки в них разделяются фигурными скобками:

http {
  include conf/mime.types;
  include /etc/nginx/sites-enabled/*;
}

Кроме того, несколько блочных директив можно объединить в одно целое. Например так:

server {
    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

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

sudo nano /etc/nginx/nginx.conf

Обычно он имеет многострочную структуру. Например:

Скриншот: Linux Hint

Разберём построчно, что указано в конфигурации:

  • user — имя пользователя.
  • worker_processes — количество рабочих процессов. Значение auto устанавливает его равным количеству процессорных ядер.
  • error_log — путь к логам ошибок веб-сервера.
  • pid — файл с номером главного процесса.
  • events — блок, состоящий из параметров, влияющих на работу сетевого соединения. Здесь указано worker_connections 1024 — максимальное число одновременно работающих соединений одного рабочего процесса.
  • http — контекст, состоящий из директив, отвечающих за работу HTTP.
  • include указывает на подключение иных файлов конфигурации.
  • default_type задаёт MIME-тип ответов сервера по умолчанию.
  • server — в этом блоке задаются конфигурации виртуального сервера.
  • listen обозначает порт, который прослушивается, в нашем примере это порт 80 (HTTP), использующийся для веб-запросов.
  • access_log — путь к файлу, в котором сохраняется история обращений к веб-серверу.
  • index — главная страница сайта.
  • root — корневой путь для запросов к серверу.
  • index— имя файла, который будет определяться как индексный.

Существуют и другие параметры, которые могут быть указаны в конфигурации. Их можно посмотреть здесь.

Что запомнить

Резюмируем, что мы сегодня узнали:

  • Nginx — это веб-сервер, принимающий запросы от клиента и обрабатывающий их. Кроме этого, его можно использовать для создания прокси-серверов и SSL/TLS-терминации.
  • Nginx работает асинхронно с событийно-ориентированной моделью обработки запросов. Благодаря этому он может поддерживать множество соединений без блокирования ввода и вывода.
  • Работа сервера определяется директивами в конфигурационном файле. Кроме глобального уровня управления в Nginx можно настроить локальную конфигурацию для каждого отдельного сайта.

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!

Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Научитесь: Профессия Python-разработчик Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована