Прокси-серверы NGINX: Обслуживание нескольких конечных точек в одной локации
Управление несколькими локациями прокси-серверов NGINX
Прежде чем погрузиться во все детали настройки и многое другое, давайте начнем с базы. Nginx - это довольно мощный веб-сервер, который может применяться в качестве обратного прокси, балансировщика нагрузки или прямого прокси. Для общего ознакомления с этой темой давайте обсудим принцип работы балансировщика нагрузки, потому что такая терминология может запутать. Итак, этот балансировщик распределяет запросы между группой серверов и только после этого передает ответ от сервера клиенту.
Если говорить об обратных прокси, то это такие приложения, которые находятся между внутренними серверами и клиентами. Серверы такого типа принимают трафик клиентов и перенаправляют его во внутреннюю сеть. Таким образом, пользователи не могут получить доступ к внутренним серверам напрямую, они получают доступ к ним только через обратный прокси. Основные преимущества обратного прокси связаны с безопасностью, масштабируемостью и лучшим SSL-шифрованием.
Основываясь на нашем практическом опыте в этой области, мы расскажем, как настроить Nginx таким образом, чтобы он обслуживал несколько конечных точек с одинаковым местоположением. Для этих целей мы будем использовать настройки обратного прокси.
1. Конфигурация Nginx
В конфигурационных файлах Nginx можно легко выяснить, каким образом сервер работает с HTTP-запросами. Основной файл конфигурации называется nginx.conf. Если говорить конкретно об Ubuntu, то в этой операционной системе его можно найти в такой директории, как /etc/nginx. Через этот файл можно получить доступ к директивам, которые можно сгруппировать в блоки.
1.1. Директива блока сервера
Блоки сервера могут также называться контекстами. Они полностью определяют виртуальный сервер. Здесь, на рисунке ниже, мы используем listen для задания IP/имени хоста и порта:
server {
listen 345.0.1.1:8080;
}
В этом примере виртуальный сервер находится по адресу 345.0.1.1, а порт указан 8080.
1.2. Локация блок директивы
В блоке location хранится информация о том, как сервер должен обрабатывать совпадающие HTTP-запросы. Местоположение указывается с помощью регулярного выражения/префиксной строки. Таким образом, URL-адрес HTTP-запроса соответствует локальному блоку (в частности, с помощью префиксной строки или регулярного выражения).
Чтобы обслужить содержимое, мы можем использовать root, как показано в примере ниже:
server {
listen 345.0.1.1:8080;
location /books {
root /info/categories;
}
}
В приведенном выше примере файлы возвращаются из каталога info/categories, а добавив books в location, мы сопоставим URL с books.
Еще одной альтернативой может быть alias. Эта директива добавляет URL запроса к локальному прямому пути, таким образом можно пропустить префикс строки:
location /books {
alias /info/categories;
}
2. Управление несколькими конечными точками прокси
Здесь мы попытаемся объяснить, как работает процесс, создав 2 виртуальных сервера, которые будут имитировать 2 конечные точки. После этого мы объясним процесс настройки сервера Nginx для проксирования запросов с конечными точками под одним URL.
2.1. Создание конечных точек
Начнем с двух простейших конечных точек:
server {
listen 8081;
location /user1 {
alias /info/user1;
}
}
server {
listen 8082;
location /user2 {
alias /info/user2;
}
}
Таким образом, мы определили 2 виртуальных сервера, каждый блок которых содержит такую информацию, как:
- Первый сервер находится на порту 8081, контент обслуживается из /info/user1 напрямую и сопоставляет запросы с /user1.
- Второй пример находится на порту 8082, контент обслуживается из директории /info/user2 и соответствует запросам с /user2.
2.2. Директива proxy_pass
Для организации правильной переадресации нам следует использовать proxy-pass в локальном блоке. Директива такого типа работает, доставляя HTTP-запросы на определенный адрес. Вот иллюстрация того, как она должна выглядеть:
server {
listen 8000;
location /api {
proxy_pass http://345.0.1.1:8081/user1;
}
location /api/user2 {
proxy_pass http://345.0.1.1:8082/user2;
}
}
На этом примере был создан виртуальный сервер на порту 8000 и 2 локации в этом сервере, эти локации функционируют таким образом:
- /api перенаправляет запросы на начальную конечную точку (http:// 345.0.1.1:8081/user1).
- /api/user2 перенаправляет запросы на конечную точку http:// 345.0.1.1:8082/user2.
Еще одним важным фактом является то, как proxy_pass перенаправляет URL. Здесь мы обратим внимание на два аспекта:
- Proxy_pass соединяет URL с именем хоста, таким образом http:// 345.0.1.1:8081
- Proxy_pass соединяет URL с путем, в таком виде http:// 345.0.1.1:8081/user1
2.3. Создание пробных данных
Перед тестированием настройки необходимо создать тестовые файлы в директориях /info/user2 и /info/user1, это можно сделать в такой форме:
$ sudo echo { 'message' : 'Hi from user1' } | sudo tee /info/user1/echo.json
{ message : Hi from user1 }
$ sudo echo { 'message' : 'Hi from user2' } | sudo tee /info/user2/echo.json
{ message : Hi from user2 }
После создания образца данных вы можете начать процесс тестирования следующим образом:
$ curl http://345.0.1.1:8000/api/echo.json
{ message : Hi from user1 }
$ curl http://345.0.1.1:8000/api/user2/echo.json
{ message : Hi from user2 }
Файлы JSON были показаны на выходе процесса тестирования. В завершение процесса давайте обсудим все детали начального запроса, а именно:
- Запрос перенаправляется с http:// 345.0.1.1:8000/api/echo.json на http:// 345.0.1.1:8081/user1/echo.json.
- Запрос http:// 345.0.1.1:8081/user1/echo.json обрабатывается и возвращает ресурс /info/user1/echo.json
Подведем итоги
Основываясь на нашем практическом опыте в области виртуальных серверов, мы решили поделиться несколькими полезными рекомендациями и реальными примерами использования сервера Nginx в качестве обратного прокси. Мы привели несколько практических примеров того, как 2 конечные точки могут работать под одним маршрутом. Надеемся, что эта статья оказалась полезной для вас, и вы сможете легко использовать все, что вам нужно, из приведенной выше информации.