聊聊nginx的keepalive_time参数
序
本文主要研究一下nginx的keepalive_time参数
keepalive_time
Syntax: keepalive_time time;
Default:
keepalive_time 1h;
Context: http, server, location
This directive appeared in version 1.19.10.
nginx的1.19.10版本新增了keepalive_time参数,用于限制一个keep-alive连接处理请求的最长时间。当达到这个时间后,连接会在后续请求处理完成后关闭。
ngx_http_core_module
nginx/src/http/ngx_http_core_module.c
void
ngx_http_update_location_config(ngx_http_request_t *r)
{ngx_http_core_loc_conf_t *clcf;//......if (r->keepalive) {if (clcf->keepalive_timeout == 0) {r->keepalive = 0;} else if (r->connection->requests >= clcf->keepalive_requests) {r->keepalive = 0;} else if (ngx_current_msec - r->connection->start_time> clcf->keepalive_time){r->keepalive = 0;} else if (r->headers_in.msie6&& r->method == NGX_HTTP_POST&& (clcf->keepalive_disable& NGX_HTTP_KEEPALIVE_DISABLE_MSIE6)){/** MSIE may wait for some time if an response for* a POST request was sent over a keepalive connection*/r->keepalive = 0;} else if (r->headers_in.safari&& (clcf->keepalive_disable& NGX_HTTP_KEEPALIVE_DISABLE_SAFARI)){/** Safari may send a POST request to a closed keepalive* connection and may stall for some time, see* https://bugs.webkit.org/show_bug.cgi?id=5760*/r->keepalive = 0;}}//......
}
ngx_http_core_module的ngx_http_update_location_config方法在开启keepalive时会判断connection的存活时间,若大于keepalive_time则关闭keepalive(
ngx_current_msec - r->connection->start_time > clcf->keepalive_time
)
ngx_http_core_keepalive
nginx/src/http/ngx_http_core_module.c
static char *
ngx_http_core_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{ngx_http_core_loc_conf_t *clcf = conf;ngx_str_t *value;if (clcf->keepalive_timeout != NGX_CONF_UNSET_MSEC) {return "is duplicate";}value = cf->args->elts;clcf->keepalive_timeout = ngx_parse_time(&value[1], 0);if (clcf->keepalive_timeout == (ngx_msec_t) NGX_ERROR) {return "invalid value";}if (cf->args->nelts == 2) {return NGX_CONF_OK;}clcf->keepalive_header = ngx_parse_time(&value[2], 1);if (clcf->keepalive_header == (time_t) NGX_ERROR) {return "invalid value";}return NGX_CONF_OK;
}
ngx_http_core_module的ngx_http_core_keepalive方法会解析nginx配置文件的keepalive_timeout配置,第一个参数为keepalive_timeout参数,第二参数为header_timeout
ngx_http_header_filter_module
nginx/src/http/ngx_http_header_filter_module.c
static ngx_int_t
ngx_http_header_filter(ngx_http_request_t *r)
{u_char *p;size_t len;ngx_str_t host, *status_line;ngx_buf_t *b;ngx_uint_t status, i, port;ngx_chain_t out;ngx_list_part_t *part;ngx_table_elt_t *header;ngx_connection_t *c;ngx_http_core_loc_conf_t *clcf;ngx_http_core_srv_conf_t *cscf;u_char addr[NGX_SOCKADDR_STRLEN];if (r->header_sent) {return NGX_OK;}//......if (r->headers_out.status == NGX_HTTP_SWITCHING_PROTOCOLS) {b->last = ngx_cpymem(b->last, "Connection: upgrade" CRLF,sizeof("Connection: upgrade" CRLF) - 1);} else if (r->keepalive) {b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF,sizeof("Connection: keep-alive" CRLF) - 1);if (clcf->keepalive_header) {b->last = ngx_sprintf(b->last, "Keep-Alive: timeout=%T" CRLF,clcf->keepalive_header);}} else {b->last = ngx_cpymem(b->last, "Connection: close" CRLF,sizeof("Connection: close" CRLF) - 1);}//......
}
ngx_http_header_filter_module的ngx_http_header_filter方法在开启keepalive的时候会写入
Connection: keep-alive
,若keepalive_header的值大于0则写入Keep-Alive: timeout=%T
,可以看到这个值是固定的
ngx_http_set_keepalive
nginx/src/http/ngx_http_request.c
static void
ngx_http_set_keepalive(ngx_http_request_t *r)
{int tcp_nodelay;ngx_buf_t *b, *f;ngx_chain_t *cl, *ln;ngx_event_t *rev, *wev;ngx_connection_t *c;ngx_http_connection_t *hc;ngx_http_core_loc_conf_t *clcf;//......wev = c->write;wev->handler = ngx_http_empty_handler;if (b->pos < b->last) {ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "pipelined request");c->log->action = "reading client pipelined request line";r = ngx_http_create_request(c);if (r == NULL) {ngx_http_close_connection(c);return;}r->pipeline = 1;c->data = r;c->sent = 0;c->destroyed = 0;c->pipeline = 1;if (rev->timer_set) {ngx_del_timer(rev);}rev->handler = ngx_http_process_request_line;ngx_post_event(rev, &ngx_posted_events);return;}//......rev->handler = ngx_http_keepalive_handler;//......c->idle = 1;ngx_reusable_connection(c, 1);ngx_add_timer(rev, clcf->keepalive_timeout);if (rev->ready) {ngx_post_event(rev, &ngx_posted_events);}
}
ngx_http_request的ngx_http_set_keepalive方法,在
b->pos < b->last
会尝试读取request line然后执行ngx_http_create_request,若能读到数据则判断是否有timer,有则执行ngx_del_timer(rev)删除timer,然后返回;若进入keepalive逻辑,则会通过ngx_add_timer添加一个定时事件,在keepalive_timeout之后触发
ngx_http_keepalive_handler
nginx/src/http/ngx_http_request.c
static void
ngx_http_keepalive_handler(ngx_event_t *rev)
{size_t size;ssize_t n;ngx_buf_t *b;ngx_connection_t *c;c = rev->data;ngx_log_debug0(NGX_LOG_DEBUG_HTTP, c->log, 0, "http keepalive handler");if (rev->timedout || c->close) {ngx_http_close_connection(c);return;}#if (NGX_HAVE_KQUEUE)if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {if (rev->pending_eof) {c->log->handler = NULL;ngx_log_error(NGX_LOG_INFO, c->log, rev->kq_errno,"kevent() reported that client %V closed ""keepalive connection", &c->addr_text);
#if (NGX_HTTP_SSL)if (c->ssl) {c->ssl->no_send_shutdown = 1;}
#endifngx_http_close_connection(c);return;}}#endifb = c->buffer;size = b->end - b->start;if (b->pos == NULL) {/** The c->buffer's memory was freed by ngx_http_set_keepalive().* However, the c->buffer->start and c->buffer->end were not changed* to keep the buffer size.*/b->pos = ngx_palloc(c->pool, size);if (b->pos == NULL) {ngx_http_close_connection(c);return;}b->start = b->pos;b->last = b->pos;b->end = b->pos + size;}/** MSIE closes a keepalive connection with RST flag* so we ignore ECONNRESET here.*/c->log_error = NGX_ERROR_IGNORE_ECONNRESET;ngx_set_socket_errno(0);n = c->recv(c, b->last, size);c->log_error = NGX_ERROR_INFO;if (n == NGX_AGAIN) {if (ngx_handle_read_event(rev, 0) != NGX_OK) {ngx_http_close_connection(c);return;}/** Like ngx_http_set_keepalive() we are trying to not hold* c->buffer's memory for a keepalive connection.*/if (ngx_pfree(c->pool, b->start) == NGX_OK) {/** the special note that c->buffer's memory was freed*/b->pos = NULL;}return;}if (n == NGX_ERROR) {ngx_http_close_connection(c);return;}c->log->handler = NULL;if (n == 0) {ngx_log_error(NGX_LOG_INFO, c->log, ngx_socket_errno,"client %V closed keepalive connection", &c->addr_text);ngx_http_close_connection(c);return;}b->last += n;c->log->handler = ngx_http_log_error;c->log->action = "reading client request line";c->idle = 0;ngx_reusable_connection(c, 0);c->data = ngx_http_create_request(c);if (c->data == NULL) {ngx_http_close_connection(c);return;}c->sent = 0;c->destroyed = 0;ngx_del_timer(rev);rev->handler = ngx_http_process_request_line;ngx_http_process_request_line(rev);
}
ngx_http_request的ngx_http_keepalive_handler会在
rev->timedout || c->close
的时候执行ngx_http_close_connection然后返回,若还能读到请求数据则执行ngx_del_timer(rev)删除定时任务
小结
nginx的1.19.10版本新增了keepalive_time参数(默认1h
),用于限制一个keep-alive连接处理请求的最长时间(即指定connection的最大存活时间
),当达到这个时间后,连接会在后续请求处理完成后关闭。而keepalive_timeout参数(默认75s
)则是用于指定connection最大的空闲时间,nginx内部有会给该连接设定一个timer,在keepalive_timeout之后触发,若连接还是空闲则关闭连接。
doc
- keepalive_time
- What’s the difference between Nginx ‘keepalive_time’ and ‘keepalive_timeout’?
相关文章:
聊聊nginx的keepalive_time参数
序 本文主要研究一下nginx的keepalive_time参数 keepalive_time Syntax: keepalive_time time; Default: keepalive_time 1h; Context: http, server, location This directive appeared in version 1.19.10.nginx的1.19.10版本新增了keepalive_time参数,用于限…...
沐风老师3DMAX键盘球建模方法详解
3DMAX键盘球建模教程 本教程给大家分享一个3dMax键盘球的建模方法过程。在学习本教程之前,大家需要对3dMax基本操作及建模知识有所掌握,还是那句话:做实例的前提是选学习基础知识和掌握3dMax的基本操作。 下面就给大家一步一步讲解演示3dMax…...
算法通关村第一关—白银挑战—链表高频面试算法题—查找两个链表的第一个公共子节点
文章目录 查找两个链表的第一个公共子节点(1)暴力求解法(2)使用哈希Hash⭐(3)使用集合⭐ - 与Hash类似(4)使用栈⭐(5)仍有更多方法,作者尚未理解&…...
C/C++ 发送与接收HTTP/S请求
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议。它是一种无状态的、应用层的协议,用于在计算机之间传输超文本文档,通常在 Web 浏览器和 Web 服务器之间进行数据通信。HTTP 是由互联网工程任务组(IETF…...
【算法集训】基础数据结构:一、顺序表(下)
由于今天的题目是昨天剩下的,所以只有两道题,也非常简单,刷完下班~~~嘿嘿 第六题 2656. K 个元素的最大和 https://leetcode.cn/problems/maximum-sum-with-exactly-k-elements/description/ 很简单的思路,要得到得分最大的&…...
[Java][项目][战斗逻辑]基于JFrame的文字游戏
项目注解: Core:启动文件 AttributeBean:玩家属性 BackpackedBean:背包设计(未完成) BackpackedFrame:背包页面(未完成) BattleField:战斗逻辑(核心&…...
顺序表和链表面试题
文章目录 顺序表(1)原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)。(2)删除有序数组中的重复项(3)合并两个有序数组 链表(1)删除链表中等于给定值 val 的所有节点(2)反转一个单链表(3) 合并两个有序链表(4)链表的中间结点(5)链表中…...
树_二叉搜索树累加求和
//给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 // node.val 的值之和。 // // 提醒一下,二叉搜索树满足下列约束…...
gcc编译流程概述
前言 本篇文章介绍gcc编译器编译C文件的流程概述 比如我们创建了一个.c文件hello_gcc.c #include <stdio.h> int main() {printf("Hello gcc!!!\n");return 0; }最简单的方式就是在终端使用命令 gcc hello_gcc.c -o hello_gcc // 编译、汇编、链接 ./hello_…...
【web安全】ssrf漏洞的原理与使用
前言 菜某对ssrf漏洞的总结。 ssrf的作用 主要作用:访问外界无法访问的内网进行信息收集。 1.进行端口扫描,资源访问 2.指纹信息识别,访问相应的默认文件 3.利用漏洞或者和payload进一步运行其他程序 4.get类型漏洞利用,传参数…...
佳易王会员管理软件店铺积分以及积分兑换系统
一、佳易王会员管理软件大众版 部分功能简介: 1、会员信息登记 :可以直接使用手机号登记,也可以使用实体卡片,推荐用手机号即可。 2、会员卡类型 :可以自由设置卡的类型,比如:充值卡、计次卡、…...
Django回顾【二】
目录 一、Web框架 二、WSGI协议 三、 Django框架 1、MVC与MTV模型 2、Django的下载与使用 补充 3、启动django项目 补充 5、 Django请求生命周期 四、路由控制 1、路由是什么? 2、如何使用 3、path详细使用 4、re_path详细使用 5、反向解析 6、路由…...
[Ubuntu 18.04] RK3399搭建SSH服务实现远程访问
SSH(Secure Shell)是一种网络协议和软件,用于安全地远程登录到计算机并进行网络服务的加密通信。它提供了加密的认证和安全的数据传输,使得在不安全的网络中进行远程管理和访问变得更加安全。 以下是 SSH 服务的一些关键特点和用途: 安全认证:SSH 使用公钥/私钥加密技术…...
Linux进程间通信之共享内存
📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容讲解共享内存原理和相关接口的介绍,以及一个…...
lv11 嵌入式开发 RTC 17
目录 1 RTC简介 编辑2 Exynos4412下的RTC控制器 2.1 概述 2.2 特征 2.3 功能框图 3 寄存器介绍 3.1 概述 3.2 BCD格式的年月日寄存器 3.3 INTP中断挂起寄存器 3.4 RTCCON控制寄存器 3.5 CURTICCNT 作为嘀嗒定时器使用的寄存器 4 RTC编程 5 练习 1 RTC简介 RTC(…...
c语言指针详解(上)
目录 一、指针的基本概念和用法 二、指针运算 2.1 指针的自增和自减运算 2.2 指针的自增和自减运算 三、数组和指针 四、指针和函数 4.1 在函数中使用指针作为参数和返回值 4.1.1 使用指针作为函数参数 4.1.2 使用指针作为函数返回值 4.2 指针参数的传值和传引用特性 4.2.1 指针…...
如何删除mac苹果电脑上面的流氓软件?
在使用苹果电脑的过程中,有时候我们也会遇到一些不需要的软件。无论是因为不再需要,或者是为了释放磁盘空间,删除这些软件是很重要的。本文将为大家介绍怎样删除苹果电脑上的软件! CleanMyMac X全新版下载如下: https://wm.make…...
WordPress(11)给文章添加预计阅读时长
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、文件配置二、代码块1.引入库2.配置 single.php三、效果图前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了…...
周周爱学习之快速排序
快速排序,顾名思义,快速排序是一种速度非常快的一种排序算法 平均时间复杂度为O(),最坏时间复杂度为O()数据量较大时,优势非常明显属于不稳定排序 1.算法描述 每一轮排序选择一个基准点(pivot)进行分区 让小于基准点…...
国产接口测试工具APIpost
说实话,了解APIpost是因为,我的所有接口相关的文章下,都有该APIpost水军的评论,无非就是APIpost是中文版的postman,有多么多么好用,虽然咱也还不是什么啥网红,但是不知会一声就乱在评论区打广告…...
MySQL电商管理系统练习题及答案
一 、表结构 用户表(user):id(主键)、username、password、email、phone、age商品表(product):id(主键)、name、price、stock、description订单表(order):id(主键)、user_id(外键,关联用户表)、total_price、status、create_time…...
每日3道PWN(第二天)
ciscn_2019_n_1 参考: [BUUCTF-pwn]——ciscn_2019_n_1-CSDN博客 [BUUCTF]PWN5——ciscn_2019_n_1_ciscn_2019_n_4-CSDN博客 BUUCTF—ciscn_2019_n_1 1-CSDN博客 checksec一下 64位栈溢出 按f5查看main函数,双击可疑函数 发现含有命令执行的且发现fl…...
SAP STMS传输请求
一、概述 一般SAP项目上都会有六套系统,分别是: 测试环境-DEV系统 主要由100:沙盘系统:用于业务顾问配置 200:开发系统:用于开发ABAP写代码 300:测试系统:主要是单元测试、顾问自己…...
L1-009:N个数求和
目录 ⭐题目描述⭐ ⭐分析 ⭐程序代码 运行结果 ⭐文案分享⭐ ⭐题目描述⭐ 本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。 输入格式: 输入第一行给出…...
当发送“Hello,World”时,channel发生了什么?
一、Netty概述 1.Netty是什么? Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。 2.Netty的地位怎么样? Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE …...
服务器运行情况及线上排查问题常用命令
一、top命令 指令行: top返回: 返回分为两部分 (一)系统概览,见图知意 以下是几个需要注意的参数 1、load average: 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分…...
Hadoop学习笔记(HDP)-Part.18 安装Flink
目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...
LeetCode56. 合并区间
🔗:【贪心算法,合并区间有细节!LeetCode:56.合并区间-哔哩哔哩】 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.size()0){return intervals;…...
解决typescript报错:找不到名称xxx
现象: 原因:在同时导入默认导出和命名导出时,默认导出必须放在命名导出之前 下面的就是原始文件: 默认导出指: export default导出类型, import时无需大括号 命名导出指: 仅有export关键字…...
UVM中封装成agent
在验证平台中加入monitor时,看到driver和monitor之间的联系:两者之间的代码高度相似。其本质是因为二者 处理的是同一种协议,在同样一套既定的规则下做着不同的事情。由于二者的这种相似性,UVM中通常将二者封装在一起,…...
手机做印章网站/上海网站制作推广
public class EqualTest {public static void main(String[] args) {//对于基本类型的变量。""和"equal"的区别int t157;int t267;int t3124;int t4124;//“”对于基本数据类型,判断两个变量的值是否相等。Boolean result1(t1t2);Boolean resul…...
呼伦贝尔旅游包车网站咋做/竞价排名服务
一.什么是Pipe?就是管道,简单来说,管道的作用就是传输。并且不同的管道具有不同的作用。(其实就是处理数据)二.pipe用法{{ 输入数据 | 管道 : 管道参数}} (其中‘|’是管道操作符)三.Angular自带的pipe函数 管道功能 DatePipe 日期管道,格…...
百度不收录网站/seo专业培训费用
为什么80%的码农都做不了架构师?>>> Question 345. Reverse Vowels of a String Solution 思路:交换元音,第一次遍历,先把出现元音的索引位置记录下来,第二遍遍历元音的索引并替换。 Java实现:…...
高明铝业网站建站/关于进一步优化当前疫情防控措施
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。 401 当前请求需要用户验证。 403 服务器已经理解请求,但是拒绝执行它。 502 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 200OK(…...
深圳网站排名怎么做/深圳网络整合营销公司
Oracle索引修复 ,ORA-00600: internal error code, arguments: [6200],问题背景:客户反馈DB每天产生的incident日志很多,需要排查原因查看alert日志发现大量的ORA-07445、ORA-00600错误Errors in file /data/oracle/diag/rdbms/bydata/bydata…...
扶风做网站/企业网站建设门户
原型库网站—讲师金乌原创发布,可自由转载,请注明出处!Axure中文官网:www.AxureRP.cn《AxureRP7.0部件详解》Inline Frame 内部框架使用内部框架,可以嵌入视频,地图,和HTML到您的原型设计中。使…...