Nginx. Обратный прокси-сервер






Под обратным проксированием обычно понимается процесс, в котором сервер, получающий запрос от клиента не обрабатывает его полностью самостоятельно, а частично или целиком отправляет этот запрос для обработки другим (upstream) серверам. То есть, не перенаправляет клиента, а самостоятельно отправляет запрос и возвращает полученный ответ обратно клиенту. Что это даёт?


Используя обратное проксирование вы можете:

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

В Nginx функционал проксирования обеспечивается модулем HttpProxy, который компилируется по умолчанию, если при сборке Nginx вы явно не отключили его. Во всех современных дистрибутивах Nginx поставляется собранным с поддержкой проксирования, так что обычно никаких лишних телодвижений делать не нужно. Тем, кто не читал предыдущих моих статей об Nginx и тем, что забыл, напоминаю о том, что все действия, описываемые в этой серии статей, тестировались и выполнялись на Debian 5 «Lenny» и в незначительной степени могут отличаться от требуемых в вашей системе.

Итак, давайте начнём экспериментировать!

Допустим, у нас имеется два сервера:

  • frontend-сервер Nginx, IP-адрес 192.168.0.1, порт 80;
  • upstream-сервер Apache2, IP-адрес 192.168.0.2, порт 80;

Начнём с малого: настроим проксирование абсолютно всех запросов, приходящих на frontend-сервер к upstream-серверу. Создайте отдельный файл конфигурации виртуальных хостов в /etc/nginx/sites-available/proxy со следующим содержимым:

Не забудьте сделать соответствующий симлинк в каталог /etc/nginx/sites-enabled/ и перезапустить сервер:

Как видите, ничего революционно нового. Уже знакомые директивы server и location. Что нового, так это директива proxy_pass. Вложенная в location, она определяет URL сервера, к которому будет выполняться проксирование.

От рассмотренной выше конфигурации на практике толку мало, разве что Nginx установлен у вас на файрволе и нет прямого доступа к upstream-серверу из Интернет.

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

Выполнять проксирование вовсе необязательно к другим серверам, это можно делать и в пределах localhost'а. Например, у вас на сервере работает Apache, довольно сильно нагруженный каким-нибудь PHP-приложением. Зачем нагружать Apache ещё больше, поручая ему ещё и отдачу статических файлов? Не лучше ли вручить бразды правления статическим контентом Nginx'у, который с этой задачей справляется на порядок быстрее.

Обратите внимание на содержимое второго location'a: при запросе php-файлов, Nginx будет проксировать запрос к локальному интерфейсу, на порт 8080, то есть конфигурацию вашего Apache необходимо изменить, чтобы он ожидал соединения на указанном адресе и порту.

На сегодня пока всё. Но это далеко не всё, что касается обратного проксирования. Предвкушая возгласы «тема сисек не раскрыта», сообщаю о том, что в будущих статьях об Nginx планируется рассмотреть настройку кэширования, балансировку нагрузки к upstream-серверам, а также, я надеюсь, многое-многое другое. Stay tuned ;-)




Nginx. Обратный прокси-сервер: 1 комментарий

Комментарии запрещены.