简介
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是否有变,如果变了则直接退出