[nginx] online upgrade

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *