Nginx становиться с каждым днём всё популярнее и популярнее. И вот, недавно обнаружил тот факт, что мы можем обновить nginx вообще без downtim’a и restart’a. Этим может похвастаться не каждый продукт.
Тестовый стенд: FreeBSD 9.0 Release amd64, nginx-1.2.3 (в последствии ставший 1.2.6)
Проверяем старую версию и запущенный nginx:
# ps -auxww | grep nginx root 34802 0.0 0.2 18788 2148 ?? Ss 12:36PM 0:00.00 nginx: master process /usr/local/sbin/nginx www 34804 0.0 0.3 18788 2576 ?? S 12:36PM 0:00.00 nginx: worker process (nginx) www 34805 0.0 0.3 18788 2576 ?? S 12:36PM 0:00.00 nginx: worker process (nginx) www 34806 0.0 0.3 18788 2576 ?? S 12:36PM 0:00.00 nginx: worker process (nginx) www 34807 0.0 0.3 18788 2572 ?? S 12:36PM 0:00.00 nginx: worker process (nginx) # nginx -v nginx version: nginx/1.2.3
Для установки нового nginx’a можно пойти разными путями: исходники, порты, пакеты, но я выбрал порты. Можно снести старый и заинсталлить новый, а можно не сносить старый, а поставить поверх. Для этого, выполним такую команду
# echo 'FORCE_PKG_REGISTER=YES' >> /etc/make.conf
Теперь идём в порты, обновляем их и ставим nginx. После установки посылаем nginx’y сигнал USR2 (этот сигнал позволяет переименовать номер master pid’a и запустить ещё один экземпляр master’a, а он уже запуститься с новыми бинарниками) и смотрим процессы:
#nginx -v nginx version: nginx/1.2.6 # kill -USR2 `cat /var/run/nginx.pid` # ps -auxww | grep nginx root 31810 0.0 0.2 18792 2372 ?? S 1:05PM 0:00.00 nginx: master process /usr/local/sbin/nginx www 31811 0.0 0.3 18792 2792 ?? S 1:05PM 0:00.00 nginx: worker process (nginx) www 31812 0.0 0.3 18792 2792 ?? S 1:05PM 0:00.00 nginx: worker process (nginx) www 31813 0.0 0.3 18792 2792 ?? S 1:05PM 0:00.00 nginx: worker process (nginx) www 31814 0.0 0.3 18792 2788 ?? S 1:05PM 0:00.00 nginx: worker process (nginx) root 34802 0.0 0.1 18788 1396 ?? Ss 12:36PM 0:00.00 nginx: master process /usr/local/sbin/nginx www 34804 0.0 0.2 18788 1624 ?? S 12:36PM 0:00.08 nginx: worker process (nginx) www 34805 0.0 0.2 18788 1624 ?? S 12:36PM 0:00.09 nginx: worker process (nginx) www 34806 0.0 0.2 18788 1624 ?? S 12:36PM 0:00.08 nginx: worker process (nginx) www 34807 0.0 0.2 18788 1544 ?? I 12:36PM 0:00.00 nginx: worker process (nginx)
Как видим есть 2 мастер процесса: новый (pid=31810) и старый (pid=34802)
Теперь посылаем сигнал WINCH старому master’y ngin’a (pid=34802), который позволяет завершить потомки родительского процесса:
# kill -WINCH 34802 # ps -auxww | grep nginx root 31810 0.0 0.2 18792 2372 ?? I 1:05PM 0:00.00 nginx: master process /usr/local/sbin/nginx www 31811 0.0 0.3 18792 2836 ?? I 1:05PM 0:00.00 nginx: worker process (nginx) www 31812 0.0 0.3 18792 2792 ?? S 1:05PM 0:00.01 nginx: worker process (nginx) www 31813 0.0 0.3 18792 2792 ?? S 1:05PM 0:00.01 nginx: worker process (nginx) www 31814 0.0 0.3 18792 2788 ?? S 1:05PM 0:00.01 nginx: worker process (nginx) root 34802 0.0 0.1 18788 1436 ?? Ss 12:36PM 0:00.00 nginx: master process /usr/local/sbin/nginx
Ну и наконец-то посылаем сигнал QUIT, который и завершает старый master процесс:
# kill -QUIT 34802 # ps -auxww | grep nginx root 31810 0.0 0.2 18792 2372 ?? I 1:05PM 0:00.00 nginx: master process /usr/local/sbin/nginx www 31811 0.0 0.3 18792 2836 ?? I 1:05PM 0:00.00 nginx: worker process (nginx) www 31812 0.0 0.3 18792 2792 ?? S 1:05PM 0:00.01 nginx: worker process (nginx) www 31813 0.0 0.3 18792 2792 ?? S 1:05PM 0:00.01 nginx: worker process (nginx) www 31814 0.0 0.3 18792 2788 ?? S 1:05PM 0:00.01 nginx: worker process (nginx)
Теперь у нас новый nginx без downtim’a