Loading... <blockquote>博主会将与Nginx有关的知识点总结到”<a title="Nginx由浅入深短篇系列" href="https://www.zsythink.net/archives/tag/nginx/" target="_blank" rel="noopener">nginx短篇系列</a>“文章中,如果你对nginx不是特别了解,请按照顺序阅读”nginx短篇系列”,以便站在前文的基础上理解新的知识点。</blockquote> 当你启动nginx以后,使用ps命令查看nginx进程,会发现nginx进程不只有一个,默认情况下,你会看到至少两个nginx进程,如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-c0"># ps -ef | grep nginx</span></div> </div> <div class=""> <div><span class="enlighter-text">root </span><span class="enlighter-n1">1674</span> <span class="enlighter-n1">1</span> <span class="enlighter-n1">0</span> <span class="enlighter-n1">15</span><span class="enlighter-text">:</span><span class="enlighter-n1">49</span><span class="enlighter-text"> ? </span><span class="enlighter-n4">00</span><span class="enlighter-text">:</span><span class="enlighter-n4">00</span><span class="enlighter-text">:</span><span class="enlighter-n4">00</span><span class="enlighter-text"> nginx: master process nginx</span></div> </div> <div class=""> <div><span class="enlighter-text">nobody </span><span class="enlighter-n1">1675</span> <span class="enlighter-n1">1674</span> <span class="enlighter-n1">0</span> <span class="enlighter-n1">15</span><span class="enlighter-text">:</span><span class="enlighter-n1">49</span><span class="enlighter-text"> ? </span><span class="enlighter-n4">00</span><span class="enlighter-text">:</span><span class="enlighter-n4">00</span><span class="enlighter-text">:</span><span class="enlighter-n4">00</span><span class="enlighter-text"> nginx: worker process</span></div> </div> <div class=""> <div><span class="enlighter-text">root </span><span class="enlighter-n1">1678</span> <span class="enlighter-n1">1630</span> <span class="enlighter-n1">0</span> <span class="enlighter-n1">15</span><span class="enlighter-text">:</span><span class="enlighter-n1">49</span><span class="enlighter-text"> pts/</span><span class="enlighter-n1">0</span> <span class="enlighter-n4">00</span><span class="enlighter-text">:</span><span class="enlighter-n4">00</span><span class="enlighter-text">:</span><span class="enlighter-n4">00</span><span class="enlighter-text"> grep --color=auto nginx</span></div> </div> </div> </div> 从上述结果可以看出,当我启动nginx以后,有两个nginx进程,一个master进程,一个worker进程,这两个nginx进程都有各自的作用,见名知意,”worker”进程天生就是来”干活”的,真正负责处理请求的进程就是你看到的”worker”进程,那么”master”进程有什么用呢?”master”进程其实是负责管理”worker”进程的,除了管理”worker”进程, “master”进程还负责读取配置文件、判断配置文件语法的工作,”master进程”也叫”主进程”, 在nginx中,”master”进程只能有一个,而”worker”进程可以有多个,”worker”进程的数量可以由管理员自己进行定义,那么怎么定义”worker”进程的数量呢?没错,我们只需要借助一条配置指令即可,这条配置指令就是”worker_processes”指令。 如果你和我一样,编译安装了nginx,你会发现,默认的nginx.conf配置文件中有这样一条配置。 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">worker_processes </span><span class="enlighter-n1">1</span><span class="enlighter-text">;</span></div> </div> </div> </div> 没错,上述配置的意思就是启动nginx后只有1个worker进程,你想要多少个worker进程,将worker_processe指令的值设置成多少就好了,非常简单,worker_processes指令只能在main区域中使用,通常情况下,worker_processes的值通常不会大于服务器中cpu的核心数量,换句话说就是,worker进程的数量通常与服务器有多少cpu核心有关,比如,nginx所在主机拥有4核cpu,那么worker_processes的值通常不会大于4,这样做的原因是为了尽量让每个worker进程都有一个cpu可以使用,尽量避免了多个worker进程抢占同一个cpu的情况,当然,你想要的在4核的机器上将worker_processes的值设置为8,也是完全可行的。除了某个具体的数字,我们也可以将worker_processes的值设置为”auto”,如下 <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">worker_processes auto;</span></div> </div> </div> </div> 当worker_processes的值为auto时,nginx会自动检测当前主机的cpu核心数量,并启动对应数量的worker进程,比如,nginx检测到当前主机一共有4个cpu核心,那么nginx就会启动4个worker进程,如果你是通过编译的方式安装的nginx,或者通过官方yum源安装的nginx,那么worker_processes的默认值为1,如果你是通过阿里的yum源安装的nginx,那么默认的nginx.conf中,worker_processes的值通常是auto 同时,为了避免cpu在切换进程时产生性能损耗,我们也可以将worker进程与cpu核心进行”绑定”,当worker进程与cpu核心绑定以后,worker进程可以更好的专注的使用某个cpu核心上的缓存,从而减少因为cpu切换不同worker进程而带来的缓存失效,如果想要让worker进程与某个cpu核心绑定,则需要借助另外一个配置指令,它就是”worker_cpu_affinity”指令。 那么”worker_cpu_affinity”指令怎样使用呢?先别急,想要搞明白怎样使用”worker_cpu_affinity”指令,最好先来了解一个概念,这个概念就是”cpu掩码”,我们可以通过”cpu掩码”表示某个cpu核心,比如,当前机器上一共有4个cpu核心,那么我们就用4个0表示这4个核,也就是说,我们可以使用如下字符表示这4个核: 0000 那么第一个核就用如下字符表示 0001 第二个核就用如下字符表示 0010 第三个核就用如下字符表示 0100 第四个和就用如下字符表示 1000 没错,你一定已经发现了对应的规律,规律就是,有几个核,就用几个0表示,如果想要使用某个核,就将对应位置的0改成1,位置从右边开始,比如,如果有8个核,我就可以使用如下字符表示这8个核中的第二个核: 00000010 上述表示法就是所谓的”cpu掩码”,好了,聊完cpu掩码,再来理解”worker_cpu_affinity”指令就容易多了。 假如当前主机一共有两个cpu核心,我想要启动两个worker进程,并且将这两个worker进程分别绑定到两个核心上,那么我就可以通过如下两条配置指令完成上述设置: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">worker_processes </span><span class="enlighter-n1">2</span><span class="enlighter-text">;</span></div> </div> <div class=""> <div><span class="enlighter-text">worker_cpu_affinity </span><span class="enlighter-n4">01</span> <span class="enlighter-n1">10</span><span class="enlighter-text">;</span></div> </div> </div> </div> 上述设置表示启动2个worker进程,分别绑定到”01″核”与”10″核上。 除了使用cpu掩码绑定cpu,你也可以将worker_cpu_affinity指令的值设置为”auto”,当worker_cpu_affinity的值为auto时,nginx会自动将worker进程平均的绑定到可用的核心上,而不用你进行手动的设置,如果你的worker进程数量大于cpu核心的数量,我觉得将worker_cpu_affinity指令的值设置为auto是非常好的选择。 worker_cpu_affinity指令与worker_processes指令一样,只能在main上下文中使用。 细心如你一定发现了,编译安装nginx后,默认情况下worker进程是以”nobody”用户的身份运行的,如果我们想要指定worker进程的运行用户,则可以使用”user”指令,比如,指定worker进程以nginx用户的身份运行,配置如下: <div class="enlighter-default enlighter-v-standard enlighter-t-enlighter enlighter-hover enlighter-overflow-scroll"> <div class="enlighter-toolbar"> <div class="enlighter-btn enlighter-btn-raw"></div> <div class="enlighter-btn enlighter-btn-copy"></div> <div class="enlighter-btn enlighter-btn-window"></div> </div> <div class="enlighter"> <div class=""> <div><span class="enlighter-text">user nginx;</span></div> </div> </div> </div> user配置指令也只能在main上下文中使用。 到目前为止,我们已经可以直观的看到master进程和worker进程两种nginx进程,其实,除了master进程和worker进程,nginx中还有”cache manager”进程和”cache loader”进程,这两个进程也是受master进程管理的,现在我们并没有看到这两个进程,当nginx作为反向代理服务并且开启缓存功能时,我们就能看到这两个进程,”cache manager”进程和”cache loader”进程负责管理和加载缓存,缓存被多个worker进程共享使用,相关具体的操作等到用时再行总结吧。 关于nginx的进程类型就先初步的总结到这里,希望能够对你有所帮助。 转载自朱双印日志https://www.zsythink.net/archives/3226 Last modification:May 29, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