nginx模型

来源:互联网 发布:管理自己的淘宝店铺 编辑:程序博客网 时间:2024/06/03 21:52

nginx

nginx工作模型,nginx服务起来后,ps下看到有master+N个worker进行工作,

ps aux|grep nginxork      1846  0.0  0.3 80100 27632 ?       S    Aug03   3:02 nginx: worker processwork      4311  0.0  0.1 46728 12032 ?       Ss   Jul19   0:00 nginx: master process /home/work/nginx/sbin/nginx -p /home/work/nginx -c /home/work/nginx/conf/nginx.confwork      4312  0.0  0.3 66360 32356 ?       S    Jul19  16:19 nginx: worker processwork      4313  0.0  0.3 66360 32368 ?       S    Jul19  18:34 nginx: worker processwork      4314  0.0  0.3 66360 32372 ?       S    Jul19  18:09 nginx: worker processwork      4315  0.0  0.3 66360 32388 ?       S    Jul19  17:29 nginx: worker processwork      4316  0.0  0.3 66360 32388 ?       S    Jul19  17:40 nginx: worker processwork      4317  0.0  0.3 66360 32368 ?       S    Jul19  17:23 nginx: worker process

#

在工作方式上,Nginx分为单工作进程和多工作进程两种模式。在单工作进程模式下,除主进程外,还有一个工作进程,工作进程是单线程的;在多工作进程模式下,每个工作进程包含多个线程。Nginx默认为单工作进程模式。

Nginx在启动后,会有一个master进程和多个worker进程。

master进程

主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

我们要控制nginx,只需要通过kill向master进程发送信号就行了。比如kill -HUP pid,则是告诉nginx,从容地重启nginx,我们一般用这个信号来重启nginx,或重新加载配置,因为是从容地重启,因此服务是不中断的。master进程在接收到HUP信号后是怎么做的呢?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以光荣退休了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。比如,./nginx -s reload,就是来重启nginx,./nginx -s stop,就是来停止nginx的运行。如何做到的呢?我们还是拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。

worker进程:

而基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的。

worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

nginx的进程模型,可以由下图来表示:

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 分数的混合运算题80道 分数题 和田玉分几种料 翡翠料分哪几种 分料机 石料筛分机 分时线怎么看 分时线图基础知识 分时图指标公式 分时图抓涨停 分时图怎么看 分时图指标 股票分时图 主力出货分时图 分时图战法 怎么看分时图 图解分时图 期货分时图买卖点 股票分时图买卖技巧 如何看分时图炒短线 筹码图怎么看 日线图怎么看 同花顺分时均价线 分时均线 分时线买卖技巧 分时均价线选股 均量线 国际股市指数行情 股市的线条怎样看的 国考题型题量分布分值 尿量小时分叉 雅思8分相当于单词量多少 抑郁自评量表总分超过多少分 分期宝 购分期 手机分期付款商城 分期买手机首付多少 哪里可以0首付分期手机 分期支付 西安手机分期 网上买手机分期付款怎么办理