ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Nginx学习笔记(二)

2020-01-22 14:44:38  阅读:278  来源: 互联网

标签:disabled worker accept 学习 Nginx mutex 笔记 ngx 连接


Connection:

在Nginx中,connection就是对TCP连接的封装,其中包括连接的socket,读写事件。

Nginx处理连接流程:

1. 解析配置文件,得到需要监听的端口和IP地址;

2. 在 master 中初始化监听 socket -> bind ->listen;

3. fork 多个子进程,子进程会通过竞争accept_mutex 锁获得新连接;

4. 当 client 与 server 三次握手后,nginx 某一个 worker 会 accept 成功,然后创建 nginx 对连接的封装,即ngx_connection_t 结构体;

5. 设置读写事件处理函数并添加读写事件来与客户端进行数据的交换;

6. 最后 nginx 或客户端来主动关掉连接,一个连接到此结束。

在这里插入图片描述

Nginx通过设置 worker_connections来设置每个进程支持的最大连接数;

实现是通过一个连接池管理的,每个worker进程都有一个独立的连接池,连接池大小为 worker_connections;

连接池实际上是一个 worker_connections 大小的一个 ngx_connection_t 结构的数组;

并且 nginx 会通过一个链表 free_connections 来保存所有空闲的 ngx_connections_t ;

每获取一个连接,就从空闲连接链表中获取一个,用完后再放回空闲连接链表中;



* Nginx 能建立的最大连接数(最大并发量): worker_connections * worker_processes

* 反向代理则是该值的1/2,因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

负载均衡:

通过 ngx_accept_disabled 变量控制是否去竞争 accept_mutex;

*使各 worker 连接数量达到负载均衡

ngx_accept_disabled = 单进程所有连接数 1/8 - 剩余空闲连接数

当剩余连接数小于总连接数 1/8,不再获取 accept_mutex,并且 ngx_accept_disabled 减1,直到小于0。

* 当 disabled 越大,让出机会越大(类似Lottery算法)
ngx_accept_disabled = ngx_cycle->connection_n / 8
    - ngx_cycle->free_connection_n;

if (ngx_accept_disabled > 0) {
    ngx_accept_disabled--;

} else {
    if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
        return;
    }

    if (ngx_accept_mutex_held) {
        flags |= NGX_POST_EVENTS;

    } else {
        if (timer == NGX_TIMER_INFINITE
                || timer > ngx_accept_mutex_delay)
        {
            timer = ngx_accept_mutex_delay;
        }
    }
}

Nginx开发从入门到精通:http://tengine.taobao.org/book/

*夜空中最亮的星* 发布了1 篇原创文章 · 获赞 6 · 访问量 2085 私信 关注

标签:disabled,worker,accept,学习,Nginx,mutex,笔记,ngx,连接
来源: https://blog.csdn.net/weixin_38054045/article/details/103465560

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有