Сервера NGINX часто используют в качестве прокси для сервера Apache, на котором расположен основной сайт, например на движке WordPress. Если зайти на такой сайт из любой точки Internet, то по умолчанию в логах будет зарегистрирован вход с IP адреса сервера NGINX, а не внешний адрес. Такая ситуация естественно не устраивает. Это мы сейчас и исправим.
Демонстрация выполняется на Ubuntu в отдельных Docker контейнерах Apache и Nginx. На сервере Apache был установлен WordPress.
Предположим, что сервера и клиент имеют следующие IP адреса:
- NGINX server: 172.19.0.3
- APACHE server: 172.19.0.4
- Client: 21.249.154.250
- Адрес сайта: https://myblog.ru
Для тестирования на сервере Apache необходимо создать файл test_ip.php
cd /var/www/html nano test_ip.php
В файл добавить текст:
<?php echo $_SERVER['REMOTE_ADDR'];
Для файла установить права:
chown www-data:www-data test_ip.php chmod +x test_ip.php
Проверим как сервер Apache определяет IP адрес. Для этого необходимо зайти по адресу:
https://myblog.ru/test_ip.php
Отобразится IP адрес 172.19.0.3, а нужно, чтобы был 21.249.154.250
172.19.0.3
Необходимо выполнить следующие настройки:
Apache server
0. Если mod_remoteip не установлен, то необходимо установить
sudo apt install -y libapache2-mod-php
1. Если установлен mod_rpaf, то его необходимо деактивировать
a2dismod rpaf
2. Активировать модуль mod_remoteip
a2enmod remoteip
3. Создать файл remoteip.conf
nano /etc/apache2/mods-enabled/remoteip.conf
Файл должен содержать следующее:
<IfModule mod_remoteip.c> # RemoteIPHeader X-Forwarded-For RemoteIPHeader X-Real-IP RemoteIPInternalProxy 127.0.0.1 172.19.0.3 <Ваши IP адреса серверов> </IfModule>
Вместо <Ваши IP адреса> необходимо указать IP адреса NGINX сервера, в нашем случае это 172.19.0.3
4. Перезапустить Apache
// Для Ubuntu service apache2 restart
Nginx server
1. Отредактировать файл nginx.conf
nano /home/user/conf/web/nginx.conf
В секцию location добавить строки:
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
2. Перезапустить nginx
service nginx restart
Проверка
Снова проверим как сервер Apache определяет IP адрес. Для этого необходимо зайти по адресу:
https://myblog.ru/test_ip.php
Если все сделали правильно, то отобразится адрес:
21.249.154.250
На этом настройка закончена. Удачи!
Отличная статья! все получилось. у меня установлен fail2ban на втором сервере он видит логи apache с реальным ip и даже записывает в бан эти ip но все равно дает доступ с этого ip.наверно он не видит этого адреса. может вы знаете как передавать реальный ip от nginx proxy на другой сервет с fail2ban?
Алексей, добрый вечер! Сталкивался с похожей ситуацией. В моём случае сервер с fail2ban должен был обрабатывать логи с другого сервера (docker контейнер). Сервера имели доступ друг другу через внутреннюю сеть. Мне удалось решить эту проблему следующим образом: