С недавних пор блог переехал с shared-хостинга на VPS под Ubuntu Linux. Вроде бы всё настроил, фронтенд nginx, web-сервер Apache 2.4. Для замены IP-адреса в apache при проксировании запросов от nginx — был установлен и настроен, по старой памяти, модуль mod_rpaf из репозитария дистрибутива. Но я начал замечать в комментариях блога IP-адрес 127.0.0.1, а это значит, что модуль не работает.
Гугление подсказало что в Apache 2.4 с данной проблемой столкнулся не только я. А в самом web-сервере уже есть встроенный модуль mod_remoteip, входящий в базовую поставку. Значит нужно настроить его.
Официальная документация к модулю: httpd.apache.org/docs/trunk/mod/mod_remoteip.html
В Ubuntu по умолчанию нет файла конфигурации, который должен находиться тут: /etc/apache2/mods-available/remoteip.conf, необходимо его создать:
touch /etc/apache2/mods-available/remoteip.conf
И добавить конфигурацию:
<IfModule remoteip_module> RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 127.0.0.1/8 </IfModule>
Здесь два параметра: имя поля в который передаётся реальный IP от фронтенда и доверительная сеть, которая используется при проксировании.
Настройки проксирования в nginx, /etc/nginx/nginx.conf:
location / { proxy_pass http://127.0.0.1:8080/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; }
Обратите внимание, что в обоих конфигурациях используется одно и то же поле X-Forwarded-For, через которое и передаётся реальный IP web-серверу от фронтенда.
За загрузку модуля отвечает файл конфигурации /etc/apache2/mods-available/remoteip.load, вот его содержимое:
LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so
Ещё один нюанс — логгирование. В access_log будет писаться по прежнему 127.0.0.1, нужно исправить настройки логгирования в файле конфигурации Apache /etc/apache2/apache2.conf:
#LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%v:%p %a %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 "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined #LogFormat "%h %l %u %t \"%r\" %>s %O" common LogFormat "%a %l %u %t \"%r\" %>s %O" common
Заменяется %h на %a. Теперь когда всё готово, необходимо подключить этот модуль:
a2enmod remoteip
После этой команды в каталоге /etc/apache2/mods-enabled появятся символические ссылки на remoteip.conf и remoteip.load, останется только перезапустить web-сервер:
service apache2 restart
Теперь и в файлах журнала и в скриптах будет видно реальный IP посетителя, а не 127.0.0.1 .