nginx优雅重启升级

http://blog.csdn.net/gnail_oug/article/details/52754491

nginx有一个主进程和几个工作进程,主进程的主要作用就是读取、评估配置文件和管理工作进程,工作进程对请求做实际处理。工作进程的数量是在配置文件中配置的,一般设置为cpu的核心数*线程数。

nginx可以通过信号控制,默认情况下,主进程的进程ID记录在/usr/local/nginx/logs/nginx.pid 文件中。信号可以通过nginx可执行文件发送给nginx (nginx -s 信号),也可以通过unix的kill命令发送给nginx,这种情况下是将信号直接发送给指定进程ID的进程,如:kill QUIT 1628。

nginx的安装参考:CentOS6.5编译安装Nginx的方法

1、启动nginx,直接运行nginx的可执行文件:

[plain] view plain copy

  1. [root@localhost ~]# /usr/local/nginx/sbin/nginx

2、停止nginx

快速关闭:nginx -s stop 或者kill -TERM 主进程号 或者kill -INT 主进程号

[plain] view plain copy

  1. [root@localhost sbin]# pwd
  2. /usr/local/nginx/sbin
  3. [root@localhost sbin]# ./nginx -s stop

或者

[plain] view plain copy

  1. [root@localhost sbin]# ps -ef |grep nginx|grep master
  2. root 9879 1 0 13:15 ? 00:00:00 nginx: master process ./nginx
  3. [root@localhost sbin]# kill -TERM 9879

或者

[plain] view plain copy

  1. [root@localhost sbin]# kill -INT 9879

优雅关闭(不接受新的连接请求,等待旧的连接请求处理完毕再关闭):nginx -s quit 或者 kill -QUIT 主进程号

[plain] view plain copy

  1. [root@songguoliang sbin]# pwd
  2. /usr/local/nginx/sbin
  3. [root@songguoliang sbin]# ./nginx -s quit

注意:执行该命令的用户应该是启动nginx的用户

[plain] view plain copy

  1. [root@localhost sbin]# ps -ef |grep nginx
  2. root 9889 1 0 13:17 ? 00:00:00 nginx: master process ./nginx
  3. nobody 9890 9889 0 13:17 ? 00:00:00 nginx: worker process
  4. root 9893 2008 0 13:18 pts/1 00:00:00 grep nginx
  5. [root@localhost sbin]# kill -QUIT 9889

3、重新加载配置文件:nginx -s reload 或者 kill -HUP 主进程号

nginx配置平滑更新

为了让主进程重新读取配置文件,应该向主进程发送一个HUP信号,主进程一旦接收到重新加载配置的的信号,它就检查配置文件语法的有效性,然后试图应用新的配置,即打开新的日志文件和新的socket 监听,如果失败,它将回滚配置更改并继续使用旧的配置,如果成功了,它开启新的工作进程,并给旧的工作进程发消息让它们优雅的关闭,旧的工作进程接收到关闭信号后,不再接收新的请求,如果已有请求正在处理,等当前请求处理完毕后关闭,如果没有请求正在处理,则直接关闭。

[plain] view plain copy

  1. [root@localhost sbin]# ./nginx -s reload

或者

[plain] view plain copy

  1. [root@localhost sbin]# ps -ef|grep nginx
  2. root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
  3. nobody 9949 9944 0 13:23 ? 00:00:00 nginx: worker process
  4. root 9960 9917 0 13:28 pts/1 00:00:00 grep nginx
  5. [root@songguoliang sbin]# kill -HUP 9944

4、测试配置文件,检查配置文件语法是否正确,然后试图打开文件涉及的配置:nginx -t

[plain] view plain copy

  1. [root@localhost sbin]# ./nginx -t
  2. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
  3. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

5、查看nginx版本信息: nginx -v

[plain] view plain copy

  1. [root@songguoliang sbin]# ./nginx -v
  2. nginx version: nginx/1.10.1

6、查看nginx版本信息,编译版本,和配置参数:nginx -V

[plain] view plain copy

  1. [root@songguoliang sbin]# ./nginx -V
  2. nginx version: nginx/1.10.1
  3. built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
  4. configure arguments: --prefix=/usr/local/nginx

7、重启日志文件,备份日志文件时常用:nginx -s reopen 或者 kill -USR1 主进程号

[plain] view plain copy

  1. [root@localhost sbin]# ./nginx -s reopen

或者

[plain] view plain copy

  1. [root@localhost sbin]# kill -USR1 2030

由于nginx是通过inode指向日志文件的,inode和文件名无关,所以即使把日志文件重命名,nginx还是将日志文件写入原文件,只有用上面的命令重新开启日志文件才能将日志写入新的日志文件。

8、nginx的平滑升级

如果你需要升级或者添加、删除服务器模块时,可以通过nginx的平滑升级,在不停止服务的情况下升级nginx。

(1)用新的nginx可执行程序替换旧的可执行程序,即下载新的nginx,重新编译到旧版本的安装路径中(重新编译之前可以备份旧的可执行文件)

(2)给nginx主进程号发送USR2信号

[plain] view plain copy

  1. [root@localhost sbin]# kill -USR2 9944

执行命令前的进程:

[plain] view plain copy

  1. [root@localhost sbin]# ps -ef |grep nginx
  2. root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
  3. nobody 9965 9944 0 13:29 ? 00:00:00 nginx: worker process
  4. root 10010 9917 0 13:42 pts/1 00:00:00 grep nginx

执行命令后的进程:

