Re: Указатель на произвольные данные в структуре ngx_connection_s

Maxim Dounin mdounin на mdounin.ru
Пт Мар 24 12:20:45 UTC 2017


Hello!

On Fri, Mar 24, 2017 at 12:44:10PM +0300, Pavel Balaev wrote:

> Добрый день.
> 
> Я пытаюсь написать модуль, который должен хранить некоторые произвольные
> данные на протяжении времени жизни сессии (keep-alive). В структуре ngx_connection_s есть
> пул памяти, при первом реквесте я аллоцирую память для ctx =
> ngx_pcalloc(r->connection->pool,..., но проблема в том, что полученный
> адрес негде прикрепить. Локально я пропатчил структуру ngx_connection_s и сохраняю
> указатель в r->connection->ctx. У меня есть подозрения, что я делаю
> что-то не так. 

Лучше всего - не пытаться ничего хранить "на протяжении времени 
жизни сессии", вас ждут сюрпризы с тем, когда именно и по каким 
причинам соеденение может закрываться, а равно с тем, какие именно 
запросы могут присутствовать в одном соединении.  Протокол HTTP не 
предусматривает какой-либо зависимости от соединения, и не надо её 
вводить - а то получится, как у MS NTLM-авторизацией для HTTP: 
вроде и есть, но противоречит протоколу, и в любых конфигурациях, 
отличных от тривиальных, скорее не работает, чем работает.

Если изложенное выше вас не переубедило, и вы хорошо понимаете, 
зачем вам хранить данные именно в соединении - то это можно 
сделать в форме pool cleanup handler'а: добавить свой cleanup 
handler с помощью ngx_pool_cleanup_add(), а при необходимости 
получить данные обратно - найти его в списке c->pool->cleanup.  
Пример подобного хранения данных (правда, в пуле запроса, а не 
соединения) можно посмотреть, например, в модуле realip.

-- 
Maxim Dounin
http://nginx.org/


Подробная информация о списке рассылки nginx-ru