Когда мы открываем какой-то сайт в браузере, браузер отправляет запрос, чтобы получить нужные ему файлы: HTML-разметку, стили, скрипты, картинки и другой контент. Этот запрос отправляется на веб-сервер — специальную программу, которая отвечает за передачу таких данных через интернет. Веб-сервер получает запрос, находит запрошенные данные, отправляет браузеру, который их обрабатывает и в итоге показывает нам готовую страницу.
👉 Если интересно, как этот процесс происходит в деталях, почитайте нашу статью о том, что происходит, когда мы открываем сайт в браузере.
Раньше мы уже рассказывали про Apache — один из первых массовых веб-серверов, который до сих пор обслуживает огромное количество сайтов. Сегодня поговорим ещё об одном веб-сервере и расскажем, как работает и зачем нужен nginx. Если что, название nginx произносится как «энджинкс».
Что такое nginx
Nginx — это веб-сервер с открытым исходным кодом, разработанный российским программистом Игорем Сысоевым.
Nginx был создан для того, чтобы обрабатывать большое количество запросов одновременно. С Apache была большая проблема: его производительность падает с ростом трафика. Чем больше людей заходят на сайт, тем хуже с этим справляется веб-сервер. Решения на тот момент были такие:
- устанавливать более мощное оборудование;
- добавлять новые серверы.
И то и другое дорого. Чтобы решить эту проблему, в 2002 году Игорь Сысоев начал разрабатывать свою программу и через два года выпустил первый релиз. Сегодня nginx — самый популярный веб-сервер в мире.
Как работает nginx
Основная функция nginx — веб-серверная обработка HTTP-запросов, но он также может работать как обратный прокси-сервер, балансировщик нагрузки, кэш-сервер и даже почтовый прокси-сервер.
Чтобы понять принцип работы nginx с HTTP-запросами, сначала посмотрим, как с ними работает Apache. Представим, что Apache получил запрос показать страницу сайта с товарами, которые отвечают выбранным критериям. Готовой такой страницы нет — она собирается динамически по фильтрам пользователя.
Чтобы страница всё же появилась, её должен сгенерировать движок сайта (site engine). Получив запрос от браузера, Apache передаёт движку команду собрать страницу, а пока страница генерируется, Apache ничего не делает, а просто ждёт. Если таких запросов много, Apache тратит ресурсы на простой и ожидания, а не на реальную работу.
Nginx устроен немного иначе.
Асинхронность. Асинхронность — суперсила nginx, которая работает примерно так:
- Каждый запрос попадает в список задач.
- Специальный цикл по очереди быстро просматривает каждую задачу и смотрит, надо по ней что-то делать или ещё ждём.
- Если надо делать — делает и отправляет ответ. Или даёт задание другим, чтобы тоже что-то сделали.
- Сразу после этого цикл переходит к другой задаче, и всё повторятся.
- Так круг за кругом цикл перебирает все задачи, которые поступают на сервер, и жонглирует ими, управляя по очереди.
- Чтобы было ещё быстрее, nginx может запустить одновременно несколько таких циклов, синхронизируя их работу друг с другом.
Получается, что nginx не тратит время на ожидание результата, поэтому может одновременно обрабатывать гораздо больше запросов, чем Apache.
Балансировка нагрузки. Nginx часто используется для того, чтобы принимать разные запросы от клиентов, например браузеров, и перенаправлять их на другие ресурсы, например серверы приложений или баз данных. Эти ребята обрабатывают свои запросы и отдают результат nginx, а он возвращает ответы клиентам, то есть выступает в роли прослойки. Технически это называется «обратный прокси-сервер» (reverse proxy).
Обычно используют прямой прокси, он собирает запросы от клиентов и отправляет их на сервер:
Обратный прокси принимает запросы, а затем распределяет их по другим серверам. Например, если nginx видит, что один сервер начинает долго отвечать, он может направить новые запросы на другие серверы, чтобы уменьшить общее время ожидания:
Кэширование. Чтобы ещё больше ускорить время ответа клиенту, nginx умеет сохранять данные по самым частым запросам. Например, на сайте вышла новая статья, и все сразу пошли её читать. Чтобы не посылать каждый раз новый запрос на разные серверы за одной и той же статьёй, nginx кэширует все файлы для ответа и хранит их у себя какое-то время. А когда популярность спадёт, nginx удаляет кэшированные данные из своего хранилища.
Безопасность при большом количестве трафика. В большой компании данные могут храниться на нескольких разных серверах. Открывать их все для публичного доступа небезопасно, потому что чаще всего такие серверы связаны между собой — например, в банковском приложении. Строить защиту для каждого сервера долго, дорого и сложно. Достаточно забыть обновить ПО на одном из серверов, и уязвимость получает вся система.
Nginx может служить одним окном входа — можно открыть для публичного доступа только этот веб-сервер и сосредоточить все усилия по безопасности на нём.
Nginx и статические и динамические сайты
Страницы бывают статическими и динамическими:
- Статические страницы — это готовые документы, которые не меняются. Например, сайты-визитки или страницы со статьями всегда выглядят одинаково — до тех пор, пока в их код не внесут изменения.
- Динамические страницы генерируются на сервере. Самый яркий пример — страницы в соцсетях. Они зависят от того, что в этих соцсетях происходит, но разработчики не программируют вручную каждое изменение. Код страницы, которую увидит конкретный пользователь, собирается автоматически.
Nginx идеально сочетается со статическими запросами, потому что асинхронная архитектура позволяет обрабатывать их много и быстро. Даже если nginx работает как балансировщик нагрузки и прокси-сервер, он может сохранить определённые файлы в свой кэш и работать как обычный сервер, отдающий данные с бэкенда.
А вот динамический контент nginx собирать уже не может. Он перенаправляет такие запросы на серверы, где работают программы для построения динамической страницы, например в тот же Apache.
Чем ещё отличается nginx от Apache
Документация. У Apache документации, форумов и примеров гораздо больше, потому что проект начался на 7 лет раньше и все материалы сразу были на английском — стандартном языке для всех программистов.
Nginx появился позже и в России, поэтому почти вся документация изначально была на русском. Из-за этого разработчикам из других стран было трудно использовать nginx, но со временем ситуация выровнялась: сейчас проект ведётся одновременно на русском и на английском языках.
Работа с модулями. В Apache всё просто: прописал название модуля — и веб-сервер сразу его подгрузил и начал использовать. Не нужно — выгрузил, тоже на ходу. Это позволяет очень гибко настраивать поведение сервера в разные моменты времени.
Чтобы добавить модули в nginx, их нужно выбрать заранее и скомпилировать вместе с ядром сервера. С одной стороны, это неудобно: нужно на старте чётко представлять, что будет делать сервер и в каких ситуациях. Но с другой — это повышает безопасность: не получится на лету подключить какой-то неизвестный и непроверенный модуль, в котором будет дыра в безопасности.
Конфигурация и настройка. Apache управляется через служебные файлы, в которые он постоянно заглядывает, например .htaccess. Это снова гибкость и возможность очень тонкой настройки поведения для каждой папки и запроса. Но Apache каждый раз тратит время на такие чтения и проверки, а когда запросов много, то это становится критично. Ещё нужно просмотреть все папки, к которым идёт запрос, а это тоже время.
Nginx работает иначе: всё хранится в одном конфигурационном файле. Этот файл отвечает за настройки всего сервера, и nginx точно знает, где его быстро найти. Это более безопасно для работы сервера: никто не сможет положить в папку свой файл .htaccess, прописать в нём чёрт-те что и сломать работу всего сервера.
Что выбрать: nginx или Apache
Может показаться, что nginx и Apache воюют друг с другом за долю рынка, но на самом деле они отлично работают вместе:
- Ставим nginx и Apache на один сервер.
- Настраиваем Apache на обработку запросов на динамические страницы. Самый частый пример такого — собрать и отдать страницу на PHP-движке Вордпресса.
- Настраиваем nginx, чтобы он отдавал уже готовые статические страницы, которые запрашивают чаще всего.
- Также говорим, чтобы nginx обрабатывал всю остальную статику: отдавал, если нужно, отдельно файлы, картинки, музыку и прочее, что имеет постоянный адрес и содержимое.
- А всё остальное, что нужно собирать динамически, — перенаправляем на Apache.
Получается так: nginx занимается самыми простыми запросами, которые можно выполнить моментально, а всю динамику и сборки отправляет в Apache и продолжает заниматься своими делами.
В итоге польза всем: пока Apache ждёт или собирает страницы, nginx успевает переделать кучу дел и не тратит своё время на ожидание. Системные администраторы часто используют такую связку, чтобы сбалансировать нагрузку на сервер и более эффективно использовать ресурсы.
Кто использует nginx
Если вы назовёте три любые крупные ИТ-компании, то две из них точно будут использовать nginx. В этом можно легко убедиться самому, посмотрев на список тех проектов, где используют эту программу:
- Яндекс;
- ВКонтакте;
- Хабр;
- ЖЖ;
- Авито;
- Хедхантер;
- Фейсбук и Инстаграм (принадлежат компании Meta, которая запрещена в России);
- Вордпресс;
- Пинтерест;
- Нетфликс.
Сейчас 34% от всех веб-серверов — это nginx, а следом за ним уже идёт Apache, у него 29%.
Причина такой популярности — в скорости работы, надёжности и универсальности nginx. К нему можно прикрутить почти любой софт, на нём можно получить любую конфигурацию ответов на запросы. Такое взаимодействие настраивается через прокси, протоколы HTTP и FastCGI и другие механизмы.
Как подготовить и установить nginx
По умолчанию nginx предназначен для работы в системах Linux. Для серверов это оптимальный вариант: у Linux открытый исходный код, гибкая настройка и есть большой выбор полезных дополнений, которые можно использовать для усиления безопасности и других целей.
На официальном сайте nginx есть несколько инструкций по его установке на разные версии Linux. Вообще, nginx можно установить и на MacOS или Windows, но для этого придётся либо поднимать виртуальное окружение, либо пользоваться инструкциями с другими обходными путями. Скорость и качество работы таких вариантов проверить сложно, а ещё возможности веб-сервера могут быть ограничены.
Если у вас нет Linux, но вы хотите поработать с nginx, можно поставить в качестве второй операционной системы Ubuntu — это самая простая версия Linux. Её установка займёт не более получаса, после чего нужно следовать простой инструкции:
1. Загружаем пакеты. Они будут отвечать за подключение к apt-репозиторию — это что-то вроде магазина приложений для Linux. Используем такую команду:
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
2. Указываем ключ. Он будет использоваться для проверки подлинности пакетов:
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
3. Проверяем ключ:
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
4. Подключаем apt-репозиторий:
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
5. Настраиваем закрепление:
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
6. Устанавливаем nginx (наконец-то!):
sudo apt update
sudo apt install nginx
Всё, nginx установлен, но он пока что ничего не умеет, поэтому нужно настроить его и объяснить ему, как принимать запросы и что с ними делать.
Конфигурация и настройка сервера nginx
Как будет работать веб-сервер nginx, определяет файл конфигурации. По умолчанию он называется nginx.conf и после установки лежит в одной из этих папок:
- /usr/local/nginx/conf;
- /etc/nginx;
- /usr/local/etc/nginx.
Самая простая настройка файла конфигурации для работы nginx в качестве обычного веб-сервера может выглядеть так:
# создаём блок настроек веб-сервера
server {
# говорим серверу принимать запросы на порт 80
listen 80;
# указываем доменное имя для сайта
# веб-сервер будет ждать запросы на это имя
server_name example.com www.example.com;
# добавляем адрес директории, где будут храниться файлы для сайта
location / {
root /var/www/example.com;
# указываем название главного HTML-файла
index index.html;
}
}
Для написания используется язык собственный язык веб-сервера — NGINX. Каждая инструкция для настройки называется директивой, а несколько директив объединяются в блоки. Наш файл настройки готов для запуска, чтобы пользователи могли отправить запросы по указанному адресу и получить ответ.
Про директивы в документации есть отдельная страница, где можно посмотреть их все и изучить, что делает каждая.
Конфликт с «Рамблером»
В 2019 году произошла такая история: Рамблер заявил, что раз Сысоев во время создания nginx работал в компании, то и все права на этот веб-сервер тоже принадлежат ей. В итоге завели дело по статье о нарушении авторских прав, а Рамблер требовал возместить ему ущерб в 50 миллионов рублей.
Через полгода уголовное дело прекратили за отсутствием состава преступления: компания не смогла найти подтверждения своим словам и не смогла получить права на код nginx.
По иронии судьбы на nginx сейчас работают серверы и самого Рамблера:-)