Перейти к содержимому

Как nginx обрабатывает запросы

  • автор:

nginx

Имена сервера задаются с помощью директивы server_name и определяют, в каком блоке server будет обрабатываться тот или иной запрос. См. также “Как nginx обрабатывает запросы”. Имена могут быть заданы точно, с помощью маски или регулярного выражения:

server < listen 80; server_name example.org www.example.org; . >server < listen 80; server_name *.example.org; . >server < listen 80; server_name mail.*; . >server < listen 80; server_name ~^(?.+)\.example\.net$; . >

При поиске виртуального сервера по имени, если имени соответствует несколько из указанных вариантов, например, одновременно подходят и имя с маской, и регулярное выражение, будет выбран первый подходящий вариант в следующем порядке приоритета:

  1. точное имя
  2. самое длинное имя с маской в начале, например “ *.example.org ”
  3. самое длинное имя с маской в конце, например “ mail.* ”
  4. первое подходящее регулярное выражение (в порядке следования в конфигурационном файле)
Имена с масками

Имя с маской может содержать звёздочку (“ * ”) только в начале или в конце имени, и только на границе, определяемой точкой. Имена “ www.*.example.org ” и “ w*.example.org ” являются некорректными, но их можно задать с помощью регулярных выражений, например, “ ~^www\..+\.example\.org$ ” и “ ~^w.*\.example\.org$ ”. Звёздочка может соответствовать нескольким частям имени. Имени с маской “ *.example.org ” соответствует не только www.example.org , но и www.sub.example.org .

Специальное имя с маской вида “ .example.org ” соответствует как точному имени “ example.org ”, так и маске “ *.example.org ”.

Имена, заданные регулярными выражениями

Регулярные выражения, используемые в nginx, совместимы с используемыми в языке программирования Perl (PCRE). Имя сервера, заданное регулярным выражением, должно начинаться с символа тильды:

server_name ~^www\d+\.example\.net$;

в противном случае оно будет рассматриваться как точное, или же, если выражение содержит звёздочку (“ * ”), то как имя с маской (и, скорее всего, некорректное). Не забывайте ставить специальные символы начала (“ ^ ”) и конца (“ $ ”) строки. По синтаксису они не требуются, но логически они могут быть нужны. Также заметьте, что все точки в доменных именах должны быть экранированы символом обратной косой черты. Регулярное выражение, содержащее символы “ < ” и “ >”, необходимо экранировать:

server_name "~^(?\w\d1,3>+)\.example\.net$";

иначе nginx откажется запускаться и выдаст сообщение об ошибке:

directive "server_name" is not terminated by ";" in .

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

server < server_name ~^(www\.)?(? .+)$; location / < root /sites/$domain; > >

Библиотека PCRE поддерживает именованные выделения, используя следующий синтаксис:

?< name > Совместимый с Perl 5.10 синтаксис, поддерживается начиная с PCRE-7.0
?’ name Совместимый с Perl 5.10 синтаксис, поддерживается начиная с PCRE-7.0
?P< name > Python-совместимый синтаксис, поддерживается начиная с PCRE-4.0

Если nginx отказывается запускаться и выдаёт сообщение об ошибке:

