关于Nginx的认知

    作为一位PHP应该很清楚的知道,PHP的搭档:Nginx,一直以来对于Nginx的了解仅仅都是呈现在它能够有效的解决高并发的问题,但是对于他如何去实现,一直都没有怎么去关注。直到请教了一些大牛然后加上百度了一些资料才有了点大致的了解。

首先需要了解到的是Nginx相对于PHP来说,他是专门用来接收用户通过浏览器发送过来的请求,如果这样说不理解的话,就打个比方,如果,PHP+Nginx+mysql+一系列需要用到的东西是一个公司的话,那Nginx就是一个前台,专门用来接待上门的客户的。这样是不是可以理解了呢?

但是从实际意义上来说,仅仅把它比作一个前台似乎有点贬低了他的能力。接下来就大致说一下Nginx的它是怎么工作的。

首先用户通过浏览器访问服务器,Nginx接收到发过来的请求,进行的三次握手,然后沟通成功。由于Nginx他一直在后台开着,所以他拥有一个master主进程和多个woker进程(也被叫做子进程),至于worker进程的数量,就需要看nginx.conf的配置了


woker进程数

当然这个进程数也不是随意配置,是需要根据你服务器的配置来设定的,如果你的服务器是双核4线程的,那一般就设置为4。至于为什么需要设置为4,我个人认为,服务器是双核4线程,workr_process设置为4,那当出现高并发的情况下,4个woker进程能分配到服务器的4个线程中,这样就能充分的利用服务器的资源,就好比一台服务器是一条马路,然后这条马路合理的分配成4条道路,然后呢,woker进程就好比是车一样,当早晚高峰的时候,4条道就会有4个通道用来有效的解决早晚高峰的问题,如果你设置为3,那就相当于车辆只能在3条道上使用,还有一条道是空着的,这样对于这条路的利用率就只有3/4,没有完全利用,当然这只是我个人的理解,如果哪个大牛觉得我说的有问题,真心希望能留个言帮忙好好解释一下。


Nginx启动以后的进程

针对于Nginx的master进程他的作用:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。所以他是不负责业务的,说白了就是一个纯粹的前台。

着重需要了解的就是woker进程,nginx启动的时候,会开启一个master进程,然后通过socket() 来创建一个 sock 文件描述符用来监听,接着就会fock出woker进程,每个woker进程都是独立的,就好比一个公司的每个部门一样。

当一个用户请求过来的时候,主进程就会把这个请求扔给woker进程,然后呢,会出现woker进程开始争抢这个请求,这种现象官方话来说就是:惊群现象,针对于这个现象,Nginx有了有效的解决方式,Nginx 提供了一个 accept_mutex 这个东西,这是一个加在accept上的一把共享锁。即每个 worker 进程在执行 accept 之前都需要先获取锁,获取不到就放弃执行 accept()。有了这把锁之后,同一时刻,就只会有一个进程去 accpet(),这样就不会有惊群问题了。accept_mutex 是一个可控选项,我们可以显示地关掉,默认是打开的。

当某个woker进程抢到了这个请求以后接下去就开始连着php-fpm 和php 开始搞事情了。具体怎么搞,下章再说