Как передать реальный IP для Apache, работающем за прокси NGiNX

После того, как все настройки сервера в связке NGiNX + Apache сделаны, (читать по → этой ссылке), администратор сервера сталкивается в вопросом о том, как передать реальный IP пользователя web-серверу Apache, работающему за проксирующим NGiNX. И это не праздны вопрос и не тривиальная задача. Мало того, что в логи Апача пишутся IP не реальных пользователей, а IP локального NGiNX (127.0.0.1), то есть не несут никаких сведений о том, какой пользователь был на сайте, но и перестают работать все сервисы, привязанные к IP пользователю на сайтах. Как это быстро исправить, рассмотрим в этой статье.



Конфиг NGiNX (nginx.conf)

Посмотрим в конец файла нашего web-сервера NGiNX (файл /etc/nginx/nginx.conf) и обратим внимание на строчку

include /etc/nginx/conf.d/*.conf;

Именно в ней подключаются дополнительные файлы конфигурации.

Файл дополнительной конфигурации NGiNX (default.conf)

Теперь откроем файл с дополнительными настройками NGiNX, который находится в папке conf.d:

/etc/nginx/conf.d/default.conf

Тут находится закомментированный блок информации именно для наших нужд:

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

Если вчитаться в английский комментарий этого блока, то станет ясно, что именно с ним нужно работать. Поэтому расскомментируем этот блок и добавим к нему пару-тройку строк для пробрасывания реального IP через NGiNX в Апач:

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    # раскомментировать
    location ~ \.php$ {
        proxy_pass   http://127.0.0.1;
		# + добавить:
		proxy_set_header Host $host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Real-IP $remote_addr;
    }

Завершение настройки пробрасывания реального IP пользования в NGiNX

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

# service nginx restart

Если всё скопировано правильно, NGiNX тихо перезапустится. Можно переходить к донастройке Apache, чтобы он принимал и обрабатывал пробрасываемые данные с реальным IP пользователя.

Модуль remoteip для Apache 2

Для того, чтобы Apache начал правильно воспринимать и главное, правильно обрабатывать реальный IP пользователя, пробрасываемый NGiNX, воспользуемся идущим в стандартном пакете Apache модулем remoteip.

Предварительная настройка модуля remoteip для Apache 2

Вначале настроим работу модуля remoteip. Для этого в папке conf-available создадим файл remoteip.conf. Полный путь до этого файла:

/etc/apache2/conf-available/remoteip.conf

В этот файл запишем пару строчек:

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1

Теперь всё это нужно подключить к Apache.

Запуск Apache с модулем remoteip и его дополнительными настройками.

Командой

# a2enmod remoteip

Подключим модуль remoteip к Apache. Но того мало, требуется применить настройки этого модуля. Для этого нужно выполнить команду:

# a2enconf remoteip

Теперь модуль remoteip сконфигурирован и готов к работе. Осталось перезапустить Apache, что и делаем командой:

# systemctl restart apache2

Всё тихо должно перезагрузиться и начать работать! =)

Резюме

Для того, чтобы проверять всё на ходу, можно быстро состряпать php-скрипт и периодически проверять, какой IP отдаётся Апачем. Скрипт прост:

<?php
echo $_SERVER['REMOTE_ADDR']
?>

Собственно всё. Надеюсь, ничего не упустил. =)
Осталось проверить, начали ли отрабатываться блокировка по IP в .htaccess. Со спамерами я ещё не закончил разбираться. ;)

Реальные IP пользователя в логах Apache

Для того, чтобы в логах виртуальных хостов записывались реальные IP пользователей нужно в основном конфиге Апача, который лежит тут:

/etc/apache2/apache2.conf

Заменить строки:

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common

на:

LogFormat "%a:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O" common

И перезагрузить Апач:

# apachectl restart

После этого в логи должны начать писаться реальные IP пользователей.

P.S. .htaccess и без этого начинает работать нормально (с реальными IP пользователей)

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню