1.整体架构
Nginx最基本的就是master进程和worker进程,还有可能会有Cache相关进程。这些进程之间会相互通信。Nginx还有强大的功能模块:比如upstream与后端Web服务器通信、fastcgi与后端应用服务器通信等。完整的整体框架如图所示:
2.master进程
Nginx的主进程充当master进程,而由master进程fork()出来的子进程则充当worker进程。
master进程不会对用户请求提供服务,只用于管理真正提供服务的worker进程。当任意一个worker进程出项错误而意外退出时,master进程会立刻启动新的worker进程继续服务。
Nginx的master进程的ngx_master_process_cycle()函数是主要的入口,该函数做完信号处理设置等之后就会调用一个名为ngx_start_worker_processes()的函数用于fork()产生出子进程。然后程序会进入一个for(;;)的无限循环中。在for(;;)循环中有一个关键的sigsuspend()函数调用,该函数会使得master进程阻塞在这里,直到收到信号为止。然后根据收到的信号而设置需要的处理。
void
ngx_master_process_cycle(ngx_cycle_t *cycle)
{
//信号处理设置等操作
.......
//产生worker工作进程
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
ngx_start_cache_manager_processes(cycle, 0);
....
for ( ;; )
{
.....
//进程会阻塞在这里,直到收到信号为止
sigsuspend(&set);
......
//有子进程退出
if (ngx_reap) {
ngx_reap = 0;
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "reap children");
live = ngx_reap_children(cycle);
if (!(live & NGX_PIPE_STILL_NEEDED) && close_old_pipe) {
ngx_close_old_pipes();
close_old_pipe = 0;
}
}
if (!live && (ngx_terminate || ngx_quit))
{
ngx_master_process_exit(cycle);
}
//粗暴的结束Nginx
if (ngx_terminate)
{
.....
}
//优雅的结束Nginx
if (ngx_quit) {
}
if (ngx_reconfigure) {
........
}
//重新启动Nginx
if (ngx_restart) {
ngx_restart = 0;
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
ngx_start_cache_manager_processes(cycle, 0);
#if (NGX_PROCS)
ngx_procs_start(cycle, 0);
#endif
live = 1;
}
.......
}
}
3.worker进程
多个worker进程处理互联网请求可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是可以充分利用多核架构,实现微观上真正的多核并发处理。Nginx默认设置的worker进程数和CPU核心数量一致。与Apache的比较:
在Apache上每个进程在一个时刻只处理一个请求,因此如果希望Web服务器拥有并发处理的请求数更多,就要把Apache的进程或线程设置的更多,通常会达到一台服务器上拥有几百个工作进程,这样大量的进程间切换将带来大量的系统资源消耗。
而Nginx一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制。因此,当Nginx上的worker进程数与CPU核心数相等时,进程切换的代价最小。
worker进程的主要执行函数ngx_worker_process_cycle()函数,该函数主体也是一个无限for(;;)循环,持续不断的处理客户端的服务请求。worker进程的主要工作就是与客户端或后端真实服务器之间的数据的I/O交互事件,所以worker进程阻塞点在select()、epoll_wait()等这样的I/O多路复用函数调用上。
static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
....
for ( ;; ) {
if (ngx_exiting)
{
.....
}
....
//该函数会调用事件监控函数,如epoll_wait()
ngx_process_events_and_timers(cycle);
if (ngx_terminate)
{
.....
}
if (ngx_quit)
{
....
}
if (ngx_reopen)
{
....
}
}
}
Nginx采用master-worker架构,master进程管理worker进程,不直接处理请求;worker进程负责处理请求,数量默认等于CPU核心数,实现并发处理。当worker进程出错,master进程将重启新的worker。相比Apache,Nginx的worker进程能处理更多并发请求,且切换代价小。
3226

被折叠的 条评论
为什么被折叠?



