Nginx学习笔记(二):Nginx 连接处理 / 负载均衡
Connection
在 Nginx 中,connection 就是对 TCP 连接的封装,其中包括连接的 socket,读写事件
Nginx 处理连接流程:
- 解析配置文件,得到需要监听的端口和IP地址;
- 在 master 中初始化监听 socket -> bind ->listen;
- fork 多个子进程,子进程会通过竞争accept_mutex 锁获得新连接;
- 当 client 与 server 三次握手后,nginx 某一个 worker 会 accept 成功,然后创建 nginx 对连接的封装,即ngx_connection_t 结构体;
- 设置读写事件处理函数并添加读写事件来与客户端进行数据的交换;
- 最后 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 算法)
Nginx学习笔记(二):Nginx 连接处理 / 负载均衡的更多相关文章
- nginx 学习笔记(2) nginx新手入门
这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...
- Nginx学习笔记二基本配置
1.Nginx的配置文件默认在Nginx程序安装目录的conf二级目录下,主配置文件为nginx.conf.假设您的Nginx安装 在/usr/local/webserver/nginx/目录下,那么 ...
- nginx学习笔记(二)
nginx变量 Nginx 变量值容器的生命期是与当前正在处理的请求绑定的,而与 location 无关. 通过 set 指令隐式创建的 Nginx 变量.这些变量我们一般称为"用户自定义变 ...
- Nginx学习笔记六Nginx的模块开发
1.Nginx配置文件主要组成:main(全局配置)这部分的指令将影响其他所有部分.server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.upstream(主要为反向代理,负载均 ...
- 七、Nginx学习笔记七Nginx的Web缓存服务
user www; worker_processes 1; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/l ...
- nginx 学习笔记(1) nginx安装
1.nginx安装 根据操作系统的不同,nginx的安装方式也不相同. 1.1 对linux系统来说,nginx.org提供了nginx安装包.http://nginx.org/en/linux_pa ...
- SpringCloud学习笔记(2):使用Ribbon负载均衡
简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具,在注册中心对Ribbon客户端进行注册后,Ribbon可以基于某种负载均衡算法,如轮询(默认 ...
- spring cloud学习笔记三 Feign与Ribbon负载均衡的区别
一.Feign的介绍 Feign一般比较书面的解释是:Feign是一个声明式的WebService客户端,使用Feign编写的WebService客户端更加简单,他的使用方法是定义一个接口,然后在上线 ...
- nginx学习笔记二
一,nginx架构在Linux系统中以daemon(守护进程)的方式在后台运行,后台进程包含一个master进程和多个worker进程(多进程的工作方式) master进程 | 信号 | | ---- ...
- nginx学习笔记(7)Nginx如何处理一个请求---转载
如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...
随机推荐
- CSS 交集选择器和并集选择器
交集选择器是and 也就是要同时满足 且只能交2个只能交2个只能交2个,第一个是标记,第二个是class或者id,之间不可以有空格 eg: span.small-height 并集选择器是or,也就 ...
- mysql解压文件安装
mysql.zip版本的安装教程 MySQL zip版本安装 一直以来都习惯了使用MySQL安装文件(.exe),今天下载了一个.zip版本的MySQL,安装过程中遇到了一些问题,如下: 1.在M ...
- Vue插槽详解
简介 插槽:简单理解就是组件内部留一个或多个的插槽位置,可供组件传对应的模板代码进去.插槽的出现,让组件变的更加灵活. 一.匿名插槽 // 组件(父) <my-component> < ...
- springboot集成Kafka
kafka和MQ的区别: 1)在架构模型方面, RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding ...
- Leetcode题目461:汉明距离(位运算-简单)
题目描述: 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意:0 ≤ x, y < 231. 示例: 输入: x = ...
- 使用java写js中类似setTimeout的代码
javascript目前已经是一门相当主流的编程语言了,它的异步IO特定项目其他编程语言来说,大大减少了cpu在线程切换方面的速度.实现了单线程高并发的奇迹.而java作为老牌编程语言,在很多的项目中 ...
- bagging,random forest,boosting(adaboost、GBDT),XGBoost小结
Bagging 从原始样本集中抽取训练集.每轮从原始样本集中使用Bootstraping(有放回)的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中).共进行 ...
- arcgis python 布局视图中文本查找替换
# Author: ESRI # Date: July 5, 2010 # Version: ArcGIS 10.0 # Purpose: This script will perform a sea ...
- UVA:1600 巡逻机器人
机器人要从一个m*n(m和n的范围都在1到20的闭区间内)的网格的左上角(1,1)走到右下角(m,n).网格中的一些格子是空地,用0表示,其它格子是障碍,用1表示.机器人每次可以往四个方向走一格,但不 ...
- maven install的时候把源码一起放到仓库
在pom.xml中加入插件 <build> <plugins> <!-- Source attach plugin --> < ...