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