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

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

Старт! Честный VDS/VPS, на котором «Лунная База» живет уже 20+ лет

Задумываетесь о том, чтобы поднять свой pet-проект, сайт клиента или настроить окружение для разработки? Уже пора подумать, где арендовать железо.

Лунная База хостится на FirstVDS более 20 лет. Мыслей о том, чтобы перебраться на другой хостинг, не было ни разу (хотя опыт работы с другими вариантами, конечно, есть).

Бывали разные ситуации, но они бывают на любом железе. Главное, что нужно понять: здесь нет маркетинговой шелухи и сказок про «мы всё сделаем за вас». Если вы берете VDS — вам дают полный root, возможность накатить любую ОС и не лезут в ваши конфиги.

Если в саппорт написать с вопросом по вашему коду и получить ответ: «Читайте документацию и разбирайтесь сами» или «Обратитесь к профильному специалисту» — это не повод обижаться. Это повод углубить свои знания в DevOps и сайтостроении! Бегите от тех, кто пообещает: «Мы всё чиним и настраиваем абсолютно бесплатно!». Никто никогда не работает «по доброте душевной» в ущерб себе, а бесплатный сыр в администрировании обычно заканчивается сломанной базой данных.

Что по факту: Гибкое масштабирование ядер и RAM, экономия по сравнению с физическими серверами и адекватная панель ispmanager, если она вам нужна.



Конфиг 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 пользователей)

Самый честный хостинг за 20+ лет существования Лунной Базы

Задумываешься о том, чтобы поднять свой сайт в Интернете? Уже пора подумать о том, какой хостинг выбрать?

Лунная База хостится 20+ лет на firstDVS. При этом, мыслей о том, чтобы перебраться на другой хостинг не было. (Но, при этом есть опыт работы с другими вариантами.)

Бывали с firstDVS разные ситуации, но, они бывают на всех хостингах. Единственное, что тут важно понять, - это то, что никто ничего тебе не будет впаривать... Но, и работать за тебя тоже никто не станет. Если в саппорт ответили: «Читайте по ссылке и разбирайтесь сами...» или вообще «Обратитесь за помощью к специалисту», - это повод углубить свои знания в области сайтостроения, а не бежать к тем, что пообещают: «Мы всё чиним и всё делаем за своих клиентов абсолютно бесплатно!» Никто никогда ничего ни за кого "по доброте душевной" не делал, не делает и не будет делать!

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