Nginx 反向代理实现高并发的具体步骤是什么?

采用异步非阻塞的事件处理机制。之所以能够并发处理大量的未处理完的请求,是通过异步非阻塞方式,由进程循环处理多个准备好的事件。以epoll为例,为准备好的事件都会放入epoll中,只要有事件准备好,就会进行处理。
多进程的工作模式(多个worker进程,每个worker进程都是单线程的)

Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程(一般设置成机器 cpu 核数,避免频繁切换上下文)
master 进程接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。

注:多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
具体步骤:(多进程(单线程) 和 多路IO复用模型epoll实现)
一个连接请求过来,每个进程都有可能处理这个连接,如果存在多个等待进程,一个请求进来就会唤醒全部进程,结果只会肯定只会有一个进程拿到这次请求,但其他进程被唤醒浪费系统资源,如何避免?(Nginx 提供了一个 accept_mutex 这个东西,这是一个加在accept上的一把共享锁。即每个 worker 进程在执行 accept 之前都需要先获取锁,获取不到就放弃执行 accept(),保证了只有一个连接接受请求,accept_mutex 是一个可控选项,我们可以显示地关掉,默认是打开的)每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
多路IO复用:如果不使用 IO 多路复用,那么在一个进程中,同时只能处理一个请求,比如执行 accept(),如果没有连接过来,那么程序会阻塞在这里,直到有一个连接过来,才能继续向下执行。
epoll多路复用,允许我们只在事件发生时才将控制返回给程序,而其他时候内核都挂起进程,随时待命。
一个进程里只有一个线程,所以一个进程同时只能做一件事,但是可以通过不断地切换来“同时”处理多个请求。
例:Nginx 会注册一个事件:“如果有一个新客户端的连接请求过来,再告知我”,此后只有连接请求到来,服务器才会执行 accept() 来接收请求。又比如向上游服务器转发请求,并等待请求结果返回时,这个处理的 worker 不会在这阻塞,它会在发送完请求后,注册一个事件:“如果缓冲区接收到数据了,告诉我一声,我再读取它”,于是进程就空闲下来等待事件发生。(这就是事件驱动)
nginx 通过 多进程和epoll多路复用 便能实现高并发。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值