Я пытаюсь настроить nginx как интерфейсную часть и apache как внутреннюю часть на моем сервере. Все идет как обычно, я установил libapache2-mod-rpaf. Но apache не видит настоящий IP-адрес клиента, а некоторые ограничения .htaccess на основе IP-адреса вообще не работают, потому что 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 после сохранения этих конфигураций, но никаких изменений нет.
Изменить <IfModule "">
ссылка из mod_rpaf.c
к rpaf_module
.
Это устранило проблему для меня в Debian Squeeze и Ubuntu 12.04.
Это правильное поведение. Потому что только ваши приложения (запущенные на Apache) видят настоящий IP. Например, установите образец приложения, такое как WordPress, и установите аналитику в реальном времени, такую как Piwik. Вставьте код Piwik в нижний колонтитул WordPress и посетите свой сайт WordPress (после выхода из системы). Теперь Piwik будет показывать реальный IP вместо того, что установлено в RPAFproxy_ips.
Кстати, в файле /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;
Похоже, что в Debian Jessie стоимость mod_rpaf устарела, и дальнейшая разработка приостановлена. Переключитесь на mod_remoteip, который является модулем по умолчанию в Debian Jessie.