Мы хотим сохранить исходный IP-адрес клиента при передаче запроса от Apache на наш application.
В настоящее время у нас есть такая настройка:
CLIENT --123.2.3.4--> APACHE --127.0.0.1--> API
Но мы хотим, чтобы она была:
CLIENT --123.2.3.4--> APACHE --123.2.3.4--> API
Я знаю, что мы могли бы искать исходный удаленный адрес в заголовке Forwarded-For
; но идея состоит в том, что это не должно быть проблемой для нашего приложения API, API не нужно знать, может ли он находиться за прокси-сервером, а скорее искать IP-адрес и находить его каждый времени.
Мы пробовали с mod_proxy и mod_remoteip , но безуспешно.
Я бы использовал mod_remoteip, если вы можете, но учтите, что вам придется изменить лог-формат, чтобы использовать %a, а не %h, чтобы увидеть адрес в ваших журналах.
Также, ответ скорее зависит от того, как ваше приложение, которое является reverse-proxied, связано с Apache.
По сути, что-то должно сообщить об этом вашему приложению. Если вы используете mod_php, mod_fcgi, mod_wsgi, mod_proxy_ajp, то это уже сделано за вас.
Если, с другой стороны, вы просто используете mod_proxy_http, то вам нужно убедиться, что необходимые данные передаются через заголовок (например, X-Forwarded-For), а также, что вы используете ProxyPreserveHost. Точно так же вам нужно отправить, использовался ли http или https на внешнем интерфейсе, и даже какой порт был использован. Все это очень важно для корректной работы таких вещей, как создание гиперссылок и куки. Иначе вы должны явно указать приложению, какие настройки у него есть во внешнем интерфейсе (что, возможно, проще).
Apache Tomcat (как и многие контейнеры промежуточного программного обеспечения J2EE) позволяет вам задавать такие детали окружения в коннекторе.
Для рабочих нагрузок Tomcat я бы вообще рекомендовал AJP, потому что это намного проще; но если WebSockets входит в микс, который не поддерживается AJP, то вы должны вернуться к HTTP, и таким образом настроить вещи в бэкэнде. Для этого не требуется настраивать приложение (в смысле J2EE) только содержащее среду выполнения.
Что-то, где-то, и кто-то должен поддерживать эту сложность. И производители приложений должны действительно убедиться, что это может сработать. Если что, чистая поддержка таких сред более важна по мере того, как рабочие нагрузки перемещаются в контейнерные среды.