一、Nginx信号机制说明
nginx是通过master进程和worker进程提供服务的。master进程主要用来监控worker进程工作状态进行相应重 启、停止等操作。
worker进程则进行具体提供服务,接受请求和处理请求。那么既然提到master监听worker进程,就势必用到进 程间通信。常见的进程 间通信也无非那几种方式,内存,消息队列,socket,信号等。在nginx中是采用了共 享内存,socket与信号三种方式。
在master和worker进程之间的通信则是通过套接字对的方式。而我们和nginx之间通信的方式则采用信号方式。 在使用nginx过程中,我们可以直接通信的就是只有master进程,对于worker进程我们除了可以决 定其个数之外是无法直接控制worker进程 的。唯一控制worker进程的方式就是通过向master进程发出相应的信 号,master进程通过不同的信号来对worker进程进行控制,依此 种方式达到我们控制worker进程。
二、Nginx支持的信号种类
类型 | 描述 |
---|---|
TERM | INT | 快速关闭 |
QUIT | 从容关闭 |
HUP | 平滑重启,重新加载配置文件 |
USR1 | 重新打开日志文件,主要用于日志文件的分割 |
USR2 | 平滑升级可执行程序 |
WINCH | 从容关闭工作进程 |
三、如何向master进程发送信号
有两种发送信号方式:一种利用系统kill命令,一种是nginx命令。
1. kill -s SIG nginx_pid
# 如:重新加载nginx配置文件而不重新启动服务
shell> kill -s HUP `cat /var/run/nginx.pid`
2.nginx -s SIG
-s 支持的信号为:
stop SIGTERM
quit SIGQUIT
reopen SIGUSR1
reload SIGHUP
示例:
shell> nginx -s stop
shell> nginx -s reload
四、信号的应用
1. 启动nginx
# 说明:-c 指定配置文件运行nginx,若不指定配置文件,则会默认加载安装目录的conf子目录的nginx.conf文件
shell> nginx -c /path/to/conf
2. 停止nginx
2.1 快速停止nginx
# 说明:直接向nginx主进程发送停止信号,通过进程pid文件可直接查询pid号
[root@localhost ~]# kill -TERM|INT `cat /path/to/nginx.pid`
2.2 从容停止nginx
[root@localhost ~]# kill -QUIT `cat /path/to/nginx.pid`
3. 平滑重启nginx
若修改配置文件想重启nginx服务重新加载配置文件,则可以向nginx主进程发送HUP信号,当nginx主进程接收到信号以后,会先解析配置文件,如果成功,就应用新的配置文件。nginx 运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字,但是继续为当前连接的客户提供服务。所有的客户端的服务完成后,旧的工作进程被关闭。如果新的配置文件应用失败,nginx 将继续使用旧的配置文件进行工作。
3.1 重启服务前应先检查配置文件是否正确
# -t 参数用于检查配置文件语法是否正确
[root@localhost ~]# nginx -t -c /path/to/nginx.conf
3.2 平滑重启命令
[root@localhost ~]# kill -HUP `cat /path/to/nginx.pid`
4. nginx 的平滑升级
当需要将正在运行中的 nginx 升级、添加/删除服务器模块时,在不中断服务的情况下,使用新版本重新编译的 nginx 可执行程序替换旧版本的可执行程序。
步骤一:使用新的可执行程序替换旧的可执行程序,对于编译安装的 nginx,可以将新版本编译安装到旧版本的 nginx 安装路径中。替换之前,最好备份一下旧的可执行文件。
步骤二: 向nginx主程序发送USR2指令
[root@localhost ~]# kill -USR2 `cat /path/to/nginx.pid`
步骤三:旧版本 nginx 的主进程将重命名它的 pid 文件为 .oldbin(例如:/var/run/nginx.pid.oldbin),然后执行新版本的 nginx 可执行程序,依次启动新的主进程和新的工作进程。
步骤四:此时,新、旧版本的 nginx 实例会同时运行,共同处理输入的请求。要逐步停止旧版本的 nginx 实例,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭:
[root@localhost ~]# kill -WINCH `cat /path/to/nginx.pid.oldpid`
步骤五: 一段时间后,旧的工作进程(worker process)处理了所有已连接的请求后退出,仅由新的工作进程来处理输入的请求了。
步骤六:这时候,可以决定是使用新版本,还是恢复到旧版本:
- kill -HUP 【旧的主进程号】:nginx 将在不重载配置文件的情况下启动它的工作进程
- kill -QUIT 【新的主进程号】:从容关闭其工作进程(worker process)
- kill -TERM 【新的主进程号】:强制退出
- kill 【新的主进程号或旧的主进程号】:如果因为某些原因新的工作进程不能退出,则向其发送 kill 信号
步骤七: 新的主进程退出后,旧的主进程会移除 .oldbin 后缀,恢复为它 的 .pid 文件,这样,一切就恢复到升级之前了。如果尝试升级成功,希望保留新的服务器时,可发送 QUIT 信号给旧的主进程,使其退出而只留下新的服务器运行。