Apache за Nginx не видит реальный ip, в логах 127.0.0.1

При настройке 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 в логах 127.0.0.1 а не реальный ip?

Apache начиная с версии 2.2.4 НЕ поддерживает mod_rpaf, а использует модуль mod_remoteip для замены реального ip на ip из заголовка запроса

(в нашем случае реальный ip для Apache это как раз 127.0.0.1, т.к. он получает запрос не от пользователя напрямую, а через Nginx) 

 

Решение. Как отображать настоящий ip пользователя:

Включаем модуль 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 пользователя.

Комментарии

5 комментариев

  • Не помогло к сожаление. Все равно в админке сайта вижу локальный IP у всех пользователей.

  • Ох уж эти нововведения… Стать действительно помогла. Маленькая поправка. Исправьте синтаксис образования логов с
    LogFormat «%a %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

  • А у меня ip определяется, а вот remote_host всегда localhost. Поможет ли мне данный мануал?

Добавить комментарий

Ваш e-mail не будет опубликован.

Sidebar