у мод рпаф есть один недостаток по сравнению с модулем Игоря - он не
понимает заголовка X-Real-IP, то есть реальный ip всегда передается в
X-Forwarded-For, что не всегда приемлимо :)
учитывая то что nginx умеет выставлять X-Real-IP,
вот небольшой патчик который это исправляет:
--- mod_rpaf-0.5/mod_rpaf-2.0.c 2004-03-17 18:47:30.000000000 +0300
+++ mod_rpaf-2.0.c 2005-02-22 21:44:45.000000000 +0300
@@ -71,6 +71,8 @@
#include "http_protocol.h"
#include "http_vhost.h"
#include "apr_strings.h"
+#include <arpa/inet.h>
+
module AP_MODULE_DECLARE_DATA rpaf_module;
@@ -139,8 +141,12 @@
if (!cfg->enable)
return DECLINED;
- if (is_in_array(r->connection->remote_ip, cfg->proxy_ips) == 1) {
- if (fwdvalue = apr_table_get(r->headers_in, "X-Forwarded-For")) {
+ if (is_in_array(r->connection->remote_ip, cfg->proxy_ips) == 1) {
+ if (fwdvalue = (char *) apr_table_get(r->headers_in, "X-Real-IP")) {
+ r->connection->remote_ip = fwdvalue;
+ r->connection->remote_addr->sa.sin.sin_addr.s_addr =
apr_inet_addr(r->connection->remote_ip);
+ }
+ else if (fwdvalue = (char *) apr_table_get(r->headers_in,
"X-Forwarded-For")) {
apr_array_header_t *arr = apr_array_make(r->pool, 0,
sizeof(char*));
while (*fwdvalue && (val = ap_get_token(r->pool, &fwdvalue, 1))) {
*(char **)apr_array_push(arr) = apr_pstrdup(r->pool, val);
то есть при наличии в заголовках X-Real-IP, разбирается только он,
а X-Forwarded-For и соотв X-Forwarded-Host / X-Host уже не трогаются, так
как nginx не умеет их выставлять - да и не должен вобщемто :)
в конфигурации nginx вместо
proxy_add_x_forwarded_for on;
ставица
proxy_set_x_real_ip on;
Алексей Бещёков.
proforg@xxxxxxxxxxxx
R> Доброго времени суток,
R> Смотрел я долго на lighttpd и выбрал nginx, хоть и нужен SSL тоже :)
R> (стабильный, но ssl в nginx еще не пробовал).
R> И возникла единственная проблема на Апаче 2.0.х - реальный IP адрес на
R> backend сервере.
R> Для апача 1.3.х - такой модуль есть, который написал Игорь Сысоев.
R> После раздумий и чтения документации по mod_headers и остальной
R> компании, понял, что это не поможет.
R> Тогда я зарылся в гугль и после 20 минут лирического диалога с полем
R> поиска нашел нужный модуль, им оказался mod_rpaf
R> Лежит он здесь - http://stderr.net/apache/rpaf/
R> Я его скачал и поставил, а ставится он очень просто с помощью apxs:
R> apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
R> После этого добавляем его строкой в апач:
R> LoadModule rpaf_module modules/mod_rpaf-2.0.so
R> А директивы его описаны в README файле, который идет к нему. Их всего три:
R> - RPAFEnable - включить модуль
R> - RPAFproxy_ips - IP адрес(а) фронт-энд сервера(-ов)
R> - RPAFsethostname - доводит до ума поле HOST, как на фронтэнде.
R> Можете создать просто mod_rpaf.conf и положить его в conf.d/..., текст
R> следующий:
R> ---------------------------- mod_rpaf.conf ----------
R> #
R> LoadModule rpaf_module modules/mod_rpaf-2.0.so
R> #Configuration Directives:
R> RPAFenable On
R> # Enable reverse proxy add forward
R> RPAFproxy_ips YOUR_PROXY_SERVER IP_LIST_OR_ONE_IP
R> # which ips are forwarding requests to us
R> #RPAFsethostname On
R> # let rpaf update vhost settings
R> # allows to have the same hostnames as in the "real"
R> # configuration for the forwarding Apache
R> ------------------------------------------------------
R> RPAFproxy_ips - тут список IP вашего фронтенда или фронендов, пример:
R> RPAFproxy_ips 127.0.0.1 192.168.1.45 182.142.35.24
R> Далее добавляем в конфигурацию nginx (раздел server), следующую строчку:
R> proxy_add_x_forwarded_for on;
R> Теперь nginx передает бэкэнду IP клиента в поле:
R> X-Forwarded-For, а на другом конце его подхватит mod_rpaf и сделает
R> свое грязное дело ;) :)
R> Теперь оба сервера перезапускаем любым способом, кому как нравится. :)
R> И Voila, как говорят знакомые бразильцы :)
R> Все это проделано на Fedora Core 2 и работает.
R> С Уважением,
R> Дмитрий.
R> -
R> Owner and Founder of Remote Admin Service
R> http://remote-admin-service.encrypted-life.net