Реальные IP в связке Nginx + Apache

При использовании Nginx в качестве реверс прокси, IP адреса клиентов не передаются в Apache. В логах Apache можно видеть запросы, но адреса будут локальными (127.0.0.1 или адрес машины, на которую установлен Nginx). Настраиваем связку Nginx (вер. 1.18) + Apache (вер. 2.4) для передачи последнему реальных IP адресов. Синтаксис Nginx меняется раздражающе часто, но зная куда копать, всегда можно найти более свежее решение. Исходим из того, что Nginx у нас установлен и работает, но возникла необходимость запустить нечто, что работает только с Apache. Если вы когда-либо пытались длительное время обходиться без Apache, используя CMS типа phpBB или DataLife, то понимаете о чём я. Примеров море, но с этими двумя мне приходится возиться чаще всего. Оба движка (вроде как) поддерживают работу на Nginx (phpBB даже официально), но часто бывает так, что всё работает, а после обновлений перестаёт. Всегда лотерея. Устанавливаем Apache и прочее. В моём случае это Debian, поэтомуsudo apt install apache2 libapache2-mpm-itk libapache2-mod-php7.4 libapache2-mod-rpafОбратите внимание на libapache2-mod-php7.4. Выберите пакет для версии PHP, установленной на вашем сервере. Система попытается запустить Apache, но ей это не удастся, так как 80-й порт занят. У нас там Nginx. Отредактируйте файл ports.conf. В Debian он в корне директории Apache2. Listen 127.0.0.1:8080Сохраните файл. Конфиг отвечает за настройку портов. Отредактировав вышеуказанную строчку мы показали, что слушаться должен 8080-й порт на локальном хосте. Если порт у вас занят чем-то другим, то укажите другой порт. Не имеет значения какой порт будет слушать Apache, пока в конфигах хостов Nginx прописан он же. Если Nginx у вас на другой машине, то укажите её адрес. Не имеет смысла править строки, отвечающие за SSL, если соответствующий модуль будет выключен. Не нужно его включать, если ваши сайты доступны по https. Всем этим будет заниматься Nginx и передавать запросы в Apache уже через http, что не страшно в пределах доверенной локальной сети. И уж тем более в том случае, когда Nginx и Apache работают на одной машине. Включите модуль remoteip в Apache.sudo a2enconf remoteipСоздайте файл remoteip.conf в папке с конфигами на стороне Apache. В Debian это папка conf-available в корневой директории Apache. Содержание должно быть следующим:RemoteIPHeader X-Real-IP
RemoteIPHeader X-Client-IP
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1Где в последней строке адрес машины с Nginx. Сохраните файл и “включите” конфиг.sudo 2enconf remoteipКонфиг виртуального хоста на стороне Apache ничего особенного в себя включать не должен, кроме указания адреса и порта.<VirtualHost 127.0.0.1:8080>Не забудьте блок Directory, если хотите использовать файлы .htaccess на стороне Apache. Обычно именно это основная причина, по которой быстрота Nginx меркнет на фоне геморроя с ЧПУ в различных CMS. Так же не забудьте включить модуль rewrite.<Directory /home/user/путь_к_сайту/public/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>Если у вас виртуальные хосты в отдельных конфигах, то не забудьте включить сам хост.sudo a2ensite имя_конфига.confОтредактируйте конфиг модуля rpaf.conf. В Debian в папке mods-available, в корне директории Apache. Раскомментируйте или добавьте нужные строки. Должно получиться нечто подобное:<IfModule rpaf_module>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 ::1
RPAFheader X-Real-IP
</IfModule>Сохраните файл. Не забудьте про IP, если Nginx на другой машине. На этом на стороне Apache всё готово. Перезагрузите Apache.sudo systemctl restart apache2В настройках виртуального хоста на стороне Nginx добавьте следующее: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;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080;
}Так же обратите внимание на IP. Перезапустите Nginx.sudo systemctl restart nginxТак же можно добавить следующее:location ~* ^.+.(jpg|jpeg|gif|png|svg|js|css||zip|7z|gz|bz2)$ {
}Как видно из содержимого, это перечисление расширений файлов, которые будут обрабатываться на стороне Nginx.На этом всё. Теперь в логах Apache и в CMS (если такой функционал там присутствует) будут отображаться реальные IP адреса клиентов, а не локальный адрес Nginx.

Go to Source
Author: Tatyana