nginx 不会将标头中的 ip 转发到 apache(rpaf 已启用)

nginx 不会将标头中的 ip 转发到 apache(rpaf 已启用)

我正在尝试在我的服务器上将 nginx 设置为前端,将 apache 设置为后端。一切正常,我已经安装了 libapache2-mod-rpaf。但是 apache 看不到真正的客户端 ip,并且一些基于 ip 的 .htaccess 限制根本不起作用,因为 apache 只能看到本地 ip。

以下是 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;
    }
}

以下是 apache vhost 配置:

<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>

正如我在 nginx 日志中看到的那样:

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

它看到了我的真实 IP。

但在 apache 日志中它只能看到本地 IP:

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

rpaf 已启用。

$ 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

那么,问题出在哪里?

附言:保存此配置后,我已多次重新启动 nginx 和 apache,但没有任何变化。

答案1

这是正确的行为。因为只有您的应用程序(在 Apache 上运行)才能看到真实 IP。例如,安装示例应用程序(如 WordPress)并安装实时分析(如 Piwik)。将 Piwik 代码插入 WordPress 页脚并访问您的 WordPress 网站(注销后)。现在 Piwik 将显示真实 IP,而不是在 RPAFproxy_ips 中设置的 IP。

顺便说一句,/etc/apache2/mods-enabled/rpaf.conf 文件缺少一个重要指令。它应该有 RPAFheader。例如,我的配置文件如下所示...

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

您也可以使用 X-Real-IP 代替 X-Forwarded-For。无论哪种情况,请确保 nginx 配置为在其标头中发送真实 IP。例如,如果您使用 X-Forwarded-For,那么您的 nginx 配置应包含以下内容...

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $remote_addr;

答案2

<IfModule "">引用从更改mod_rpaf.crpaf_module

这帮我解决了 Debian Squeeze 和 Ubuntu 12.04 上的问题。

答案3

mod_rpaf 似乎在 Debian Jessie 中已被弃用,并且进一步的开发已停止。请改用 mod_remoteip,它是 Debian Jessie 中的默认模块。

相关内容