nginx

(1)什么是nginx?

nginx是:一个高性能的HTTP和反向代理服务器,用时也是一个ICMP/POP3/SMTP代理服务器。目前有很多国内网站采用nginx作为web服务器。

(2)nginx特点

nginx以事件驱动的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理,负载平衡
nginx作为HTTP服务器,有以下特征:

  • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
  • 无缓存的反向代理加速器,简单的负载均衡和容错。
  • FastCGI,简单的负载均衡和容错。
  • 模块化的结构。
  • 支持SSL和TLSSNI。

(3)nginx架构

nginx在启动后,会有一个master进程和多个worker进行。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动启动新的worker进程。而基本的网络事件则是放在worker进程中来处理。多个worker之间是对等的,他们同等竞争来字客户端的请求,个=各进程之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程不可能处理其他进程的请求。worker进程的个数是可以设置的,一般设置的是与机器的CPU 核数一致。
如下图示:nginx的进程模型

在nginx启动之后,如果要操作nginx,可以通过master来管理worker进程,所以只需要与master通信即可,master会接收来自外界的信号,再根据信号做不同的事情。所以要控制nginx只需要通过kill向master进程发送信号即可。

  • 每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程。
  • 所有的worker进程的socket会在新连接到来之前时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册socket读事件前抢先accept_mutex
  • 抢到互斥锁的那个进程注册socket读事件,在读事件里调用accpet接收连接。
  • 当一个worker进程请求accpet这个连接之后,就开始读取请求,解析请求,处理请求,产生数据之后,再返回给客户端
  • 之后断开连接

(4)nginx采用这种进程模型的优势

  • 由于对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也很方便。
  • 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
  • worker进程的异常退出会导致当前worker上的所有请求失败,不过不会影响到所有的请求,因此降低了风险。

(5)nginx事件处理机制

nginx采用了异步非阻塞的方式处理请求,可以同时监控多个事件,调用它们是阻塞的,但是可以设置超时时间,在超市时间内,如果有事件准备好了,就返回。
如:epoll为例,在事件没有准备好时,放到epoll里,事件准备好了,我们就去读写,当读写返回eagain时,我们将它再次加入到epoll中,这样,只有事件准备好了,我们才会去处理它,只有当事件都没有准备好,才在epoll里面等着。这样就可以处理大量的未完成的并发请求。线程只有一个,所以同时处理的请求当然只有一个,只是在请求之间不断切换而已,切换到的原因就是异步事件未准备好,而主动退出的,这里的切换是没有任何代价的。

(6)connection

nginx中的connection就是对tcp连接的封装,其中包括连接的socket,读事件,写事件。利用nginx封装的connection,我们可以很方便的使用nginx来处理与连接相关的事情,比如建立连接,发送与接收数据等。而nginx中的http请求的处理就是建立在connection之上的。

nginx_tcp(nginx如何处理一个tcp连接?)

nginx做服务器端

  • 首先在nginx启动时,会解析配置文件,得到需要监听的IP地址和端口,然后在nginx的master进程里面,先初始化好这个监控的socket(包括创建socket,设置ddrreuse等选项,绑定到指定的IP地址和端口,再listen)。
  • 然后再fork出多个子进程出来,然后子进程会竞争accept新的连接。此时客户端就可以向nginx发起连接了。
  • 当客户端与服务器端通过三次握手建立好一个连接之后,nginx的某一个子进程会accpet成功,得到这个连接好的连接的socket,然后创建nginx对连接的封装(即ngx_connetcion_t结构体)。
  • 之后设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。
  • 最后,nginx或客户端来主动关闭连接。

nginx做客户端

nginx也可以作为客户端来请求其它server的数据的。

  • 此时,与其他server 创建的连接也封装在ngx_cnnection_t中。
  • 作为客户端nginx先获取一个ngx_connection_t结构体,然后创建socket,并设置socket的属性。
  • 然后再通过添加读写事件,调用connect/read/write来调用连接.
  • 最后关闭连接,并释放ngx_connection_t.

(7)nginx进程连接数

nginx在实现的时候,是通过一个连接池来管理连接的,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个work_connections大小的一个ngx_nonnections_t结构的数组。并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲链表中获取一个,用完后,再放回空闲连接链表里。
这里worker_connections这个参数表示的是每个worker所能建立的最大值,所以,一个nginx所能建立的最大连接数是worker_connections * worker_processes,当然这里说的是最大连接数,也是对于HTTP请求本地资源能够支持的最大并发数量,而如果是HTTP最为反向代理来说,最大并发数量应该是worker_connection * worker_processes/2。作为反向代理服务器,每个并发会建立与客户端的连接和后端的连接,会占用两个连接。

(8)nginx控制多进程间的连接平衡

nginx的处理得先打开一accept_mutex选项,此时只有获得了accept_mutex的进程才会添加accept事件,也就是说,nginx会控制进程是否添加accept事件。nginx使用一个叫ngx_accept_disabled的变量来控制是否去竞争accept_mutex锁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值