详解nginx的master进程和worker进程
当你启动nginx以后,使⽤ps命令查看nginx进程, 会发现nginx进程不只有⼀个,默认情况下, 你会看到⾄少两个nginx进程,如下:
[root@server1 ~]# ps -ef |grep nginx |grep -v grep
root      2120    1  0 10:03 ?        00:00:00 nginx: master process nginx
nobody    2173  2120  0 10:30 ?        00:00:00 nginx: worker process
[root@server1 ~]#
编译安装nginx后,默认情况下worker进程是以"nobody"⽤户的⾝份运⾏的,如果我们想要指定worker进程的运⾏⽤户,则可以使⽤"user"指令,⽐如,指定worker进程以nginx⽤户的⾝份运⾏
[root@server1 ~]# useradd -u 900 nginx
[root@server1 ~]# id nginx
uid=900(nginx) gid=1001(nginx) groups=1001(nginx)
[root@server1 ~]#
user  nginx;
worker_processes  1;
[root@server1 ~]# vim /usr/local/nginx/f
[root@server1 ~]# nginx -s reload
[root@server1 ~]# ps -ef |grep nginx |grep -v grep
root      2120    1  0 10:03 ?        00:00:00 nginx: master process nginx
nginx    2206  2120  0 11:16 ?        00:00:00 nginx: worker process
[root@server1 ~]#
当我启动nginx以后,有两个nginx进程,⼀个master进程,⼀个worker进程,这两个nginx进程都有各⾃的作⽤,见名知意, "worker"进程天⽣就是来"⼲活"的,真正负责处理请求的进程就是你看到的"worker"进程,那么"master"进程有什么⽤呢? “master"进程其实是负责管理"worker"进程的,除了管理” worker"进程,master"进程还负责读取配置⽂件、判断配置⽂件语法的⼯作,“master进程"也叫"主进程”,在nginx中,"master"进程只能有⼀个,⽽"worker"进程可以有多个,worker"进程的数量可以由管理员⾃⼰进⾏定义,那么怎么定义"worker"进程的数量呢?
没错,我们只需要借助⼀条配置指令即可,
这条配指令就是"worker _processes"指令
默认的f配置⽂件中有这样⼀条配置
worker_ processes 1;
上述配置的意思就是启动nginx后只有1个worker进程,你想要多少个worker进程,将worker_ processe指令的值设置成多少就好了,⾮常简单, worker_ processes指令只能在main区域中使⽤,通常情况下,
worker_ processes的值通常不会⼤于服务器中cpu的核⼼数量,
换句话说就是,worker进程的数通常与服务器有多少
cpu核⼼有关,⽐如,nginx所在主机拥有4核cpu,那么worker_ processes的值通常不会⼤于4,这样做的原因是为了尽⼒让每个worker 进程都有⼀个cpu可以使⽤,尽量避免了多个worker进程抢占同⼀个cpu的情况,我们也可以将worker_ processes的值设置为"auto"
当worker_ processes的值为auto时,nginx会⾃动检测当前主机的cpu核⼼数,并启动对应数量的worker进程,⽐如,nginx检测到当前主机⼀共有4个cpu核⼼,那么nginx就会启动4个worker进程
user  nginx;
worker_processes  auto;
[root@server1 ~]# vim /usr/local/nginx/f
[root@server1 ~]# nginx -s reload
nginx: [alert] kill(2120, 1) failed (3: No such process)
[root@server1 ~]# nginx
grep命令查看进程
[root@server1 ~]# nginx -s reload
[root@server1 ~]# ps -ef | grep nginx |grep -v grep
root      2134    1  0 11:46 ?        00:00:00 nginx: master process nginx
nginx    2140  2134  0 11:46 ?        00:00:00 nginx: worker process
nginx    2141  2134  0 11:46 ?        00:00:00 nginx: worker process
nginx    2142  2134  0 11:46 ?        00:00:00 nginx: worker process
nginx    2143  2134  0 11:46 ?        00:00:00 nginx: worker process
[root@server1 ~]#
同时,为了避免cpu在切换进程时产⽣性能损耗,我们也可以将worker进程与cpu核⼼进⾏"绑定",当worker进程与cpu核⼼绑定以
后,worker进程可以更好的专注的使⽤某个cpu核⼼上的缓存,从⽽减少因为cpu切换不同worker进程⽽带来的缓存失效,如果想要让worker进程与某个cpu核⼼绑定,则需要借助另外⼀个配置指令,它就
是"worker_ cpu_ affinity"指令
想要搞明⽩怎样使⽤"worker_ cpu_ affinity" 指令,最好先来了解⼀个概念,这个概念就是"cpu掩码",我们可以通过"cpu掩码"表⽰某个cpu 核⼼,⽐如,当前机器上⼀共有4个cpu核⼼,那么我们就⽤4个0表⽰这4个核,也就是说,我们可以使⽤如下字符表⽰这4个核: 0000
那么第⼀个核就⽤如下字符表⽰
0001
第⼆个核就⽤如下字符表⽰
0010
第三个核就⽤如下字符表⽰
0100
规律就是,有⼏个核,就⽤⼏个0表⽰,如果想要使⽤某个核,就将对应位的0改成1,位从右边开始
⽐如,如果有8个核,我就可以使⽤如下字符表⽰这8个核中的第⼆个核:
00000010
user  nginx;
worker_processes  auto;
worker_cpu_affinity 1000 0100 0010 0001;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。