ngx_http_cleanup_add

Maxim Dounin mdounin at mdounin.ru
Thu Nov 11 03:47:27 UTC 2021


Hello!

On Wed, Nov 10, 2021 at 07:22:50PM -0800, Dk Jack wrote:

> Hi,
> In my module, I am allocating some memory for each request and saving the
> ptr in my module context. I am registering a callback using
> ngx_http_cleanup_add to perform cleanup for each request. I am releasing
> the memory for the allocation in the cleanup callback. In the log phase, I
> want to make available the contents of the memory I allocated as an nginx
> variable.
> 
> However, when I try to print this variable in the log, the memory has
> already been de-allocated. It looks like the clean-up handlers are called
> before the log phase. Since I have released the memory in the cleanup
> handler, I have nothing to log in the log phase. Is there a way to defer
> the calling of the clean-up handler until after the log phase?

Request cleanup handlers as allocated by ngx_http_cleanup_add() 
are expected to be called before logging: these are used to stop 
various activities which might still be going on when nginx 
decides to terminate the request.  Notably, it used by the 
upstream module to close upstream connections.

If you want to free the memory, a better idea would be to use pool 
cleanup handlers instead, which are registered by the 
ngx_pool_cleanup_add() function.  These are called while actually 
freeing request memory, after all request processing is completely 
finished, including logging.  See here for details:

http://nginx.org/en/docs/dev/development_guide.html#memory_management

Note well that for per-request allocations it is usually better to 
simply allocate memory from the request pool via ngx_palloc(), so 
it is freed automatically when the request pool is destroyed.  
Pool cleanup handlers are mostly needed to free various external 
resources, such as file descriptors or memory from external 
libraries.

-- 
Maxim Dounin
http://mdounin.ru/


More information about the nginx-devel mailing list