nginx não encaminha ip nos cabeçalhos para o apache (o rpaf está ativado)

3

Estou tentando configurar o nginx como front-end e o apache como back-end no meu servidor. Tudo corre como sempre, instalei o libapache2-mod-rpaf. Mas o apache não vê o ip do cliente real e algumas restrições do .htaccess baseadas no ip não funcionam, pois o apache só vê o ip local.

Aqui está a configuração do nginx vhost ^

server {
    listen 80;
    server_name domain;
    location ~* ^/(admin/|dump/|) {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect http://domain:8080/ /;
    }
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect http://domain:8080/ /;
    }
    location ~* ^.+\.(jpg|swf|flv|ico|txt|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
        access_log /var/www/logs/domain.nginx.access.log;
        error_page 404 = @fallback;
        if ( $host ~* ^((.*).domain)$ ) {
            set $proot /var/www/$1;
            break;
        }
        if ( $host = "domain" ) {
            break;
        }

        root /var/www/domain;
    }
    location @fallback {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

E aqui está a configuração do vache do apache:

<VirtualHost *:8080>
    ServerName domain
    DocumentRoot /var/www/domain
    DirectoryIndex index.php
    CustomLog /var/www/logs/domain.access.log combined
    ErrorLog /var/www/logs/domain.error.log
    ServerAdmin info@domain
    AddDefaultCharset utf8
    php_admin_value open_basedir "/var/www/mod-tmp:.:/var/www/domain"
    php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@domain"
    php_admin_value upload_tmp_dir "/var/www/mod-tmp"
    php_admin_value session.save_path "/var/www/mod-tmp"
    AddType application/x-hwikipd-php .php .php3 .php4 .php5 .phtml
    AddType application/x-hwikipd-php-source .phps
<Directory /var/www/domain>
    Options All
    AllowOverride All
</Directory>
</VirtualHost>

Como posso ver no log nginx:

xxx.yyy.98.14 - - [28/Jan/2012:02:08:29 +0400] "GET / HTTP/1.0" 403 179 "-" "w3m/0.5.3"

Ele vê meu ip real.

Mas no log do apache ele vê apenas o ip local:

127.0.0.1 - - [28/Jan/2012:02:08:29 +0400] "GET / HTTP/1.0" 403 390 "-" "w3m/0.5.3"

rpaf está ativado.

$ cat /etc/apache2/mods-enabled/rpaf.conf 
<IfModule mod_rpaf.c>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1 ::1
</IfModule>
$ cat /etc/apache2/mods-enabled/rpaf.load 
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so
$ ls -l /usr/lib/apache2/modules/mod_rpaf.so
-rw-r--r-- 1 root root 8488 Oct 17 20:47 /usr/lib/apache2/modules/mod_rpaf.so

Então, o que está errado?

ps. Eu reiniciei o nginx e o apache várias vezes depois de salvar essas configurações, mas não houve nenhuma alteração.

    
por rush 27.01.2012 / 23:27

3 respostas

2

Esse é o comportamento correto. Porque apenas seus aplicativos (executados no Apache) veem o IP real. Por exemplo, instale um aplicativo de exemplo, como o WordPress, e instale análises em tempo real, como o Piwik. Insira o código do Piwik no rodapé do WordPress e visite o site do WordPress (depois de sair). Agora o Piwik mostraria o IP real em vez do que é definido em RPAFproxy_ips.

BTW, o arquivo /etc/apache2/mods-enabled/rpaf.conf está sem uma diretiva importante. Deve ter RPAFheader. Por exemplo, meu arquivo de configuração é assim ...

<IfModule mod_rpaf.c>
    RPAFenable On
    RPAFsethostname On
    RPAFproxy_ips 127.0.0.1
    RPAFheader X-Forwarded-For
</IfModule>

Você também pode usar o X-Real-IP no lugar do X-Forwarded-For. Em ambos os casos, certifique-se de que o nginx esteja configurado para enviar um IP real em seu cabeçalho. Por exemplo, se você usa X-Forwarded-For, então sua configuração nginx deve conter o seguinte ...

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $remote_addr;
    
por 28.01.2012 / 06:01
12

Altere a referência <IfModule ""> de mod_rpaf.c para rpaf_module .

Isso corrigiu o problema para mim no Debian Squeeze e no Ubuntu 12.04.

    
por 14.09.2012 / 16:06
0

O mod_rpaf parece ter sido depreciado no Debian Jessie, e o desenvolvimento posterior foi interrompido. Mude para o mod_remoteip, que é um módulo padrão no Debian Jessie.

    
por 09.10.2016 / 17:57