您的位置:首页 > 运维架构 > Nginx

进程模型--nginx

2013-04-27 12:38 316 查看
1、初始化

ssl

数据结构

时间,log,crc表,

系统检测,设置handler和获取系统信息(如cpu,rlimit),random初始化

如果是新bin的子进程,接管父进程的socket等信息

pid file

信号量处理

忽略

SIGSYS

SIGPIPE

SIGIO

退出

SIGQUIT

结束

SIGINT

SIGTERM

刷新配置

SIGHUP

重新打开日志

SIGUSR1

结束Accept

SIGWINCH

升级nginx/退出重新启动

SIGXCPU

定时器

SIGALRM //用于退出,如果超过1秒不退出,就对子进程发KILL信号,否则发TERM

重启子进程

SIGCHLD ///////忽略SIGCHLD信号,常作为提高并发服务器性能的一个技巧。因为并发服务器可能fork很多子进程,子进程终结后需要服务器进程wait子进程并清理资源。如果将该信号忽略,可使内核把僵尸子进程交给init进程处理,节省大量僵尸子进程占用的系统资源。

2、Master处理

初始化信号量

启动工作进程

启动缓存管理进程

进入主循环等待信号,对信号量的进行调用相应的控制动作

3. 子进程处理

初始化

读配置

sertrlimit

切换用户

设置CPU亲缘性

模块初始化

通知通道初始化

父对子进程的命令控制通过socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel)的socket

setproctitle

线程初始化

主循环

cond_wait(ngx_posted_events_mutex)

ngx_event_thread_process_posted

子进程进入主循环

对控制标志位对线程进行相应控制动作

ngx_process_events_and_timers

ngx_accept_mutex

ngx_event_process_posted(cycle, &ngx_posted_accept_events);

if (ngx_threaded) {

ngx_wakeup_worker_thread(cycle);

} else {

ngx_event_process_posted(cycle, &ngx_posted_events);

}

PS:

Nginx和apache一样,通过mutex保证只有一个子进程在accept。

而lighttpd多个子进程都会去监听,有惊群现象(EAGAIN),但是对性能影响不大
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: