Видео: основы NGINX для начинающих за 200 секунд
Наглядное объяснение, что такое NGINX и как он работает. Основы, которые помогут разобраться с конфигурацией веб-сервера.
20К открытий21К показов
NGINX — самый популярный веб-сервер в мире, используемый на абсолютном большинстве сайтов. Его выбирают в том числе для работы высоконагруженных ресурсов, так как он может обработать более чем десять тысяч соединений одновременно.
Подробности — в видео и текстовой расшифровке ниже.
Как устроен NGINX
NGINX построен на базе неблокирующей событийно-ориентированной архитектуры. У него есть один мастер-процесс, несколько воркер-процессов и два процесса, управляющих кэшем. Чтобы это увидеть, достаточно выполнить команду ps с ключами:
Мастер-процесс запускается от суперпользователя и выполняет операции, требующие повышения прав, такие как:
- чтение конфигурации,
- открытие портов,
- создание новых процессов.
Воркер-процессы выполняют всю работу:
- обрабатывают сетевые соединения,
- читают и пишут данные на диск,
- общаются с бэкэнд-серверами.
Обычно количество воркер-процессов равняется количеству ядер CPU. Это позволяет использовать системные ресурсы максимально эффективно.
Воркер-процессы слушают два вида сокетов:
- listener — для событий новых клиентов (запросов на соединение),
- connection — для событий, которые требуют обработки.
Воркер-процесс ожидает событие, используя методы epoll или kqueue API операционной системы. Получив событие нового клиента на listener-сокете, воркер-процесс создаёт новый connection-сокет. Получив событие на connection-сокете, воркер-процесс обрабатывает этот запрос. После обработки события он не блокируется, а переходит в режим ожидания. Это позволяет минимизировать количество переключений контекстов операционной системы.
Другие два процесса управляют содержимым кэша на жестком диске:
- загрузчик кэша загружает данные в оперативную память, после чего процесс завершается,
- менеджер кэша периодически удаляет объекты, чтобы поддерживать объем кэша в рамках заданных ограничений.
При такой архитектуре для обновления конфигурации NGINX достаточно отправить мастер-процессу сигнал SIGHUP. Далее мастер-процесс создаст новые воркер-процессы с обновлённой конфигурацией и оповестит старые воркер-процессы о завершении работы. После этого воркер-процессы перестанут принимать новые соединения, а текущие соединения, обработав событие, будут закрываться (без ожидания keep-alive). Как только будут закрыты все соединения, воркер-процесс завершится. Это позволяет обновлять конфигурацию сервера без потери соединений, простоя ресурсов и прерывания обслуживания клиентов.
При правильно настроенном NGINX каждый воркер-процесс способен обработать сотни тысяч cоединений одновременно.
Основы конфигурации NGINX
Общий конфигурационный файл NGINX выглядит следующим образом:
Все настройки называются директивами и представляют собой пары key-value. Директива с фигурными скобками называется контекстом. Вот список основных контекстов:
- global — общие настройки,
- events — настройки обработки событий воркер-процессами,
- http — настройки http- и https-соединений,
- server — настройки виртуальных серверов,
- location — настройки обработки и поиска идентификатора запроса.
Например, клиент делает запрос по URL http://www.example.com/blog. Протокол и доменное имя определяют, какой контекст server будет выбран, а идентификатор запроса (URI) определяет, какой контекст location будет использован.
Особого внимания требует директива include. Указанное значение для этой директивы — это регулярное выражение, которое описывает файлы в директории с расширением .conf. NGINX при старте найдёт все файлы, подходящие под регулярное выражение, и вставит их содержимое в то место, где указана директива include. Это даёт возможность разложить конфигурацию NGINX по отдельным файлам.
Конфигурации для разных случаев использования
NGINX обычно используется в трёх случаях:
- в качестве reverse proxy для проксирования запросов в бекэнд,
- как балансировщик запросов между серверами бекэнда,
- для отдачи статического контента.
Начнём с конфигурации для отдачи статики. Создаём контекст server, указываем, какой порт слушать, задаём имя сервера и описываем три контекста location. Первый контекст — на все ресурсы, второй и третий контексты определяют директорию поиска файлов в зависимости от их расширения.
Чтобы сделать reverse proxy, создаём такой же контекст server. В нём создаём один контекст location, в котором указываем директиву proxy_pass и URL, куда проксировать запросы. Теперь NGINX будет проксировать все запросы на указанный URL.
Добавим балансировку в конфигурацию reverse proxy. Внутри контекста http создаём контекст upstream и указываем адреса наших приложений. Внутри контекста location указываем директиву proxy_pass со значением имени контекста upstream. Теперь NGINX будет распределять запросы по двум серверам.
Стратегия балансировки по умолчанию является round-robin — равномерным распределением. Можно указать стратегию least_conn, при которой NGINX будет отправлять запросы серверу, у которого меньше активных подключений. Это полезно, если серверы не одинаковые по своей мощности.
Группа автора «ВКонтакте», Telegram, Twitter.
Ещё у нас есть подборка книг на русском и английском + дополнительные материалы по NGINX.
20К открытий21К показов