sap abap开发从入门到精通_Nginx 开发从入门到精通《实战书籍》学会这些就够了...

8e1f788eb75bc583c80c6cb4d33fe91b.png

缘起

nginx由于出色的性能,在世界范围内受到了越来越多人的关注,在淘宝内部它更是被广泛的使用,众多的开发以及运维同学都迫切的想要了解nginx模块的开发以及它的内部原理,但是国内却没有一本关于这方面的书,源于此我们决定自己来写一本。本书的作者为淘宝核心系统服务器平台组的成员,本书写作的思路是从模块开发逐渐过渡到nginx原理剖析。书籍的内容会定期在这里更新,欢迎大家提出宝贵意见,不管是本书的内容问题,还是字词错误,都欢迎大家提交issue(章节标题的左侧有评注按钮),我们会及时的跟进。

fda84758ab825143343a79a4a355b69b.png
b5f2ecbe67e36b1a482edc778c3b4c66.png
957165c9924ce7874fb910e5a52857c2.png
a08bceda84560b83d4cedf3a6c3137c5.png

下面先说说:正向代理和反向代理的区别:说白了,反向代理就是负载均衡!!!为服务器分发请求,隐藏主服务器

313012d548b04857a599adf3c4ea9671.png

Nginx 开发从入门到精通

nginx 在启动后,会有一个 master 进程和多个 worker 进程。master 进程主要用来管理 worker

进程,包含:接收来自外界的信号,向各 worker 进程发送信号,监控 worker 进程的运行状态,当 worker

进程退出后 (异常情况下),会自动重新启动新的 worker 进程。而基本的网络事件,则是放在 worker 进程中

来处理了。多个 worker 进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个

请求,只可能在一个 worker 进程中处理,一个 worker 进程,不可能处理其它进程的请求。worker 进程的

个数是可以设置的,一般我们会设置与机器 cpu 核数一致,这里面的原因与 nginx 的进程模型以及事件处理模

型是分不开的。nginx 的进程模型,可以由下图来表示:

27b04178ca6fe6d4a83b10a23b179381.png

上篇: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的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值