[plain] view plain copy

  1. [root@localhost sbin]# ps -ef |grep nginx
  2. root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
  3. nobody 9965 9944 0 13:29 ? 00:00:00 nginx: worker process
  4. root 10012 9944 0 13:43 ? 00:00:00 nginx: master process ./nginx
  5. nobody 10013 10012 0 13:43 ? 00:00:00 nginx: worker process
  6. root 10015 9917 0 13:43 pts/1 00:00:00 grep nginx

给nginx发送USR2信号后,nginx会将logs/nginx.pid文件重命名为nginx.pid.oldbin,然后用新的可执行文件启动一个新的nginx主进程和对应的工作进程,并新建一个新的nginx.pid保存新的主进程号

[plain] view plain copy

  1. [root@songguoliang logs]# pwd
  2. /usr/local/nginx/logs
  3. [root@songguoliang logs]# ll
  4. 总用量 16
  5. -rw-r--r--. 1 nobody root 596 10月 8 13:02 access.log
  6. -rw-r--r--. 1 nobody root 881 10月 8 13:43 error.log
  7. -rw-r--r--. 1 root root 6 10月 8 13:43 nginx.pid
  8. -rw-r--r--. 1 root root 5 10月 8 13:22 nginx.pid.oldbin
  9. [root@songguoliang logs]# cat nginx.pid
  10. 10012
  11. [root@songguoliang logs]# cat nginx.pid.oldbin
  12. 9944

这时,nginx的新的实例和旧的实例同时工作,共同处理请求连接。接下来要关闭旧的实例进程。

(3)给旧的主进程发送WINCH信号,kill -WINCH 旧的主进程号

[plain] view plain copy

  1. [root@localhost sbin]# ps -ef |grep nginx
  2. root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
  3. nobody 9965 9944 0 13:29 ? 00:00:00 nginx: worker process
  4. root 10012 9944 0 13:43 ? 00:00:00 nginx: master process ./nginx
  5. nobody 10013 10012 0 13:43 ? 00:00:00 nginx: worker process
  6. root 10092 9917 0 14:05 pts/1 00:00:00 grep nginx
  7. [root@localhost sbin]# kill -WINCH 9944
  8. [root@localhost sbin]#
  9. [root@localhost sbin]#
  10. [root@localhost sbin]#
  11. [root@localhost sbin]# ps -ef |grep nginx
  12. root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
  13. root 10012 9944 0 13:43 ? 00:00:00 nginx: master process ./nginx
  14. nobody 10013 10012 0 13:43 ? 00:00:00 nginx: worker process
  15. root 10094 9917 0 14:06 pts/1 00:00:00 grep nginx

旧的主进程号收到WINCH信号后,将旧进程号管理的旧的工作进程优雅的关闭。即一段时间后旧的工作进程全部关闭,只有新的工作进程在处理请求连接。这时,依然可以恢复到旧的进程服务,因为旧的进程的监听socket还未停止。

(4)给旧的主进程发送QUIT信号,使其关闭。

[plain] view plain copy

  1. [root@localhost sbin]# kill -QUIT 9944
  2. [root@localhost sbin]# ps -ef |grep nginx
  3. root 10012 1 0 13:43 ? 00:00:00 nginx: master process ./nginx
  4. nobody 10013 10012 0 13:43 ? 00:00:00 nginx: worker process
  5. root 10118 9917 0 14:16 pts/1 00:00:00 grep nginx

给旧的主进程发送QUIT信号后,旧的主进程退出,并移除logs/nginx.pid.oldbin文件,nginx的升级完成。

中途停止升级,回滚到旧的nginx

在步骤(3)时,如果想回到旧的nginx不再升级

(1)给旧的主进程号发送HUP命令,此时nginx不重新读取配置文件的情况下重新启动旧主进程的工作进程。

[plain] view plain copy

  1. [root@localhost sbin]# kill -HUP 9944

(2)优雅的关闭新的主进程

[plain] view plain copy

  1. [root@localhost sbin]# kill -QUIT 10012

注:如果由于某种原因,无法关闭新主进程的工作进程,直接给进程号发送KILL信号

nginx的进程分为主进程和工作进程,关于nginx的信号,主进程支持以下信号:

TERM,INT 快速关闭

QUIT 优雅的关闭

KILL 关闭一个顽固进程

HUP 改变配置,使用新配置开启新的工作进程,优雅的关闭旧的进程

USR1 重新开启日志文件

USR2 平滑升级nginx

WINCH 优雅的关闭工作进程

单个工作进程也可以通过信号控制,但它不是必须的。单个工作进程支持的信号有:

TERM,INT 快速关闭

QUIT 优雅的关闭

USR1 重新开启日志文件

WINCH 异常终止调试(需要启动debug_points)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,126评论 5 124
  • Page 1:nginx 服务器安装及配置文件详解 CentOS 6.2 x86_64 安装 nginx 1.1 ...
    xiaojianxu阅读 8,470评论 1 41
  • 跑步首先是一个长期周期性的运动,可以锻炼心肺,磨练意志,要求不高,但是难在坚持。 [装备]如果只是没事活...
    十二月的阳光阅读 257评论 0 3
  • 回顾2016年,在这逝去的365天里,我做了些什么呢? 我有哪些付出?哪些努力?哪些成就?哪些得到?可有懊悔?可有...
    映日红阅读 246评论 1 3
  • 上了大学之后,每次回家,亲戚朋友们就开始轮番轰炸的问,有没有男朋友呀,什么时候带回来看看呀…… 而我爸听到的时候,...
    娅迎阅读 568评论 2 3