Поставил я mod_accel на шлюз, отдаю ему внешние запросы фаерволом,
внутренние тяжелые серверы разгружаются и все замечательно, но только
пока Location в ответе не попадется. Понятно, что правка Location
необходима при запросе к фронтенду, что бы бекэнд не светить.
Но при прозрачном фронтенде задача с точностью наоборот.
Есть ли возможность отключить коррекцию Location разом?
Я не совсем понял, как в данном случае устроено прозрачное прокирсование,
в фаерволе на шлюзе прописано:
deny tcp from any to gateway_ip dst-port 80,8100-8109 via ext_if
fwd 127.0.0.1 tcp from not my_network to my apaches dst-port 80,8100-8108
т.е. на шлюзе стоит русский апач с перекодировкой по портам и mod_accel
прямые запросы через внешний интерфейс к нему запрещены.
Внешние запросы к остальным серверам перехватываются и отдаются этому
апачу. Порт 8109 не перехватывается для отладочных и иных целей.
На всех серверах перекодировка по этому порту запрещена.
настройки апача на шлюзе:
AccelSetXRealIP on
AccelDefaultExpire 86400
AccelIgnoreNoCache on
AccelIgnoreExpires on
AccelPassCookie on
AccelCacheCookie all !PHPSESSID !b
AccelWaitBeforeBodyRead 80
AccelPass / http://one_back_ip:8109/
AccelNoPass /img/ /extlogs/
AccelIgnoreAuth on
<VirtualHost one_back_ip:8101>
AccelPass / http://one_back_ip:8109/
AccelNoPass /img/
AccelIgnoreAuth on
<Location /documents/registered_users_only/*>
AccelRevalidateUser on
</Location>
.....
часть, которая до виртуального хоста - общая часть и для внутренних
запросов принудительно наполняющих кэш.
но для того, чтобы Location не переписывался, достаточно в AccelPass
указать такое имя бэкенда, которое он никогда не будет возвращать в Location,
например:
В скрипте на бэкенде Location формируется как
Header("Location: http://".$_SERVER['HTTP_HOST'].$local_url_part
а поскольку это был перехват, то в $_SERVER['HTTP_HOST'] сидит ip
Можно попрбовать опицию [PH} для сохранения "Host".
"Флаг PH позволяет передать бэкенду имя хоста в заголовке "Host" неизменным.
...
Номер порта при необходимости изменяется."
Меня больше номер порта волнует, а он см.выше
Странность, на мой взгляд, в том что если перехвачен порт 8101
(VirtualHost), то Location не правится, а если порт 80 или 8100 и т.д.
то Location: http://one_back_ip:8109/.... (одинаковая) - правится.
Т.е. вопрос о странности познавательный, что бы понять, где я не прав,
поскольку решить проблему можно прописав имя сервера в AccelPass
или воспользоваться советом выше, а вот как корректировать
порт на тот, на который посылался запрос клиентом или как его
передать бэкэнду для подстановки в скрипт, это вопрос насущный.
А что в логах, если логировать \"%{accel_r}x\" на фронтенде и
\"%{Location}o\" на бекенде для запросов на 8101 ?
Я послал три запроса на 8100, 8101 и неперехватываемый на 8109
Во всех трех случаях в location на бекенде http://one_back_ip:8109/....
в %{accel_r}x есть только первые два запроса :) одинаковые
POST one_back_ip:8109/.....
а клиент получает 1. gw/....
2. one_back:8101/...
3. one_back:8109/...
Так что все вроде правильно и логично, за исключением правки порта на
80 в первом случае. :(