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

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

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

  • Dislike
  • 0
  • Like
Реальные 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.
Like Dislike

___
Tatyana K.



Tags: Linux, PHP, Nginx, Apache


 
  • Creative Commons Licence
  • Norton Safeweb
  • Powered by MariaDB
  • Powered by Debian
  • Website Uptime Monitoring By ServiceUptime.com
  • Yandex.Metrika