Linux
nginx 不會將標頭中的 ip 轉發到 apache(啟用 rpaf)
我正在嘗試在我的伺服器上將 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;