Apache не видит реальный ip в связке Nginx+Apache
Содержание
При настройке Web-сервера используя связку Nginx+Apache, возникла проблема: Не работали скрипты php и директивы htaccess, где использовался реальный IP пользователя, т.к. прокси-запросы от Nginx к Apache приходили от localhost (127.0.0.1), а не от IP пользователя.
Соответственно в access логах Apache выводился 127.0.0.1 как запрашивающий адрес.
Даже если в настройках виртуального хоста Nginx есть location, в котором прописано передавать в заголовке реальный ip пользователя (кстати проверьте, что у вас есть подобные строчки) — Apache все равно не видит реального ip пользователя.
location / { #Передавать запрос на 81 порт localhost (в нашем случае там Apache) proxy_pass http://127.0.0.1:81/; # Установить в заголовке прокси-запроса реальный ip пользователя proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; # .......... |
Почему не работает?
Apache начиная с версии 2.2.4 НЕ поддерживает mod_rpaf, а использует модуль mod_remoteip для замены реального ip на ip из заголовка запроса
(в нашем случае реальный ip для Apache это как раз 127.0.0.1, т.к. он получает запрос не от пользователя напрямую, а через Nginx)
Решение:
Включаем модуль mod_remoteip
sudo a2enmod remoteip
Создаем файл /etc/apache2/conf-available/remoteip.conf (Путь до конфига для Debian или Ubuntu — если другая ОС и вы дочитали до сюда значит вы знаете, где у вас конфиги Apache)
touch /etc/apache2/conf-available/remoteip.conf
И пишем туда эти строки
RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 127.0.0.1 |
Включаем созданный файл конфигурации (команда создает символическую ссылку в папке conf-enabled)
a2enconf remoteip
Перезапускаем apache
/etc/init.d/apache2 restart
Функционал сайта должен заработать, но в логах все равно будет 127.0.0.1
Поэтому Редактируем /etc/apache2/apache2.conf
Меняем
LogFormat «%h %l %u %t «%r» %>s %O «%{Referer}i» «%{User-Agent}i»» combined
на
LogFormat «%a %l %u %t «%r» %>s %O «%{Referer}i» «%{User-Agent}i»» combined
Разница в этих строках: %h превратилась в %a
Перезапускаем apache
/etc/init.d/apache2 restart
Проверяем access логи Apache — видим реальный ip пользователя.
Не помогло к сожаление. Все равно в админке сайта вижу локальный IP у всех пользователей.