Nginx + apache 2 = нет real-ip. Способ решения.

Сегодня будет пост, который к сеонизму имеет мало отношения, но может оказаться весьма полезным тем, кто держит свои сервера.

Если кто не знает, nginx — это такой очень маленький и очень быстрый сервер, который может работать как прокси. И , если его поставить поверх апача, то тогда скрипты в переменной REMOTE_ADDR будут видеть не айпишник клиента, а айпи nginx’а (127.0.0.1 обычно). В случае с apache 1.3 эта проблема решается с помощью модуля mod_realip от создателя nginx. Но в случае apache 2 это решается несколько сложнее.

Я не могу решить эту задачу с пол года. В основно из-за того, что и без этого всё работало. Да и вообще было влом вновь ковыряться с сервером, благо пока всё работает как часы. Но сегодня всё-таки решился и сделал это.

Итак, чтобы пофиксить проблему с реальными айпишниками клиентов при использовании связки nginx+apache2, нужн-то всего лишь поставить один модуль к апачу и прописать 3 строки в конфигах.

Модуль нужен rpaf2. Если у вас freebsd, то его брать нужно тут ports/www/mod_rpaf2, дальше стандартно make install clean, дальше он уже сам себя в пишет в httpd.conf, нужно будет только раскомментировать строчку


#LoadModule rpaf_module libexec/apache2/mod_rpaf.so

Путь к .so файлу может отличаться. Это не суть важно. Если у вас не freebsd, то брать модуль отсюда. Собирать и прописывать вышеприведенную строчку в конфиге апача.

Дальше там же в конфиге апача нужно добавить 2 строчки:

RPAFproxy_ips 127.0.0.1
RPAFEnable On

Первая строка — это айпишник(и) прокси(ей), вторая — говорит апачу, что rpaf юзать нужно. Что делает rpaf — он из заголовка X-Forwarded-for делает REMOTE_ADDR.

Собственно остается в конфиге nginx’а в разделе server дописать одну строчку:

proxy_set_header X-Forwarded-for $remote_addr;

Теперь нужно перезапустить оба сервер любым способом. Через панель управления там или из шела. С апачем всё понятно, а вот для управления nginx’ом можно сделать такой вот .sh файлик:

kill -HUP `cat /usr/local/etc/nginx/logs/nginx.pid`

Эта строка подаёт процессу nginx сигнал о том, что ему нужно применить новый конфиг и перезапустить worker-процессы. nginx.pid — соответственно файл с текущим номером мастер-процесса nginx’а.

Все, проблема решена.

зы

Всё хочу написать серию статей «Nginx для чайников», да вот руки не доходят.

В закладки!