http://blog.csdn.net/gnail_oug/article/details/52754491
nginx有一個(gè)主進(jìn)程和幾個(gè)工作進(jìn)程查牌,主進(jìn)程的主要作用就是讀取、評(píng)估配置文件和管理工作進(jìn)程训桶,工作進(jìn)程對(duì)請(qǐng)求做實(shí)際處理枫浙。工作進(jìn)程的數(shù)量是在配置文件中配置的匾委,一般設(shè)置為cpu的核心數(shù)*線程數(shù)让虐。
nginx可以通過信號(hào)控制谍夭,默認(rèn)情況下黑滴,主進(jìn)程的進(jìn)程ID記錄在/usr/local/nginx/logs/nginx.pid 文件中。信號(hào)可以通過nginx可執(zhí)行文件發(fā)送給nginx (nginx -s 信號(hào))紧索,也可以通過unix的kill命令發(fā)送給nginx袁辈,這種情況下是將信號(hào)直接發(fā)送給指定進(jìn)程ID的進(jìn)程,如:kill QUIT 1628珠漂。
nginx的安裝參考:CentOS6.5編譯安裝Nginx的方法
1晚缩、啟動(dòng)nginx,直接運(yùn)行nginx的可執(zhí)行文件:
[plain] view plain copy
- [root@localhost ~]# /usr/local/nginx/sbin/nginx
2媳危、停止nginx
快速關(guān)閉:nginx -s stop 或者kill -TERM 主進(jìn)程號(hào) 或者kill -INT 主進(jìn)程號(hào)
[plain] view plain copy
- [root@localhost sbin]# pwd
- /usr/local/nginx/sbin
- [root@localhost sbin]# ./nginx -s stop
或者
[plain] view plain copy
- [root@localhost sbin]# ps -ef |grep nginx|grep master
- root 9879 1 0 13:15 ? 00:00:00 nginx: master process ./nginx
- [root@localhost sbin]# kill -TERM 9879
或者
[plain] view plain copy
- [root@localhost sbin]# kill -INT 9879
優(yōu)雅關(guān)閉(不接受新的連接請(qǐng)求荞彼,等待舊的連接請(qǐng)求處理完畢再關(guān)閉):nginx -s quit 或者 kill -QUIT 主進(jìn)程號(hào)
[plain] view plain copy
- [root@songguoliang sbin]# pwd
- /usr/local/nginx/sbin
- [root@songguoliang sbin]# ./nginx -s quit
注意:執(zhí)行該命令的用戶應(yīng)該是啟動(dòng)nginx的用戶
[plain] view plain copy
- [root@localhost sbin]# ps -ef |grep nginx
- root 9889 1 0 13:17 ? 00:00:00 nginx: master process ./nginx
- nobody 9890 9889 0 13:17 ? 00:00:00 nginx: worker process
- root 9893 2008 0 13:18 pts/1 00:00:00 grep nginx
- [root@localhost sbin]# kill -QUIT 9889
3、重新加載配置文件:nginx -s reload 或者 kill -HUP 主進(jìn)程號(hào)
nginx配置平滑更新
為了讓主進(jìn)程重新讀取配置文件待笑,應(yīng)該向主進(jìn)程發(fā)送一個(gè)HUP信號(hào)鸣皂,主進(jìn)程一旦接收到重新加載配置的的信號(hào),它就檢查配置文件語(yǔ)法的有效性滋觉,然后試圖應(yīng)用新的配置签夭,即打開新的日志文件和新的socket 監(jiān)聽,如果失敗椎侠,它將回滾配置更改并繼續(xù)使用舊的配置第租,如果成功了,它開啟新的工作進(jìn)程我纪,并給舊的工作進(jìn)程發(fā)消息讓它們優(yōu)雅的關(guān)閉慎宾,舊的工作進(jìn)程接收到關(guān)閉信號(hào)后丐吓,不再接收新的請(qǐng)求,如果已有請(qǐng)求正在處理趟据,等當(dāng)前請(qǐng)求處理完畢后關(guān)閉券犁,如果沒有請(qǐng)求正在處理,則直接關(guān)閉汹碱。
[plain] view plain copy
- [root@localhost sbin]# ./nginx -s reload
或者
[plain] view plain copy
- [root@localhost sbin]# ps -ef|grep nginx
- root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
- nobody 9949 9944 0 13:23 ? 00:00:00 nginx: worker process
- root 9960 9917 0 13:28 pts/1 00:00:00 grep nginx
- [root@songguoliang sbin]# kill -HUP 9944
4粘衬、測(cè)試配置文件,檢查配置文件語(yǔ)法是否正確咳促,然后試圖打開文件涉及的配置:nginx -t
[plain] view plain copy
- [root@localhost sbin]# ./nginx -t
- nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
- nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
5稚新、查看nginx版本信息: nginx -v
[plain] view plain copy
- [root@songguoliang sbin]# ./nginx -v
- nginx version: nginx/1.10.1
6、查看nginx版本信息跪腹,編譯版本褂删,和配置參數(shù):nginx -V
[plain] view plain copy
- [root@songguoliang sbin]# ./nginx -V
- nginx version: nginx/1.10.1
- built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
- configure arguments: --prefix=/usr/local/nginx
7、重啟日志文件冲茸,備份日志文件時(shí)常用:nginx -s reopen 或者 kill -USR1 主進(jìn)程號(hào)
[plain] view plain copy
- [root@localhost sbin]# ./nginx -s reopen
或者
[plain] view plain copy
- [root@localhost sbin]# kill -USR1 2030
由于nginx是通過inode指向日志文件的屯阀,inode和文件名無(wú)關(guān),所以即使把日志文件重命名轴术,nginx還是將日志文件寫入原文件难衰,只有用上面的命令重新開啟日志文件才能將日志寫入新的日志文件。
8膳音、nginx的平滑升級(jí)
如果你需要升級(jí)或者添加召衔、刪除服務(wù)器模塊時(shí),可以通過nginx的平滑升級(jí)祭陷,在不停止服務(wù)的情況下升級(jí)nginx。
(1)用新的nginx可執(zhí)行程序替換舊的可執(zhí)行程序趣席,即下載新的nginx兵志,重新編譯到舊版本的安裝路徑中(重新編譯之前可以備份舊的可執(zhí)行文件)
(2)給nginx主進(jìn)程號(hào)發(fā)送USR2信號(hào)
[plain] view plain copy
- [root@localhost sbin]# kill -USR2 9944
執(zhí)行命令前的進(jìn)程:
[plain] view plain copy
- [root@localhost sbin]# ps -ef |grep nginx
- root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
- nobody 9965 9944 0 13:29 ? 00:00:00 nginx: worker process
- root 10010 9917 0 13:42 pts/1 00:00:00 grep nginx
執(zhí)行命令后的進(jìn)程:
[plain] view plain copy
- [root@localhost sbin]# ps -ef |grep nginx
- root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
- nobody 9965 9944 0 13:29 ? 00:00:00 nginx: worker process
- root 10012 9944 0 13:43 ? 00:00:00 nginx: master process ./nginx
- nobody 10013 10012 0 13:43 ? 00:00:00 nginx: worker process
- root 10015 9917 0 13:43 pts/1 00:00:00 grep nginx
給nginx發(fā)送USR2信號(hào)后,nginx會(huì)將logs/nginx.pid文件重命名為nginx.pid.oldbin宣肚,然后用新的可執(zhí)行文件啟動(dòng)一個(gè)新的nginx主進(jìn)程和對(duì)應(yīng)的工作進(jìn)程想罕,并新建一個(gè)新的nginx.pid保存新的主進(jìn)程號(hào)
[plain] view plain copy
- [root@songguoliang logs]# pwd
- /usr/local/nginx/logs
- [root@songguoliang logs]# ll
- 總用量 16
- -rw-r--r--. 1 nobody root 596 10月 8 13:02 access.log
- -rw-r--r--. 1 nobody root 881 10月 8 13:43 error.log
- -rw-r--r--. 1 root root 6 10月 8 13:43 nginx.pid
- -rw-r--r--. 1 root root 5 10月 8 13:22 nginx.pid.oldbin
- [root@songguoliang logs]# cat nginx.pid
- 10012
- [root@songguoliang logs]# cat nginx.pid.oldbin
- 9944
這時(shí),nginx的新的實(shí)例和舊的實(shí)例同時(shí)工作霉涨,共同處理請(qǐng)求連接按价。接下來(lái)要關(guān)閉舊的實(shí)例進(jìn)程。
(3)給舊的主進(jìn)程發(fā)送WINCH信號(hào)笙瑟,kill -WINCH 舊的主進(jìn)程號(hào)
[plain] view plain copy
- [root@localhost sbin]# ps -ef |grep nginx
- root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
- nobody 9965 9944 0 13:29 ? 00:00:00 nginx: worker process
- root 10012 9944 0 13:43 ? 00:00:00 nginx: master process ./nginx
- nobody 10013 10012 0 13:43 ? 00:00:00 nginx: worker process
- root 10092 9917 0 14:05 pts/1 00:00:00 grep nginx
- [root@localhost sbin]# kill -WINCH 9944
- [root@localhost sbin]#
- [root@localhost sbin]#
- [root@localhost sbin]#
- [root@localhost sbin]# ps -ef |grep nginx
- root 9944 1 0 13:22 ? 00:00:00 nginx: master process ./nginx
- root 10012 9944 0 13:43 ? 00:00:00 nginx: master process ./nginx
- nobody 10013 10012 0 13:43 ? 00:00:00 nginx: worker process
- root 10094 9917 0 14:06 pts/1 00:00:00 grep nginx
舊的主進(jìn)程號(hào)收到WINCH信號(hào)后楼镐,將舊進(jìn)程號(hào)管理的舊的工作進(jìn)程優(yōu)雅的關(guān)閉。即一段時(shí)間后舊的工作進(jìn)程全部關(guān)閉往枷,只有新的工作進(jìn)程在處理請(qǐng)求連接框产。這時(shí)凄杯,依然可以恢復(fù)到舊的進(jìn)程服務(wù),因?yàn)榕f的進(jìn)程的監(jiān)聽socket還未停止秉宿。
(4)給舊的主進(jìn)程發(fā)送QUIT信號(hào)戒突,使其關(guān)閉。
[plain] view plain copy
- [root@localhost sbin]# kill -QUIT 9944
- [root@localhost sbin]# ps -ef |grep nginx
- root 10012 1 0 13:43 ? 00:00:00 nginx: master process ./nginx
- nobody 10013 10012 0 13:43 ? 00:00:00 nginx: worker process
- root 10118 9917 0 14:16 pts/1 00:00:00 grep nginx
給舊的主進(jìn)程發(fā)送QUIT信號(hào)后描睦,舊的主進(jìn)程退出膊存,并移除logs/nginx.pid.oldbin文件,nginx的升級(jí)完成忱叭。
中途停止升級(jí)膝舅,回滾到舊的nginx
在步驟(3)時(shí),如果想回到舊的nginx不再升級(jí)
(1)給舊的主進(jìn)程號(hào)發(fā)送HUP命令窑多,此時(shí)nginx不重新讀取配置文件的情況下重新啟動(dòng)舊主進(jìn)程的工作進(jìn)程仍稀。
[plain] view plain copy
- [root@localhost sbin]# kill -HUP 9944
(2)優(yōu)雅的關(guān)閉新的主進(jìn)程
[plain] view plain copy
- [root@localhost sbin]# kill -QUIT 10012
注:如果由于某種原因,無(wú)法關(guān)閉新主進(jìn)程的工作進(jìn)程埂息,直接給進(jìn)程號(hào)發(fā)送KILL信號(hào)
nginx的進(jìn)程分為主進(jìn)程和工作進(jìn)程技潘,關(guān)于nginx的信號(hào),主進(jìn)程支持以下信號(hào):
TERM千康,INT 快速關(guān)閉
QUIT 優(yōu)雅的關(guān)閉
KILL 關(guān)閉一個(gè)頑固進(jìn)程
HUP 改變配置享幽,使用新配置開啟新的工作進(jìn)程,優(yōu)雅的關(guān)閉舊的進(jìn)程
USR1 重新開啟日志文件
USR2 平滑升級(jí)nginx
WINCH 優(yōu)雅的關(guān)閉工作進(jìn)程
單個(gè)工作進(jìn)程也可以通過信號(hào)控制拾弃,但它不是必須的值桩。單個(gè)工作進(jìn)程支持的信號(hào)有:
TERM,INT 快速關(guān)閉
QUIT 優(yōu)雅的關(guān)閉
USR1 重新開啟日志文件
WINCH 異常終止調(diào)試(需要啟動(dòng)debug_points)