Nginx学习笔记之使用信号管理Nginx的父子进程

声明:图片来自  github:https://github.com/russelltao/geektime-nginx 

使用信号管理Nginx的父子进程


  • Nginx是一个多进程的程序,多进程之间进行通信可以使用共享内存,信号等。
  • 在做进程间的管理时,通常只使用信号。
  • 能够发送和处理信号的有Master进程,Worker进程,还有Nginx命令行。


  • Master进程
    • 因为master进程可以启动worker进程,所以它管理worker进程的方式首先是监控worker进程有没有发送CHLD信号。因为linux操作系统规定,当子进程终止的时候,会向父进程发送CHLD信号。所以,如果worker进程一些模块出现了一些bug导致worker进程意外地终止掉,master进程可以立刻通过CHLD发现这样一个事件,然后重新把worker进程拉起。
    • mater进程还可以接收一些信号来管理worker进程。可以接收的信号有
      • TERMINT  表示立刻停止nginx进程
      • QUIT 优雅地停止nginx进程(可以慢慢地停,对用户不要发送立刻结束连接,像TCP的reset请求这样的报文)
      • HUP  表示重载配置文件
      • USR1 重新打开日志文件,做日志文件的切割
    • 上面四个信号可以通过使用nginx命令行加特定的命令直接向master进程发送的。
    • 下面的信号只能通过kill 这样的linux的命令行直接向master进程发送信号。所以我们得先找到master进程的PID,对这个PID直接发送USR2和WINCH。这两个信号专门做热部署时使用。

  • Worker进程
    • 通常我们不直接向worker进程发送信号,我们希望由master进程来管理worker进程。所以直接向worker进程发送信号,也会产生同样的结果。但通常我们不这样做,往往是对master进程进行管理,master进程收到信号以后,在把信号发送该worker进程

  • Nginx命令行
    • 当我们启动了Nginx以后,Nginx会把它的PID记到一个文件中,通常是记录到安装目录下的logs文件夹下的一个nginx pid文件中,这个pid文件中会记录master进程pid。
      • 当我们再次执行 nginx -s 命令行的时候,那么nginx工具命令行会去读取pid文件中的master进程 的 pid,向这个pid同样的发送 HUP USR1 TERM QUIT这样的信号。
    • 其实,调用nginx的命令行发送相应的命令,和直接使用 kill 去发送信号效果是一样的

猜你喜欢

转载自blog.csdn.net/baidu_41388533/article/details/106886106