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

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

  • Dislike
  • 0
  • Like
При использовании 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-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 a2enmod 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 a2enconf 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


На этом на стороне 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. Актуально только если Nginx и Apache на одной физической машине.

На этом всё. Теперь в логах Apache и в CMS (если такой функционал там присутствует) будут отображаться реальные IP адреса клиентов, а не локальный адрес Nginx.
Like Dislike

___
Tatyana K.



Tags: Linux, PHP, Nginx, Apache


 
  • Creative Commons Licence
  • Norton Safeweb
  • Website Uptime Monitoring By ServiceUptime.com