mod_uid - значения переменных $uid_got и $uid_set пропадают

Igor Sysoev is at rambler-co.ru
Wed Feb 7 12:27:22 MSK 2007


On Wed, Feb 07, 2007 at 05:47:14AM +0200, Anatoly Matyakh wrote:

> Понадобилось транзакции собирать - т.е., считать связки, когда посетителю
> выдаётся результат fastcgi-запроса, затем он запрашивает что-то ещё. Для
> ускорения разбора логов fastcgi-скрипт пишет свой лог, в который выводит
> специфические параметры.
> 
> Нужны два лога: один ведёт nginx в отдельном location, другой - скрипт.
> Я "разогнался" изобразить такую вот конструкцию:
> 
> log_format  uid    
> '$remote_addr\t$msec\t$request\t$http_referer\t$uid_got\t$uid_set';
> userid        on;
> userid_name   uid;
> userid_domain whateverdomain.com;
> 
> location /something {
>     root ...;
>     access_log /var/log/stat/something.log uid;
> }
> 
> location /script {
>     include       fastcgi_params.conf;
>     fastcgi_param UID_GOT $uid_got;
>     fastcgi_param UID_SET $uid_set;
>     fastcgi_pass  unix:/var/run/whateverscript.sock;
>     # и в отладочных целях
>     access_log /var/log/stat/script.log uid;
> }
> 
> Оказалось - не работает. Параметры UID_GOT и UID_SET передаются пустыми.
> В "проверочный" script.log тоже пишутся прочерки на месте  
> $uid_got/$uid_set.
> 
> Убираю строки "fastcgi_param UID_..." - начинает нормально писать в лог.
> 
> Короче, любое обращение к $uid_got или $uid_set делает их пустышками.
> Даже такой вариант не проходит:
> 
> set  $uid  "";
> if ($uid_got ~ "^uid=(.+?)") {
>     set  $uid  $1;
> }
> if ($uid_set ~ "^uid=(.+?)") {
>     set  $uid  $1;
> }
> fastcgi_param UID $uid;
> 
> - если его включить внутрь location /script, то UID скрипту идёт пустое,
> и в лог также пишутся пустышки вместо $uid_*.
> 
> Чего я не понимаю в логике подстановки переменных nginx?
> Или это просто глюк?
> 
> 
> p.s. Я в курсе, что скрипту uid передаётся в Cookie. Но форматы Cookie и
> записи uid в лог трагически не совпадают - для того, чтобы привести Cookie
> в соответствие со строкой uid из лога, нужно напрягаться примерно вот так:
> 
> $uid = uc unpack("H*",pack("V*",unpack("N*",decode_base64($uid_cookie))));
> 
> что не есть хорошо в случае узких мест, как в fastcgi-скрипте, так и в  
> скрипте
> сведения логов.

$uid_got и $uid_set ставятся в фильтре ответа, поэтому их значения
недоступны на стадии запроса к FastCGI. Если же их всё же вызвали
на этой стадии, то они получают пустое значение, которое кэшируется
и в логи тоже пишутся пустые значения.


-- 
Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list