Расширенная настройка обратного прокси на Nginx

Расширенная настройка обратного прокси на Nginx 01Расширенная настройка обратного прокси на Nginx подразумевает шифрование трафика, корректную обработку исходного адреса клиента и некоторые другие моменты.


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


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

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

Реальный адрес клиента

Разместив свой сервер за обратным прокси, вскоре вы можете обнаружить, что как минимум с вашими логами что-то не так, например:

Казалось бы, ничего особенного — одна запись свидетельствует о входе с обычного браузера ПК, а вторая — с iPhone, но адрес устройств почему-то везде одинаковый и он совпадает с адресом вашего обратного прокси.

Почему так произошло? Как я и упоминал в предыдущей статье, обратный прокси общается с серверами бэкэнда от имени клиентов, перенаправляя их запросы. Значит исходный адрес клиента будет соответствовать адресу прокси, что мы и видим в логах.

Единственный способ исправить эту ситуацию — как-то передавать реальный адрес клиента в других http-заголовках (X-Real-IP, X-Forwarded-For), а также дополнительную информацию (например прокси-хост, протокол и др.).

Секция server в базовом варианте примет следующий вид:

Подробнее о каждой директиве, заголовках и переменных читайте в официальной документации 1.

Не стоит забывать, что на стороне бэкэнда необходимо также изменить поведение и извлекать нужную информацию из определенных заголовков. Если нужны только «правильные» логи, то достаточно немного переписать их формат, например (см. книгу Администрирование сервера NGINX):

Для изменения заголовка REMOTE_ADDR, чтобы php-скрипты видели реальные адреса клиентов, нужно установить дополнительный модуль — mod-rpaf (или ему подобные) 2:

По умолчанию после установки он уже активирован и остается лишь настроить его. Если модуль не активен, выполните команду:

Затираем содержимое файла:

Открываем его для редактирования, вставляем:

Перезапускаем Apache:

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

SSL

Без SSL сегодня никуда, а потому займемся настройкой шифрования между клиентами и нашим nginx.

Важной особенностью является тот факт, что обратный прокси у нас будет выполнять функцию разгрузки SSL (SSL offload). Это означает, что накладные расходы шифрования/дешифрования ложатся именно на обратный прокси, но не на серверы бэкэнда. Это позволит снять с них действительно ресурсоемкую задачу.

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

Добавляем нужные директивы и получаем конфиг (c учетом настроек из предыдущей главы):

Модуль ngx_http_ssl_module имеет значительно больше параметров, не поленитесь почитать документацию 5.

Примечание:  могут также потребоваться сертификаты промежуточных центров (например у Comodo такие файлы имеют расширение .ca-bundle), чтобы существовала вся цепочка от корневого ЦС до вашего сертификата. У apache для указания этого сертификата есть специальная директива SSLCACertificateFile, но у nginx её аналог отсутствует. Чтобы обойти это ограничение, нам необходимо соединить свой сертификат с промежуточными. Сделать это можно всем знакомой утилитой cat — cat domain.crt domain.ca-bundle >certificate.crt 6.

Надо отметить, что многие параметры ssl по умолчанию находятся в основной секции конфигурации (http). В зависимости от ситуации решите где именно вы их оставите.

Редирект

Следующим логичным шагом после реализации SSL может быть настройка перенаправления 7 с 80 на 443 порт. Делается это очень просто, но важно учесть best practic 8.

Нам понадобится отдельная секция server, которая будет отвечать за прослушку 80 порта и перенаправление на 443:

Перезапустите демона. Думаю, что на этой ноте настройка обратного прокси на Nginx завершена.

comments powered by HyperComments
Яндекс.Метрика