Почему не правильно работает $_SERVER['REMOTE_ADDR']?
Добрый день.
Имеется сервер с такой архитектурой: Apache2(установленный в OC) + docker(apache+php). Внешний апач проксирует запросы на внутренний, где уже крутится php. В контейнере модуль remoteip активен.
В такой конфигурации $_SERVER['REMOTE_ADDR'] и $_SERVER['SERVER_ADDR'] выдают 172.19.0.1 и 172.19.0.2 соответственно. Понимаю, что скорее всего это из за прокси на докер, но не могу понять как решить эту проблему. Может кто сталкивался с подобной конфигурацией сервера и схожей проблемой?
Проблема оказалась из-за специфики работы докер контейнеров в своей сети. В двух словах о проблеме тут.
Суть в том, что по-умолчанию драйвер сети настроен как bridge. Решением было в docker-compose.yaml установить значение: network_mode: host
Кстати, только подумал, ведь у меня помимо описанной выше схемы есть еще и локально развернутый такой же контейнер без проксирующего apache также реагирует на эти глобальные переменные php. Только вместо 172.19.0.1 и 172.19.0.2 - 172.20.0.1 и 172.20.0.2. Может проблема не в прокси тогда?!
Shurik, если без прокси тоже серый адрес, то скорее всего где-то зачем-то настроен НАТ для контейнерной сети (но это не точно, с контейнерными сетями знаком опосредованно)
но теоретически проксирующий хостовый апач и соответственно настроенный контейнерный апач могут договориться до передачи реальных адресов, естественно, если проксирующий апач эти адреса сам видит исправно
IvanU7n, спасибо за информацию. Буду крутить, пробовать)
Да и проверил - проксирующий апач видит адреса. Если я правильно понял систему это значит, что он должен иметь установленный модуль remoteip? А то когда гуглил проблему так и не понял оба апача должны иметь этот модуль или только серверный?)
Shurik, ну да, проксирующий сервис (Apache) должен как-то передать обрабатывающему сервису (Apache в контейнере) IP-адрес обращающегося клиента. Как правило передача делается добавлением к запросу ставшего уже дефакто стандартным заголовка X-Forwarded-For: 127.0.0.1. Для этого очевидно и нужен модуль remoteip. Соответственно PHP увидит этот IP-адрес через $_SERVER['X_FORWARDED_FOR'].
Shurik, наоборот модуль нужен на контейнером апаче, т.к. именно он переписывает переменные исходя из полученных заголовков, а хостовый апач должен эти заголовки отправлять
AUser0, IvanU7n, спасибо за подсказки!
Кстати, на счет почему в докере именно такое поведение даже без проксирующего внешнего апача вот, что нарыл о работе сети в докере и это в принципе проливает свет на мою проблему Тут . Вдруг интересно будет, ну или еще кто столкнется с этим))
Так что буду дальше копать)