- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Nginx 基础概念.pdf
Nginx 基础概念
Nginx 基础概念
connection
在 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 的某⼀个⼦进程会 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 通过设置 worker_connectons 来设置每个进程⽀持的
最⼤连接数。如果该值⼤于 nofile ,那么实际的最⼤连接数是 nofile ,Nginx 会有警
告。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。因为作为反向代 服务器,每个并发会建⽴与客户端的连
接和与后端服务的连接,会占⽤两个连接。
那么,我们前⾯有说过⼀个客户端连接过来后,多个空闲的进程,会竞争这个连接,
很容易看到,这种竞争会导致不公平,
文档评论(0)