我试图在我的服务器上设置nginx作为前端和Apache作为后端。 一切正常,我已经安装了libapache2-mod-rpaf。 但阿帕奇并没有看到真正的客户端IP和一些基于IP的.htaccess限制根本不工作,导致阿帕奇只看到本地IP。
这里是nginx虚拟主机configuration^
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的vhostconfiguration:
<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
那么,什么是错的?
PS。 保存这个configuration后,我重新启动了nginx和apache几次,但是没有任何改变。
这是正确的行为。 因为只有你的应用程序(在Apache上运行)才能看到真实的IP。 例如,安装示例应用程序(如WordPress)并安装实时分析(如Piwik)。 在WordPress页脚插入Piwik代码并访问您的WordPress网站(注销后)。 现在Piwik将显示真实IP而不是在RPAFproxy_ips中设置的。
顺便说一句,/etc/apache2/mods-enabled/rpaf.conf文件缺less一个重要的指令。 它应该有RPAFheader。 例如,我的configuration文件看起来像这样…
<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。 无论哪种情况,请确保nginxconfiguration为在其头部发送真实IP。 例如,如果您使用X-Forwarded-For,那么您的nginxconfiguration应包含以下内容…
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $remote_addr;
将<IfModule "">引用从mod_rpaf.c为rpaf_module 。
这在Debian Squeeze和Ubuntu 12.04上解决了这个问题。
Debian Jessie似乎已经将mod_rpaf贬值了,进一步的开发也停止了。 切换到mod_remoteip,它是Debian Jessie中的默认模块。