缘起
nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部原理,但是国内却没有一本关于这方面的书,源于此我们决定自己来写一本。本书的作者为淘宝核心系统服务器平台组的成员,本书写作的思路是从模块开发逐渐过渡到nginx原理剖析。书籍的内容会定期在这里更新,欢迎大家提出宝贵意见,不管是本书的内容问题,还是字词错误,都欢迎大家提交issue(章节标题的左侧有评注按钮),我们会及时的跟进。
下面先说说:正向代理和反向代理的区别:说白了,反向代理就是负载均衡!!!为服务器分发请求,隐藏主服务器
Nginx 开发从入门到精通
nginx 在启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理 worker
进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker
进程退出后 (异常情况下),会自动重新启动新的 worker 进程。而基本的网络事件,则是放在 worker 进程中
来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个
请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。worker 进程的
个数是可以设置的,一般我们会设置与机器 cpu 核数一致,这里面的原因与 nginx 的进程模型以及事件处理模
型是分不开的。nginx 的进程模型,可以由下图来表示:
上篇:nginx 模块开发篇
这里就简单和大家分享一下了 需要资料的大家可以私信资料,送大家
好现在我们说说
nginx 基础概念 (100%)
在 nginx 中 connection 就是对 tcp 连接的封装,其中包括连接的 socket,读事件,写事件。利用 nginx 封
装的 connection,我们可以很方便的使用 nginx 来处理与连接相关的事情,比如,建立连接,发送与接受数
据等。而 nginx 中的 http 请求的处理就是建立在 connection 之上的,所以 nginx 不仅可以作为一个 web
服务器,也可以作为邮件服务器。当然,利用 nginx 提供的 connection,我们可以与任何后端服务打交道。
结合一个 tcp 连接的生命周期,我们看看 nginx 是如何处理一个连接的。首先,nginx 在启动时,会解析配置
文件,得到需要监听的端口与 ip 地址,然后在 nginx 的 master 进程里面,先初始化好这个监控的 socket(创
建 socket,设置 addrreuse 等选项,绑定到指定的 ip 地址端口,再 listen),然后再 fork 出多个子进程出来,
然后子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与 nginx 进行三次
握手,与 nginx 建立好一个连接后,此时,某一个子进程会 accept 成功,得到这个建立好的连接的 socket,
然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体。接着,设置读写事件处理函数并添加读写事件
来与客户端进行数据的交换。最后,nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了。
当然,nginx 也是可以作为客户端来请求其它 server 的数据的(如 upstream 模块),此时,与其它 server
创建的连接,也封装在 ngx_connection_t 中。作为客户端,nginx 先获取一个 ngx_connection_t 结构体,
然后创建 socket,并设置 socket 的属性(比如非阻塞)。然后再通过添加读写事件,调用 connect/read/
write 来调用连接,最后关掉连接,并释放 ngx_connection_t。
在 nginx 中,每个进程会有一个连接数的最大上限,这个上限与系统对 fd 的限制不一样。在操作系统中,通过
ulimit -n,我们可以得到一个进程所能够打开的 fd 的最大数,即 nofile,因为每个 socket 连接会占用掉一个
fd,所以这也会限制我们进程的最大连接数,当然也会直接影响到我们程序所能支持的最大并发数,当 fd 用完
后,再创建 socket 时,就会失败。不过,这里我要说的 nginx 对连接数的限制,与 nofile 没有直接关系,可
以大于 nofile,也可以小于 nofile。nginx 通过设置 worker_connectons 来设置每个进程可使用的连接最大
值。nginx 在实现时,是通过一个连接池来管理的,每个 worker 进程都有一个独立的连接池,连接池的大小
是 worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个 worker_connections
大小的一个 ngx_connection_t 结构的数组。并且,nginx 会通过一个链表 free_connections 来保存所有的
空闲 ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表
里面。
在这里,很多人会误解 worker_connections 这个参数的意思,认为这个值就是 nginx 所能建立连接的最大
值。其实不然,这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接
数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于 HTTP 请求本
地资源来说,能够支持的最大并发数量是 worker_connections * worker_processes,而如果是 HTTP 作为
反向代理来说,最大并发数量应该是 worker_connections * worker_processes/2。因为作为反向代理服务
器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接
总结;
我们就来说说最关键的,nginx到底有什么作用呢?今天先说些大家都比较熟悉的。
说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理。
在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!