Знакомимся с устройством самого популярного в России сервера, сравниваем его с Apache и разбираемся в конфигурациях.
Сайты в интернете работают на веб-серверах, которые обрабатывают запросы пользователей и отвечают на них. Сегодня один из самых популярных веб-серверов — Nginx, в этом году он отмечает 20-летний юбилей. В этой статье, совместно с Дмитрием Зайцевым, инженером и CTO Flocktory, расскажем о нём.
Дмитрий Зайцев
Что такое 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 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 различаются принципом работы, возможностью конфигурирования, наличием модулей и другими характеристиками. Рассмотрим некоторые из них.
Характеристика | 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, обновите установочные дистрибутивы из репозитория:
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 можно настроить локальную конфигурацию для каждого отдельного сайта.
Сумма процентов больше 100%, так как некоторые сайты одновременно используют два типа веб-серверов.
Расширение протокола HTTP с поддержкой шифрования в целях повышения безопасности соединения.