К списку

YARP — легковесный и гибкий реверс-прокси для .NET

сегодня

Антон Зубов, .NET Engineer, Coherent Solutions & ISsoft

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

YARP («Yet Another Reverse Proxy», или «еще один обратный прокси-сервер») — легковесное нативное решение для .NET с открытым исходным кодом, разработанное Microsoft. Это достаточно гибкий инструмент для реальных рабочих нагрузок, который дает команде полный контроль без необходимости задействовать DevOps для его поддержки. 

В этой статье мы разберем, какие бывают прокси-серверы, что такое YARP, чем он отличается от классических решений вроде NGINX и как без лишних усилий внедрить его в свои .NET-проекты. 

Что такое прокси?

Чтобы понять принцип работы обратного прокси, для начала определим, что такое прокси в принципе. 

Антон Зубов, .NET Engineer, Coherent Solutions & ISsoft:

«Прокси-сервер выступает промежуточным звеном между двумя точками коммуникации — обычно это клиент (например, веб-браузер) и сервер. Весь обмен данными между ними проходит через прокси, что позволяет усилить безопасность, управлять трафиком и обеспечить анонимность запросов».

Прокси-серверы делятся на два основных типа: прямые и обратные. Обычно под словом «прокси» подразумевают именно прямой прокси.

Прямой прокси

Прямой прокси обычно располагается на стороне клиента. Он перехватывает запросы клиента, отправляет их в интернет и возвращает ответы сервера обратно. 

Основные его задачи:

  • Анонимизация запросов путем сокрытия данных клиента, таких как IP-адреса.
  • Кэширование ответов для уменьшения задержек.
  • Фильтрация контента и контроль доступа (например, блокировка определенных сайтов).

По сути, прямой прокси действует от имени клиента в его интересах.

Обратный прокси

Реверс-прокси, наоборот, работает на стороне сервера. Он получает запросы клиентов и пересылает их на соответствующий бэкенд-сервер. При этом клиенты обычно не знают о наличии прокси.

Существует множество причин использовать обратный прокси:

  • Балансировка нагрузки: распределение запросов между несколькими серверами.
  • Безопасность: сокрытие информации о внутренних серверах, защита их от прямого доступа из интернета и применение аутентификации на уровне прокси.
  • Завершение SSL: обработка шифрования и дешифрования HTTPS.
  • Кэширование: предоставление данных без обращения к бэкенду. 
  • Преобразование запросов и ответов: добавление необходимых данных для серверного приложения или удаление чувствительной информации из ответа клиенту.
  • Ограничение частоты запросов: контроль числа одновременно отправляемых запросов для повышения надежности и производительности. 
  • Операционные задачи: дополнительное логирование, проверки состояния, контроль версий и т. д.

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

Что такое YARP?

YARP — это функциональная .NET-библиотека, которая позволяет разработчикам легко настраивать реверс-прокси для API и веб-приложений. Она построена на конвейере промежуточного ПО ASP.NET Core, то есть работает как компонент внутри приложения ASP.NET Core.

Это значит, что YARP нельзя использовать как автономный прокси-сервер, но можно применять совместно с ASP.NET Core.

Сильной стороной YARP является гибкость: настройку можно выполнять как через код, так и через JSON-файлы:

  • JSON-конфигурация подходит для простых или типовых прокси-сценариев и позволяет быстро и декларативно задать все параметры. 
  • Конфигурация через код дает больше возможностей для расширения и позволяет настраивать маршрутизацию, балансировку нагрузки и логику преобразования запросов/ответов на C#. 

Благодаря модульной и расширяемой архитектуре YARP может обрабатывать широкий спектр типовых сценариев реверс-прокси, включая:

  • Реализацию функций API-шлюза
  • Балансировку нагрузки между бэкенд-сервисами
  • Маршрутизацию на основе метаданных запроса
  • Перезапись путей и заголовков
  • Безопасность и фильтрацию запросов

Как работать с YARP

Покажем на практике, как создать простой обратный прокси с помощью YARP и ASP.NET Core.

Для начала добавьте пакет YARP в ваш проект.

Затем зарегистрируйте YARP с JSON-конфигурацией и активируйте промежуточное ПО YARP в приложении:

Теперь настроим балансировку нагрузки между двумя экземплярами одного и того же API-приложения через JSON-конфигурацию:

Это все, что нужно для базовой настройки прокси с балансировкой нагрузки. 

Усложним задачу: используем подход на основе кода и добавим преобразование запросов. Представим, что нашим API требуется токен доступа для аутентификации, и задача обратного прокси — автоматически добавлять этот токен ко всем запросам.

Чтобы реализовать эту логику, вернемся в Program.cs и изменим конфигурацию:

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

Сравнение YARP и NGINX

Хотя сравнение YARP и NGINX кажется логичным, важно понимать их фундаментальные различия:

  • YARP — это библиотека для .NET, с помощью которой разработчики могут создавать приложения реверс-прокси и интегрировать эти возможности в существующие приложения ASP.NET Core.
  • NGINX — это автономный веб-сервер и обратный прокси, который предлагает широкий набор встроенных функций, включая платные расширения (NGINX Plus).

Эти различия приводят к совершенно разным моделям применения:

  • С NGINX вы получаете надежный, готовый к использованию в продакшене реверс-прокси «из коробки», который при этом требует изучения синтаксиса конфигурации, понимания его внутренних механизмов и, возможно, подключения DevOps-специалистов. 
  • YARP не предоставляет готовое решение — вы создаете его сами. Такой подход позволяет точно настроить прокси под требования приложения. Если у вас в команде уже есть .NET-разработчики, это может стать более экономичным и интегрированным решением, особенно в .NET-ориентированных средах. 

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

Что это значит для ваших .NET-проектов

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

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