Главная Веб-разработка Сервер Nginx: как он работает и как его настроить

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

от admin

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

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

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

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

Что такое Nginx

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

 Веб-сервер Количество размещённых сайтов на 1 января 2024 года, в процентах
Nginx 34,1
Apache 30,4
Cloudflare 21,6
LiteSpeed 13,0
Microsoft IIS 5,1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Nginx или Apache

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

Коротко

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

Читать также:
GitHub digest #11: и веселье, и хардкор

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, то есть статус портов для входящих запросов, откройте в браузере страницу сервера.

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

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

Скриншот: 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

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

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

Скриншот: 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 можно настроить локальную конфигурацию для каждого отдельного сайта.

Сумма процентов больше 100%, так как некоторые сайты одновременно используют два типа веб-серверов.

Расширение протокола HTTP с поддержкой шифрования в целях повышения безопасности соединения.

Похожие статьи