У меня есть установка, в которой я использую Varnish / Hitch >> HAProxy >> Apache
. Это работает, за исключением проблемы, когда IP-адрес клиента неправильно передается на внутренний сервер Apache. Журнал Apache показывает IP-адрес машины, на которой работает HAProxy.
Моя командная строка Varnish содержит:
varnishd -b 127.0.0.1:8080 -a 127.0.0.1:8000,PROXY
Hitch имеет следующее:
backend = "[127.0.0.1]:8000"
write-proxy-v2 = on
HAProxy настроен с помощью:
defaults
option forwardfor
mode http
frontend CacheFrontend
bind *:8080
backend apache
server apache web01:80
В Apache я использую remoteip_module
и есть это в httpd.conf
RemoteIPHeader X-Forwarded-For
Из того, что я прочитал, у меня нет причин изменять формат журнала в Apache при использовании этого модуля.
Я не уверен где неверная конфигурация.
РЕДАКТИРОВАТЬ:
Вот короткий сценарий PHP, показывающий, что передается в Apache:
<?php
echo $_SERVER['HTTP_X_FORWARDED_FOR'] . PHP_EOL;
echo $_SERVER['REMOTE_ADDR'] . PHP_EOL;
<redacted_client_ip>, 127.0.0.1
10.7.7.107
10.7.7.107
- это IP-адрес машины HAProxy.
Протокол PROXY определенно является правильным выбором, поскольку он передает исходный IP-адрес клиента независимо от количества переходов.
Однако для того, чтобы это работало, все переходы должны понимать протокол PROXY.
Я не видел этого в вашем обзоре конфигурации, но вам определенно следует установить свойство .proxy_header
в определении бэкенда вашего сервера Varnish.
Удалите параметр командной строки -b
Varnish и замените его типичным -f /etc/varnish/default.vcl
. В файле default.vcl
вы должны объявить свой сервер и убедиться, что он говорит PROXY.
Вот пример файла default.vcl
:
vcl 4.0;
backend default {
.host = "127.0.0.1";
.port = "8080";
.proxy = 2;
}
Как уже упоминалось, -b
следует заменить на -f
. Вот как это может выглядеть:
varnishd -f /etc/varnish/default.vcl -a 127.0.0.1:8000,PROXY
Что касается HaProxy: убедитесь, что входящие соединения HaProxy также используют PROXY.
А для Apache вы можете просто прочитать заголовок X-Forwarded-For
, чтобы получить IP-адрес клиента, или также принимать подключения по протоколу PROXY.