Nginx 信号量 [1]

Nginx信号控制官方链接:https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/

信号控制与进程管理

1. 启动Nginx

[root@localhost nginx]# sbin/nginx 
[root@localhost nginx]# ps -ef | grep nginx
root       1189      1  0 18:34 ?        00:00:00 nginx: master process sbin/nginx
nobody     1190   1189  0 18:34 ?        00:00:00 nginx: worker process
root       1192   1168  0 18:36 pts/0    00:00:00 grep --color=auto nginx

通过运行/usr/local/sbin目录下的nginx二进制文件启动Nginx服务,查看进程,发现有2个Nginx进程??
Nginx的工作方式:master是主进程文件,不直接响应客户端请求,它负责管理worker子进程的生命周期,子进程具体响应客户端请求。

Nginx启动还提供了多种选项:


Nginx启动选项

2. 关闭和重启Nginx

在Nginx启动后,可以再次执行nginx二进制文件配合-s参数发送信号给master进程,来控制Nginx服务,如

/usr/local/sbin/nginx -s stop

还可以直接发送信号量给Nginx的master进程来加以控制:


master进程控制

通过ps命令,很容易获取到Nginx的进程号。但每次执行命令前都去获取一次实在令人抓狂,有没有办法优化?Nginx其实在启动时将进程ID写入了文件,而文件的位置和读取方式是固定不变的,只是其中存储的进程ID值在每次进程启停后会发生变化。因此只要我们知道怎么读取文件,就能以一种不变的方式获取不断变化的进程ID。这个文件的位置位于:/usr/local/nginx/logs/nginx.pid,其中记录了master主进程的进程ID。

有了进程ID就可以使用"kill -9 进程号"命令杀掉进程,这是我们经常使用的手段。在Nginx的世界里,可以采用"kill TERM $( cat /usr/local/nginx/logs/nginx.pid )"来达到同样的效果。不过这种手法过于暴力,因为如果杀进程时客户正在购物下单,那么服务中断会直接导致业务终止。

Nginx有提供一种优雅的方式干掉进程

kill QUIT $( cat /usr/local/nginx/logs/nginx.pid )

如果用户正在下载,亦或是正在付钱,你通过优雅的杀死这种方式kill nginx进程,那么业务不会戛然而止,因为Nginx进程不会立刻被干掉,它会优先释放不在工作的worker进程,并且等到正在工作的worker进程结束手头的工作再kill掉该worker。

如果系统正常对外提供服务期间,修改了配置文件,并想让其立即生效怎么办?传统的方式是kill进程重启服务,业务短暂中断。Nginx提供了HUP信号量来处理上述场景。HUP命令会让新建的worker优雅的进行新陈代谢,新的worker被创建时,将读取到最新的配置文件。验证一把:

[root@localhost html]# cd /usr/local/nginx/html
[root@localhost html]# cp index.html test.html
[root@localhost html]# vi test.html   # 修改title为你喜欢的样子,保存退出
[root@localhost html]# vi /usr/local/nginx/conf/nginx.conf   # 在server - location - index节点下的index.html前面加上test.html,保存退出
[root@localhost html]# kill -HUP $(cat /usr/local/nginx/nginx.pid)

刷新Nginx访问地址,观察TITLE部分能看到配置已经生效:


Nginx配置文件热加载

日志切割USR1、平滑的升级USR2的使用方式略。

你可能感兴趣的:(Nginx 信号量 [1])