question about nginx start & stop

Maxim Dounin mdounin at mdounin.ru
Tue Apr 19 14:01:01 UTC 2022


Hello!

On Tue, Apr 19, 2022 at 12:13:45PM +0800, Zhangfei Gao wrote:

> Hi, Maxim
> 
> Thanks for the reply.
> 
> On Sun, Apr 17, 2022 at 10:14 AM Maxim Dounin <mdounin at mdounin.ru> wrote:
> >
> > Hello!
> >
> > On Fri, Apr 15, 2022 at 03:58:52PM +0800, Zhangfei Gao wrote:
> >
> > > Hi,
> > >
> > > I have questions about nginx start and stop
> > > I am using
> > > // start
> > > sudo sbin/nginx
> > > //stop
> > > sudo sbin/nginx -s quit
> > >
> > > 1. openssl engine is init (ngx_ssl_init) twice, but openssl engine
> > > destroy function is not called.
> > > So start nginx and nginx -s quit, engine init twice but not called
> > > engine destroy.
> > > If we start and stop nginx many times, resource leakage will happen.
> >
> > OPENSSL_init_ssl manpage says:
> >
> >        As of version 1.1.0 OpenSSL will automatically allocate all resources
> >        that it needs so no explicit initialisation is required.  Similarly it
> >        will also automatically deinitialise as required.
> >
> > If there is a resource leak, this is a bug in the OpenSSL engine
> > you are testing with.  It's probably up to the OpenSSL development
> > docs how to fix this properly.
> 
> The openssl engine is registered with
> IMPLEMENT_DYNAMIC_BIND_FN(bind_fn)
> bind_fn()
> {
>      ENGINE_set_destroy_function(e, destroy)
>      ENGINE_set_finish_function(e, finish)
> }
> 
> What I found is.
> /sbin/nginx
> -> bind_fn
> /sbin/nginx -s quit
> -> bind_fn
> So bind_fn is called twice, but destroy and finish are not called at all.
> 
> src/core/nginx.c
> main
> ngx_ssl_init(log)  -> call engine: bind_fn
> if (ngx_signal)
>     return ngx_signal_process(cycle, ngx_signal);
>     -> gx_os_signal_process(cycle, sig, pid)    // send signal to kill
> worker process
> 
> For openssl engine, what should I do to match the nginx stop.
> 
> By the way, bind_fn and destroy are matched if testing with openssl
> application itself, no leakage.
> 
> Any suggestions?

The bind function is called when loading a dynamic engine and 
is not expected to be matched by neither destroy nor finish.

The finish function is called when releasing a functional 
reference obtained with init (ENGINE_init() + ENGINE_finish()).  
The destroy function is called when releasing a structural 
reference (ENGINE_new() + ENGINE_free()).

You shouldn't allocate resources in the bind function, but rather 
only set appropriate init function to do so when needed.

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



More information about the nginx-devel mailing list