Здравствуй, all.
Решил сделать nginx в качестве фронтенда, но посколько разрабатываю
этот замысел не так давно, возникло несколько вопросов, на которые
прямых ответов не нашел.
Как я уже понял, блока if в другом блоке if быть не может, а можно в
самом if проверять несколько условий (&& или ||)? Или может есть
какие-нибудь другие пути проверки двух условий? Например для того,
чтобы выдать клиенту 403, если у него неправильный реферер и адрес
неподходящий...
Нет, нельзя.
Нужно сводить к последовательности if, используя например внутренние
переменные, если нужно логическое AND
Есть какая-нибудь возможность в процессе проксировании запроса
выполнять какой-либо скрипт, а по результату его выполнения, решать,
отдавать запрос на обработку бэкенду или вернуть какой-нибудь статус?
Тут очень даже кстати был бы встроенный perl с возможностью
назначения хэндлеров в location. Но поскольку модуль -
экспериментальный, а в офф.доках не совсем понятно написано насчет
пересборки самого перла (с последующей пересборкой бинарных модулей),
то на http_perl_module не особо надеюсь...
Если не хватает тривиальных проверок которые умеет if, то
видимо только на него и нужно надеяться :)
А проксировать сразу на два адреса можно? Напр., одновременно апачу и
какому-нибудь демону на 9999-м порту?
Нет, нельзя.
Не совсем понятно насчет location / {}. Это location, ммм, по
умолчанию (т.е. подходит для всех запросов) или нет? Ведь, по логике
вещей, эта конструкция эквивалентна location = '/', т.е. применима для
запросов "GET /".
Это локейшн срабатывает для всех запросов, если ранее не встречено
более полное совпадение.
В некоторых статьях (в частности, на blog.kovyrin.net) в примерах
конфига вижу строчку (настройка в кач-ве фронтенда)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
либо то же самое, но закомментаренное.
А в чем сакральный смысл установки HTTP_X_FORWARDED_FOR?
nginx при обработке запроса сбрасывает существующий заголовок, если он
есть? Или это для каких-то других целей?
Этот заголовок нужен устанавливать если бакенду необходимо получить
реальный IP клиента а не ip фронтенда.
Он добавляется первым в имеющийся список.
Назад (в случае apache) прозрачно получается модулем mod_rpaf /
mod_realip
Как вариант ещё можно использовать заголовок X-Real-IP который
понимает mod_realip
Алексей Бещёков
proforg@xxxxxxxxxxxx
+7 495 7853149