1、初始化
ssl
数据结构
时间,log,crc表,
系统检测,设置handler和获取系统信息(如cpu,rlimit),random初始化
如果是新bin的子进程,接管父进程的socket等信息
初始化信号量
启动工作进程
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);
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进程处理,节省大量僵尸子进程占用的系统资源。
初始化信号量
启动工作进程
启动缓存管理进程
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),但是对性能影响不大