How to Apache2 + nginx + realip in REMOTE_ADDR

nginx [engine x] - это лёгкий HTTP-сервер и почтовый прокси-сервер. Сие чудо работает на множестве серверов, в том числе на большинстве серверов Рамблера.

Примерная диаграмма работы:

HTTP Clients <--> Frontend server (nginx) <--> Backend servers (Apache, Tomcat, JBoss, etc)

Таким образом backend-сервера будут получать все запросы с единого IP-адреса, а именно с адреса proxy_ip, где установлен nginx (в случае когда backend сервер физически совпадает с frontend получим proxy_ip=127.0.0.1). В принципе это не критично, но если на конечном сервере необходимо знать адрес клиента, то придётся немного поплясать с бубном.

Решение для связки apache2 + nginx:

Для apache 1.3 используется модуль mod_realip, а для apache 2 понадобится mod_rpaf:

emerge -av www-apache/mod_rpaf

Включаем этот модуль в конфигурации apache (путем добавления '-D RPAF' в APACHE2_OPTS) и настраиваем:
<IfDefine RPAF>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips <proxy_ip>
</IfDefine>

RPAFproxy_ips указывает модулю список доверенных ip-адресов проксей, чтобы никто другой не смог подменить адрес клиента. RPAFsethostname исправит HOST, чтобы тот соответствовал frontend'у.

В конфигурацию nginx следует добавить:

proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

Не забываем перезапустить apache и перезагрузить конфигурацию nginx:

/etc/init.d/apache2 restart
/etc/init.d/nginx reload

Comments

Это что-то вроде DMZ

Это что-то вроде DMZ получается?

Re: Это что-то вроде DMZ

В некотором роде да.