简介

gunicorn是一遵守WSGI协议的web服务器, 其整体架构是Master/Workers模型。master进程通过信号机制管理worker进程;而实际的请求由worker进程处理,worker类型有多种(sync, gevent, asycnio, tornado…)可通过参数指定。

信号处理

Master
  • CHLD(子进程退出事发给父进程): 通过os.waitpid得异常pid并pop出woker队列,关闭改woker.tmp
  • HUP(重载workers): 更新配置,新建linsener,新建workers, 给旧wokers发TERM信号
  • QUIT(停止): 给wokers发QUIT信号
  • INT: 同QUIT
  • TERM: 给wokers发TERM信号,gracefual_time之后发KILL信号
  • TTIN: num_workers += 1
  • TTOU: num_workers -=1
  • USR1: 重开logfile并给wokers发USR1信号
  • USR2: os.execvpe, 新启master/wokers, 新master是老master的子进程, 这个和HUP信号的区别在于会重新加载gunicorn,且旧workers不会退出
  • WINCH(窗口大小改变的信号): 针对gunicorn后台运行时,给所有woker发TERM信号,把worker数改为0
Workers
  • QUIT(停止): alive=False, sys.exit(0)
  • INT: 同QUIT
  • TERM: alive=False
  • USR1: 重开logfile
  • ABRT: alive=False,sys.exit(1)
  • WINCH: 忽略

监控

  • Master: 通过worker的tmpfile的st_ctime来判断子进程是否正常,如果为否则发送ABRT信号给对应子进程
  • Workers: worker会创建一个tmpfile,并一直刷新st_ctime; 同时ppid是否有变,如果变了则直接退出

参考