Nginx服务器在使用Master-Worker模型时,会涉及到三类通信:Linux系统与Nginx通信,Master进程与Worker进程通信,Worker进程间通信,也采用了三种不同的通信机制。
Linux信号
Linux 系统与Nginx是通过信号进行通信的,例如在Linux命令行敲下 ./nginx -s stop ,实际系统会新开一个Master进程,该进程负责向原Master发送信号,发送完信号该进程就挂了,原Master进程接收到信号后执行相应的操作。
1.信号定义与注册
Nginx定义了一个ngx_signal_t结构体用于描述接收到信号的行为
typedef struct { //signals
int signo; //需要处理的信号
char *signame; //信号对应的字符串名称
char *name; //这个信号对应着的Nginx命令
void (*handler)(int signo); //收到signo信号后就会回调handler方法
} ngx_signal_t;
Nginx在启动时会调用ngx_init_signals函数,该函数通过sigaction系统调用初始化所有信号,并注册相应的信号处理函数。完成所有初始化工作后,Master进程调用ngx_master_process_cycle函数进入自身事件循环,负责监听信号,一旦收到信号后,执行对应信号处理函数。
ngx_int_t ngx_init_signals(ngx_log_t *log)
{
ngx_signal_t *sig;
struct sigaction sa;
for (sig = signals; sig->signo != 0; sig++) {
ngx_memzero(&sa, sizeof(struct sigaction));
sa.sa_handler = sig->handler;
sigemptyset(&sa.sa_mask);
if (sigaction(sig->signo, &sa, NULL) == -1) {
#if (NGX_VALGRIND)
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
"sigaction(%s) failed, ignored", sig->signame);
#else
ngx_log_erro