Linux

nginx 不會將標頭中的 ip 轉發到 apache(啟用 rpaf)

  • October 9, 2016

我正在嘗試在我的伺服器上將 nginx 設置為前端,將 apache 設置為後端。一切如常,我已經安裝了 libapache2-mod-rpaf。但是 apache 看不到真正的客戶端 ip,一些基於 ip 的 .htaccess 限制根本不起作用,因為 apache 只看到本地 ip。

這是 nginx 虛擬主機配置^

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,但沒有任何更改。

這是正確的行為。因為只有您的應用程序(在 Apache 上執行)才能看到真實 IP。例如,安裝 WordPress 等範例應用程序並安裝 Piwik 等實時分析。在 WordPress 頁腳中插入 Piwik 程式碼並訪問您的 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;

引用自:https://serverfault.com/questions/354440