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