当你启动nginx以后,使用ps命令查看nginx进程, 会发现nginx进程不只有一个,默认情况下, 你会看到至少两个nginx进程,如下
Master进程:master进程负责管理worker进程,并负责读取配置文件和判断文件语法的工作;是主进程,有且只有一个。
Worker进程:worker进程有多个,它负责处理请求;worker的进程数量由管理员自己定义;编译安装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 ~]#
[root@server1 ~]# vim /usr/local/nginx/conf/nginx.conf
[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 ~]#
在/usr/local/nginx/conf/nginx.conf中定义worker_processes(worker进程数)
worker_processes 1;意思是nginx启动后,worker进程只有一个,如果想有多个,可以自己改动,但不能超过机器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/conf/nginx.conf
[root@server1 ~]# nginx -s reload
nginx: [alert] kill(2120, 1) failed (3: No such process)
[root@server1 ~]# nginx
[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;