Recommended method to update binary from script

Igor Sysoev igor at sysoev.ru
Wed Aug 4 07:37:55 MSD 2010


On Tue, Aug 03, 2010 at 11:29:55PM -0400, shugyo wrote:

> Dear all,
> 
> I have trouble updating the nginx binary without downtime, from a
> script.
> 
> The company I work for runs nginx (0.7.64) as a front-end and apache
> (1.3.37 with mod_perl) as a back-end web server on CentOS 4.8 on
> VMWare ESX virtual machines.
> 
> I need to update the nginx binary to version 0.7.67 on one
> production server, without downtime, and after searching found one
> method is to send the following sequence of commands to the nginx
> master process to get a "graceful" switchover after replacing the
> binary:
> 
> kill -USR2    # to start a 2nd (new) master & workers
> kill -WINCH   # to kill old workers
> kill -QUIT    # to shut down old master, PPID becomes 1
> 
> This sequence works fine from the command line. It also works fine
> from a script on a fast standalone test system running CentOS 5.5. But
> on a (less powerful) VMWare clone of the production server, with
> CentOS 4.8, the last signal when executed within a shell script kills
> the entire nginx, including the new master and workers.
> 
> I found that if I insert a pause (2 seconds) before the QUIT signal
> all is well, but I am not sure of the recommended method. Now I
> replaced the pause with a search for the new master process (PID new,
> PPID equals the old master process), and that also works for me for
> now.
> 
> I expect that the handling of signals takes some time, but would
> appreciate any pointers on what to check for in order to know that it
> is safe to execute further signal.

Yes, the pause is safe.
Please look at the "upgrade" target in Makefile:

upgrade:
        nginx.exe -t

        kill -USR2 `nginx.pid`
        sleep 1
        test -f nginx.pid.oldbin

        kill -QUIT `cat nginx.pid.oldbin`

You may omit -WINCH, it's not required for this procedure.


-- 
Igor Sysoev
http://sysoev.ru/en/



More information about the nginx mailing list