pcre_compile() failed: unrecognized character after (?< in .

то это значит, что используется старая версия библиотеки PCRE и следует вместо этого попробовать синтаксис “ ?P< name > ”. Также можно использовать нумерованные выделения:

server < server_name ~^(www\.)?(.+)$; location / < root /sites/$2; > >

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

Прочие имена

Некоторые имена имеют специальное значение.

Если необходимо обрабатывать запросы без поля “Host” в заголовке в блоке server, который не является сервером по умолчанию, следует указать пустое имя:

server

Если директива server_name не задана в блоке server, то nginx будет использовать пустое имя в качестве имени сервера.

Версии nginx вплоть до 0.8.48 в этом случае использовали имя хоста (hostname) машины в качестве имени сервера.

Если имя сервера задано как “ $hostname ” (0.9.4), то используется имя хоста (hostname) машины.

Если в запросе вместо имени сервера указан IP-адрес, то поле “Host” заголовка запроса будет содержать IP-адрес, и запрос можно обработать, используя IP-адрес как имя сервера:

server < listen 80; server_name example.org www.example.org "" 192.168.1.1 ; . >

В примерах конфигурации серверов, обрабатывающих все запросы, встречается странное имя “ _ ”:

server

Оно не является каким-то особенным, это просто одно из множества некорректных доменных имён, которые никогда не пересекутся ни с одним из реальных имён. С тем же успехом можно использовать имена типа “ -- ” и “ !@# ”.

Версии nginx вплоть до 0.6.25 поддерживали специальное имя “ * ”, которое многими неверно воспринималось как имя сервера для обработки всех запросов. Оно никогда так не работало, и не работало как имя с маской. Это имя действовало так же, как сейчас действует директива server_name_in_redirect. Специальное имя “ * ” объявлено устаревшим, а вместо него следует использовать директиву server_name_in_redirect. Заметьте, что с помощью директивы server_name нельзя задать ни имя сервера для обработки всех запросов, ни сервер по умолчанию. Это является свойством директивы listen, а не server_name. См. также “Как nginx обрабатывает запросы”. Можно настроить серверы, слушающие на портах *:80 и *:8080, и указать, что один из них будет сервером по умолчанию для порта *:8080, а другой — для порта *:80:

server < listen 80; listen 8080 default_server; server_name example.net; . >server

Интернационализованные имена

Для указания интернационализированных доменных имён (IDNs) в директиве server_name следует указывать Punycode-представление имени:

server

Выбор виртуального сервера

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

  • предварительно во время операции SSL handshake согласно SNI
  • после обработки строки запроса
  • после обработки поля Host заголовка запроса
  • если после обработки строки запроса или поля Host заголовка запроса имя сервера не было выбрано, то nginx будет использовать пустое имя в качестве имени сервера.

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

  • в случае использования директивы ssl_protocols список протоколов задаётся библиотекой OpenSSL перед применением конфигурации сервера согласно имени, запрашиваемого через SNI. Таким образом, протоколы должны быть заданы только для сервера по умолчанию;
  • директивы client_header_buffer_size и merge_slashes задействуются перед чтением строки запроса, таким образом они используют конфигурацию сервера по умолчанию или конфигурацию сервера, выбранного через SNI;
  • в случае использования директив ignore_invalid_headers, large_client_header_buffers и underscores_in_headers, которые участвуют в обработке полей заголовка запроса, выбор сервера дополнительно зависит от того, была ли обновлена конфигурация сервера согласно строке запроса или полю заголовка Host ;
  • ошибочный ответ будет обработан с помощью директивы error_page в том сервере, который в настоящий момент выполняет запрос.
Оптимизация

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

В первую очередь имя ищется в хэш-таблице точных имён. Если имя не было найдено, то имя ищется в хэш-таблице имён с масками, начинающихся со звёздочки. Если и там поиск не дал результата, то имя ищется в хэш-таблице имён с масками, оканчивающихся на звёздочку.

Поиск в хэш-таблице имён с масками медленнее, чем поиск в хэш-таблице точных имён, поскольку имена сравниваются по доменным частям. Заметьте, что специальное имя с маской вида “ .example.org ” хранится в хэш-таблице имён с масками, а не в хэш-таблице точных имён.

Регулярные выражения проверяются последовательно, а значит являются самым медленным и плохо масштабируемым методом.

По вышеизложенным причинам предпочтительнее использовать точные имена, где это только возможно. Например, если к серверу наиболее часто обращаются по именам example.org и www.example.org , то эффективнее будет указать их явно:

server

нежели чем использовать упрощённую форму:

server

Если задано большое число имён серверов, либо заданы необычно длинные имена, возможно потребуется скорректировать значения директив server_names_hash_max_size и server_names_hash_bucket_size на уровне http. Значение по умолчанию директивы server_names_hash_bucket_size может быть равно 32, 64, либо другой величине, в зависимости от размера строки кэша процессора. Если значение по умолчанию равно 32 и имя сервера задано как “ too.long.server.name.example.org ”, то nginx откажется запускаться и выдаст сообщение об ошибке:

could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32

В этом случае следует увеличить значение директивы до следующей степени двойки:

http < server_names_hash_bucket_size 64; .

Если задано большое число имён серверов, то будет выдано другое сообщение об ошибке:

could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 32

В таком случае сначала следует попробовать установить server_names_hash_max_size в величину, близкую к числу имён серверов, и только если это не поможет или время запуска nginx станет неприемлемо большим, следует попытаться увеличить server_names_hash_bucket_size.

Если сервер является единственным сервером для слушающего порта, то nginx не будет проверять имена сервера вообще (а также не будет строить хэш-таблицы для слушающего порта). За одним исключением: если имя сервера задано регулярным выражением с выделениями, то nginx’у придётся выполнить это выражение, чтобы получить значения выделений.

Совместимость
  • Специальное имя сервера “ $hostname ” поддерживается начиная с версии 0.9.4.
  • Имя сервера по умолчанию является пустой строкой “” начиная с версии 0.8.48.
  • Именованные выделения в именах серверов, заданных с помощью регулярных выражений, поддерживаются начиная с версии 0.8.25.
  • Выделения в именах серверов, заданных с помощью регулярных выражений, поддерживаются начиная с версии 0.7.40.
  • Пустое имя сервера “” поддерживается начиная с версии 0.7.12.
  • В качестве первого имени сервера можно задать маску или регулярное выражение начиная с версии 0.6.25.
  • Регулярные выражения в имени сервера поддерживаются начиная с версии 0.6.7.
  • Имена с маской вида example.* поддерживаются начиная с версии 0.6.0.
  • Специальная форма имени вида .example.org поддерживается начиная с версии 0.3.18.
  • Имена с маской вида *.example.org поддерживаются начиная с версии 0.1.13.
автор: Игорь Сысоев
редактор: Brian Mercer

Nginx: принципы работы и настройка

Коротко о Nginx

Nginx — это веб-сервер, прокси-сервер, обратный прокси-сервер, smtp-сервер и балансировщик нагрузки. Сразу раскроем все эти понятия. Магия перестает быть магией, когда понимаешь как устроен мир. Веб-сервер — это программа, которая принимает и обрабатывает запросы от клиентов по протоколам HTTP и HTTPS и возвращает им ответ в виде HTML-страницы. Прокси-сервер принимает и обрабатывает запросы клиентов, а затем передает их дальше, другим программам. Обратный прокси-сервер — принимает результат работы других серверов и отдаёт его клиентам. Smtp-сервер — это сервер почтовой службы. Балансировщик нагрузки — программа, которая распределяет сетевые запросы между серверами, следуя настройкам балансировки. NGINX сочетает в себе все перечисленные возможности, хотя изначально он задумывался только как web- и smtp-сервер. NGINX был разработан Игорем Сысоевым в 2004 году. Его не устраивала скорость работы Apache. Ему нужен был web-сервер, который мог бы держать 10,000 одновременных запросов, при этом расходовать минимум памяти, не теряя производительности. Сегодня с помощью NGINX решают следующие задачи:

  • Кеширование и стриминг видео
  • Отдача статического контента сайта
  • Построение CDN-сетей
  • Распределение нагрузки
  • Обеспечение безопасности
  • Работа почтовых служб
    и многое другое.

Секрет успеха NGINX в его архитектуре, которая коренным образом отличается от других веб-серверов. Давайте разберёмся, как работает NGINX?

Как работает NGINX?

Как работает NGINX?

Многие веб-серверы построены на простой многопоточной модели, NGINX использует событийную архитектуру, которая позволяет ему масштабироваться до сотен тысяч параллельных соединений. Ключевое — это то, что NGINX обрабатывает множество соединений в одном процессе.

У NGINX есть один мастер-процесс и несколько вспомогательных процессов. Например, на нашем 2 ядерном сервере, NGINX запустил 2 дополнительных процесса, обозначенных как worker process:

Работа NGINX

Мы не раз уже упомянули такие понятия как процесс и поток. Процесс или поток (с точки зрения ОС это одно и то же, разница лишь в разделении адресного пространства ) — это самодостаточный набор инструкций, который операционная система может запланировать для выполнения на ядре процессора.

На одном ядре одновременно может находиться только один процесс или поток. Процессы на ядре постоянно подменяют друг друга, из-за чего сильно страдает производительность, когда процессов становится много. Это камень преткновения для многих современных web-приложений, которые открывают на каждое соединение свой поток.

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

Графически схема работы NGINX выглядит следующим образом:

Схема работы процессов NGINX

Структурно её можно описать так: все потоки управляются одним рабочим процессом, процесс содержит меньшие блоки — соединения. Соединения доставляют запросы к рабочему процессу, который также отправляет его в главный процесс. Наконец, основной процесс предоставляет результат этих запросов.

Если хотите больше узнать о работе NGINX изнутри — на хабре есть отличная статья: «NGINX изнутри: рожден для производительности и масштабирования». Она, правда, старая, но очень хорошая. Рекомендуем!

Благодаря такому принципу работы NGINX может обрабатывать до 1024 одновременных запросов, поэтому он отлично подходит для загруженных веб-сайтов, таких как интернет-магазины, поисковые системы и облачное хранилище, а ещё NGINX использует модульную систему, благодаря которой может расширять свои функции.

Модули настраиваются через конфигурационные файлы NGINX, о них и поговорим.

Работа с конфигурационными файлами NGINX

Работа с конфигурационными файлами NGINX

NGINX работает с двумя уровнями конфигурационных файлов. Первый уровень — глобальный, к нему относится конфигурационный файл etc/nginx/nginx.conf. Второй уровень — локальный, к нему относятся конфигурационные файлы конкретных сайтов, расположенных, как правило, в /etc/nginx/site-available или в /etc/nginx/conf.d/

nginx.conf — это корневой конфигурационный файл NGINX. В нём содержатся его глобальные настройки:

  • пользователь, от чьего имени будет запускаться Nginx;
  • расположение pid-файла;
  • сколько рабочих процессов будет запущено;
  • ограничения на количество соединений;
  • условия сжатия контента
    и многое другое.

С nginx.conf NGINX начинает парсить конфигурационные файлы, которые состоят из директив. Директивы могут быть простыми — однострочными, а могут быть блочными. Если блочная директива содержит другую вложенную блочную директиву, то такая блочная директива называется контекстом.

Вот пример простой однострочной директивы: access_log /var/nginx/access.log main; Параметры директивы разделяются пробелами, а в конце строки обязательно ставится точка с запятой.

Пример простой блочной директивы может выглядеть так:

events worker_connections 1024;
>

Здесь контекст events содержит одну директиву — worker_connections, которая указывает на максимальное число одновременных соединений. Контекст может содержать вложенные контексты.

Вот пример стандартного контекста:

server location / root /data/www;
>

Здесь блочная директива server содержит несколько блочных директив location, организуя тем самым контекст server. Директивы вне любого контекста относятся к main.

Список основных контекстов и их значений:

  • main — корень конфигурации, по сути это /etc/nginx/nginx.conf;
  • events — контекст работы с соединениями;
  • http — контекст работы с http-протоколом;
  • server — контекст работы с сервером;
  • location — контекст работы с маршрутизацией запросов.

Контекст может быть указан не явно, а через директиву include c указанием директории расположения. Это делается для экономии места и возможности отдельного изменения параметров директив server. Вот пример, как это может быть исполнено:

user www www;
worker_processes 5;
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 8192;

events worker_connections 4096;
>

http include conf/mime.types;
include /etc/nginx/sites-enabled/*;
index index.html index.htm index.php;

default_type application/octet-stream;
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
>

Здесь указаны сразу две директивы include: первая директива ссылается на мимотипы файлов для отдачи, а вторая на все конфигурационные файлы расположенные в директории /etc/nginx/sites-enabled/ . То есть, при чтении конфигурационного файла, include разворачивается в то, на что ссылается.

В нашем случае вместо include /etc/nginx/sites-enabled/* будут подставлены все конфигурационные файлы в директории /etc/nginx/sites-enabled/ , выглядящие следующим образом:

server listen 80;
server_name domain2.com www.domain2.com;

location / root /var/www/virtual/big.server.com/htdocs;
index index.html;
try file $uri $uri/index.html;
>
>

Благодаря такой древовидной модели сборки конфигурационных файлов удаётся достичь гибкости управления сайтами. Например, если на одном сервере располагаются несколько сайтов и один из них нужно отключить или изменить у него настройки — достаточно выполнить нужные работы и перечитать конфигурационный файл командой nginx -s reload .

Структуру конфигурационных файлов разобрали, осталось ответить ещё на один вопрос — как Nginx понимает, что нужно отдавать клиенту и по какому запросу?

Nginx анализирует HTTP-запрос от клиента и ищет совпадения со значениями условий директив server_name и linsten в контексте server. Когда совпадения найдены начинает работать контекст location, который отвечает за маршрутизацию запросов.

В обработке контекстов location Nginx тоже следует определённой иерархии обработки. Так совпадения с условиями обработки location будут искаться сначала среди префиксных location (location, не содержащий регулярных выражений), затем среди location с регулярными выражениями в порядке их следования в конфигурационном файле.

Если среди location с регулярными выражениями Nginx не найдёт совпадений, он вернёт первый префиксный location — корень сайта.

Итак, мы разобрались с принципами работы NGINX, поняли как устроены его конфигурационные файлы и как NGINX их читает. Давайте соберем все новые знания в единое целое.

Расставляем всё по полочкам

Расставляем всё по полочкам

NGINX — это легковесный и мощный web-сервер, который способен держать до 10 тысяч одновременных соединений, расходуя при этом минимальное количество ресурсов. Чаще всего его используют в качестве прокси-сервера и обратного прокси-сервера.

NGINX обладает модульной архитектурой. Модули настраиваются через конфигурационные файлы, которые имеют древовидную структуру и собираются в единое целое при их чтении. Корневой конфигурационный файл NGINX — /etc/nginx/nginx.conf . Его NGINX читает в первую очередь, затем он читает другие конфиги, указанные в nginx.conf явным образом или с помощью директивы include.

Корневой конфиг содержит глобальные настройки NGINX: пользователь от чьего имени он будет запускаться, расположение pid-файла, количество рабочих процессов, ограничения на количество соединений и многое другое.

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

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

В следующей статье мы приведем такие кейсы использования NGINX:

  • Как разместить несколько сайтов на одном сервере?
  • Связка NGINX и Python — современный сайт на Django
  • Как защитить сайт от DDoS?
  • Балансировка нагрузки между бекенд-серверами.

Пока мы готовим новый материал, вы можете познакомиться поближе с NGINX. На сайте https://nginx.org/ru/ доступным языком подана официальная документация и есть хорошие примеры конфигурационных файлов. Также для более глубокого понимания следующей статьи пригодятся знания по Django, Linux и Docker. Их можно взять из наших статей:

Django-стек: работа, установка и настройка на одном сервере

Django-стек

Разберёмся как работает Django, что такое Application-сервер и как связать Nginx и Gunicorn.

Linux внутри Windows

Linux внутри Windows

Покажем как легко установить Linux внутрь Windows и научим работать в WSL2.

Введение в Docker

Введение в Docker

Расскажем, что такое Docker, из каких элементов он состоит и как работает.

Nginx

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

Освойте профессию «Веб-разработчик»

лого nginx

Nginx разработал Игорь Сысоев, системный администратор «Рамблера», в 2002 году, чтобы решить проблему с проседанием под нагрузкой. В 2004 году продукт стал доступен для широкого круга пользователей и получил одобрение. С 2011 года выпуском занимается собственная фирма Игоря, которая через 2 года представила расширенную платную версию продукта (Nginx Plus).

Для чего нужен

Сейчас Nginx обслуживает соединения, обрабатывает запросы, которые поступают к серверу, а также используется:

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

Профессия / 12 месяцев
Веб-разработчик с нуля

Создавайте нужные любому бизнесу сервисы

vsrat_8 (2)

Особенности Nginx

Высокая скорость

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

Гибкость

Программное обеспечение гибко конфигурируется и настраивается под потребности инфраструктуры.

Малое потребление памяти

Чтобы уменьшить нагрузку на оперативную память, Nginx использует выделенный сегмент памяти — «пул» (pool). Он динамический и может расширяться при увеличении длины запроса.

Станьте веб-разработчиком и найдите стабильную работу на удаленке

Хорошая поддержка

У Nginx активное комьюнити и хорошая клиентская поддержка, а документация доступна и на русском языке.

Доступность

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

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

Когда пользователь совершает действие на странице, информация передается на сервер. Он находит файлы, передает сведения.

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

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

схема работы сервера nginx

Для каких ОС подходит Nginx

Nginx является мультиплатформенным веб-сервером и прокси-сервером, который подходит для различных операционных систем. Вот список некоторых из наиболее популярных ОС, на которых можно установить и запустить Nginx:

  1. Linux: Nginx является основным выбором для многих Linux-дистрибутивов. Это включает в себя такие дистрибутивы, как Ubuntu, Debian, CentOS, Red Hat Enterprise Linux (RHEL), Fedora, openSUSE и многие другие.
  2. Unix (BSD): Nginx также хорошо работает на различных Unix-подобных системах, включая FreeBSD и OpenBSD.
  3. macOS: Вы можете установить Nginx на компьютерах Mac с помощью пакетных менеджеров, таких как Homebrew.
  4. Windows: Хотя Nginx не является стандартным выбором для Windows, существует официальная поддержка Nginx для Windows, и его можно использовать на этой платформе.
  5. Docker: Nginx также может быть запущен в контейнерах Docker на различных ОС.
  6. UNIX-подобные системы в облаке: Вы можете установить Nginx на различных облачных платформах, таких как Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP) и другие.
  7. Другие ОС: Nginx может быть скомпилирован и работать на многих других операционных системах, если есть подходящие версии компиляторов и библиотек.

Что выбрать: Nginx или Apache

Apache — главный конкурент Nginx. Существует дольше, поэтому имеет более крупное комьюнити. Работать с Apache легче за счет простой архитектуры и полноценной поддержки Windows. При работе с динамическим контентом показывает такую же производительность, как Nginx. Но статический контент Nginx обрабатывает в 2,5 раза быстрее, потребляя при этом меньше памяти.

Параметр Nginx Apache
Тип Веб-сервер, прокси-сервер Веб-сервер
Лицензия BSD-style Apache License 2.0
Архитектура Событийная (event-driven) Процессо-ориентированная (process-based)
Производительность Высокая, эффективное управление ресурсами Высокая, но более ресурсозатратная
Распространенность Популярен, широко используется Популярен, широко используется
Модульность Ограниченная Высокая, множество модулей
Конфигурация Простая, читаемая Изменчивая, сложная
Версия PHP (модуль PHP-FPM) Да Да
Поддержка .htaccess файлов Нет Да
Масштабируемость Хорошая, легко масштабируется Хорошая, но может потребоваться больше усилий
Виртуальные хосты Легко настраиваются Легко настраиваются
SSL/TLS поддержка Да Да
Совместимость с Windows Ограниченная (официально только через WSL) Да, полная поддержка
Проксирование Превосходное Отличное
Поддержка HTTP/2 Да Да
Документация Хорошо документирован Хорошо документирован
Сообщество и поддержка Активное Активное

Таблица сравнения двух популярных веб-серверов

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

Веб-разработчик с нуля

Веб-разработчик — мастер на все руки. Он создает программы и приложения для любых сфер и компаний: от небольшой кофейни до международных банков. Станьте специалистом, который создает востребованный продукт

картинка (71)

Статьи по теме:

Настройка обратного прокси Nginx

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

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

Что такое Apache

Apache HTTP Server (обычно называемый просто Apache) — это популярный веб-сервер, который обрабатывает запросы от клиентов (браузеров) и доставляет веб-страницы на основе запрошенных ресурсов.

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

Что такое Nginx

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

Nginx также известен своей способностью эффективно обрабатывать статические файлы, а также выполнять функции обратного прокси-сервера и балансировщика нагрузки.

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

Что такое обратный прокси-сервер

Обратный прокси-сервер (Reverse Proxy Server) – это прокси-сервер, который действует от имени сервера и выполняет функции промежуточного узла между клиентами и серверами. В отличие от обычного прокси-сервера, который работает от имени клиента и перенаправляет запросы к серверам, обратный прокси-сервер получает запросы от клиентов и пересылает их на один или несколько серверов.

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

Таким образом, обратный прокси-сервер делит трафик равномерно между серверами, что позволяет достичь более высокой производительности и отказоустойчивости системы.

Преимущества обратного прокси-сервера

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

Некоторые из основных преимуществ обратного прокси-сервера включают:

  • Балансировка нагрузки. Обратный прокси-сервер может равномерно распределять запросы от клиентов на несколько серверов, что позволяет более эффективно использовать ресурсы и предотвращает перегрузку отдельных серверов.
  • Кэширование. Обратный прокси-сервер может кэшировать статический контент, такой как изображения, CSS-файлы и JavaScript. Когда клиент запрашивает этот контент, он может быть доставлен непосредственно из кэша обратного прокси-сервера, что уменьшает время загрузки страниц и снижает нагрузку на серверы.
  • Улучшенная безопасность. Обратный прокси-сервер может служить барьером между клиентами и серверами, фильтруя и проверяя запросы перед тем, как они достигнут сервера. Это позволяет обнаруживать и блокировать вредоносные запросы, атаки и нежелательный трафик, что способствует повышению безопасности серверов.
  • SSL-терминация. Обратный прокси-сервер может выполнять расшифровку SSL-шифрования и обрабатывать защищенные HTTPS-запросы от клиентов, а затем передавать их внутренним серверам. Благодаря этому снижается нагрузка на серверы и упрощается управление сертификатами безопасности.
  • Анонимность. Обратный прокси-сервер может скрывать реальные IP-адреса серверов, предоставляя клиентам только свой собственный IP-адрес. Это повышает анонимность и защищает серверы от прямых атак со стороны злоумышленников.
  • Упрощение масштабирования. Обратный прокси-сервер может служить точкой входа для всех клиентских запросов, что упрощает масштабирование серверной инфраструктуры. Вместо того чтобы изменять настройки каждого сервера, можно просто настроить обратный прокси-сервер для перенаправления запросов на новые серверы.
  • Гибкая настройка. Обратный прокси-сервер обладает мощными возможностями настройки, позволяющими оптимизировать работу сети, регулировать доступ и выполнять другие функции в зависимости от потребностей.

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

Предварительные требования

  • ОС Ubuntu 18.04, 20.04 или 22.04: Убедитесь, что на сервере установлена одна из указанных версий операционной системы Ubuntu. Вы можете выполнить эту установку самостоятельно или обратиться к провайдеру услуг хостинга, чтобы он предоставил вам сервер с предустановленной подходящей версией ОС.
  • SSH-доступ: Установите и настройте SSH на сервере, чтобы иметь возможность подключиться к нему удалённо через SSH-протокол. SSH-подключение обеспечит безопасную командную строку для управления и настройки сервера.
  • Учётные данные: Обязательно имейте доступ к учётным данным суперпользователя (root) или учётной записи с привилегиями администратора на сервере. Так вы сможете выполнять системные задачи и настройки.

Как установить обратный прокси-сервер Nginx

  1. Установите Nginx, выполнив команды:

sudo apt-get update

sudo apt-get install nginx

  1. Откройте файл конфигурации Nginx, который обычно находится в директории /etc/nginx/. Основной файл конфигурации называется nginx.conf, и вы можете отредактировать его следующей командой:

sudo nano /etc/nginx/nginx.conf

  1. Добавьте следующий блок кода в файл конфигурации, чтобы настроить Nginx в качестве прокси-сервера:

try_files $uri $uri/ /index.php$args;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-Port $server_port;

Где your_domain.ru необходимо заменить на ваш домен или IP-адрес.

В данной конфигурации обратного прокси-сервера Nginx используются следующие переменные:

  • X-Real-IP $remote_addr – эта переменная содержит IP-адрес реального клиента, который отправляет запросы на прокси-сервер Nginx. Она используется для передачи реального IP-адреса клиента на внутренний сервер.
  • X-Forwarded-For $proxy_add_x_forwarded_for – эта переменная содержит список IP-адресов каждого прокси-сервера, через который прошёл клиентский запрос. Каждый прокси-сервер, через который он проходит, добавляет свой IP-адрес к этому списку, что позволяет проследить маршрут запроса через различные прокси-серверы.
  • Host $host – эта переменная содержит имя хоста, которое может быть получено из строки запроса или поля заголовка запроса "Host". Если клиент не отправляет его, то значение будет соответствовать имени сервера, на котором работает Nginx.
  • X-Forwarded-Port $server_port – определяет исходный порт, который был запрошен клиентом, что позволяет прокси-серверу передать информацию о порте, который клиент использовал для подключения.
  1. Проверьте конфигурацию на наличие ошибок:

  1. Если конфигурация не содержит ошибок, перезапустите Nginx для применения изменений:

sudo systemctl restart nginx

Теперь ваш Nginx прокси-сервер настроен и готов к использованию. Вы можете проверить его работу, отправив запросы на ваш домен или IP-адрес и убедившись, что они успешно перенаправляются на ваш внутренний сервер.

Как настроить Apache и PHP для работы через обратный прокси-сервер

Для настройки Apache и PHP для работы через обратный прокси-сервер (в данном случае Nginx) необходимо выполнить следующие шаги:

  1. Установите и настройте Nginx в качестве обратного прокси-сервера, как описано выше. Убедитесь, что Nginx настроен для проксирования запросов на Apache.
  2. Выполните команды:

sudo apt update

sudo apt install apache2 libapache2-mod-php8.2

  1. Затем пропишите:

sudo nano /etc/apache2/ports.conf

  1. Теперь необходимо указать порт, к которому будут адресованы запросы Apache:
  1. Откройте конфигурационный файл Apache:

sudo nano /etc/apache2/sites-available/example-apache.conf

  1. Введите в нём следующий код:

CustomLog /var/log/apache2/example_access.log common

Require all granted

В этом примере, «example.ru» и «example» замените на ваше доменное имя, а затем сохраните внесённые изменения.

  1. Итак, вы создали виртуальный хост. Запустите сначала его, а потом и Apache с помощью команд:

service apache2 start

Теперь ваш Apache и PHP настроены для работы через обратный прокси-сервер Nginx. Запросы будут передаваться сначала на Nginx, а затем на Apache для обработки PHP. Убедитесь, что все настройки соответствуют вашим потребностям и требованиям.

Добавить комментарий

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