nginx开发学习汇总
文章平均质量分 67
nginx学习和开发总结
securitysun
分享个人历年来工作中整理的笔记 vx:prc0451
展开
-
fastsocket提升nginx CPS性能分析
xtcp是针对网络传输性能对linux2.6.32-573内核进行优化,而fastsocket是针对单机性能优化,提升单机的cps。我们将把fastsocket的优化性能移植到xtcp中,提升其单机的cps性能。预期服务产线:Tengine–7层LB目的:提升现在单机7层LB的服务性能,预计cps的性能提升一倍;同时可以提升7层LB在生产环境的传输性能。linux2.6.32-431/531内核对Tengine的性能瓶颈结论:性能损耗主要在内核的三把锁 ...原创 2023-11-27 16:39:24 · 564 阅读 · 0 评论 -
nginx子请求与addtion filter模块源码分析
9,第二子请求:ngx_http_finalize_request,第二子请求下有postponed,调用set_writer_handler设置write_event_handler回调,ngx_http_run_posted_requests开始遍历到主请求,此时为posted_requests仅为主请求。14,主请求:ngx_http_postpone_filter,ngx_http_finalize_request,发送数据ngx_http_post_action。原创 2023-08-06 12:13:59 · 174 阅读 · 0 评论 -
nginx mirror代码分析
request结构中有向后端upstream转发的数据缓存,并且request和内存资源独立于底层connection的内存资源,因此可复用request结构及内存(待mirror之后释放)作为向mirror upstream转发的数据来源,复用该数据可最大程度减少重新组包或数据copy带来的性能损耗。注意:复用该方法会有一个问题在于如果主请求不能转发到后端,则不会生成该http 头数据。例如 404 not found的请求,因为找不到指定路径,所以不会走proxy逻辑生成到upstream的请求数据。原创 2023-07-26 18:40:55 · 876 阅读 · 0 评论 -
openresty lor框架路由解析
openresty web框架lor,lor 是一个基于 ngx_lua的 MVC 框架,其 API 很类似于 Node 社区的著名框架Express。原创 2022-01-11 14:18:37 · 776 阅读 · 0 评论 -
attempt to redefine ‘timeval‘ at line 2解决办法
attempt to redefine 'timeval' at line 2解决办法原创 2022-02-14 10:08:40 · 814 阅读 · 0 评论 -
tengine reload优化记录
tengine reload机制优化优化背景tengine在reload过程中存在cpu掉量的问题,经查reload阶段cpu状态,发现cpu usr占用率比较高。优化方式查看老的worker进程退出时代码发现,tengine在退出前会集中处理连接上的事件,消耗过多cpu,因此去掉该集中处理过程。负面影响该优化方式可能会导致系统中shutting down 状态 worker进程退出较慢,从而造成一定程度的堆积。优化结果经线下自测发现,该改动能有效减少cpu掉量问题。另外原创 2022-02-22 09:32:54 · 722 阅读 · 0 评论 -
nginx编译参数说明
nginx编译参数说明如下:--prefix=<path> -- 安装路径,如果没有指定,默认为/usr/local/nginx。--sbin-path=<path> -- nginx可执行命令的文件,如果没有指定,默认为<prefix>/sbin/nginx。--conf-path=<path> -- 在没有使用-c参数指定的情况下nginx.co......原创 2018-04-16 21:11:11 · 557 阅读 · 0 评论 -
内核参数说明for nginx
tengine 内核参数2.6.32-573.26.1.el6.SuperXtcp01.x86_64tcp_max_syn_backlog: 16384端口最大 backlog 内核限制。此参数限制 服务端应用程序 可以设置的端口最大 backlog 值 (对应于端口的 syn_backlog 和 backlog 队列长度)。动机是在内存有限的服务器上限制/避免应用程序配置超大 backlog 值而耗尽内核内存。如果应用程序设置 backlog 大于此值,操作系统将自动将之限制到此值。(ten.原创 2022-07-01 23:42:18 · 632 阅读 · 0 评论 -
nginx 异步openssl Intel QAT硬件加速方案
Intel QuickAssist简介通过内核空间中的设备驱动程序和用户空间中的库访问qat技术加速器。加密服务通过标准引擎框架提供给openssl。引擎构建在用户空间库之上,qatapi接口跨版本无需修改。这种分层和与openssl框架的集成允许应用程序无缝利用。......原创 2021-11-23 15:18:11 · 3359 阅读 · 0 评论 -
gdb调试nginx openssl recv节选
872 sslerr = SSL_get_error(req_conn->ssl->connection, n);(gdb) n874 if (n == 1 || sslerr == SSL_ERROR_KEYLESS_OK || sslerr == SSL_ERROR_WANT_KEYLESS_CONN) {(gdb) n894 if (sslerr == SSL_ERROR_WANT_KEYLESS_READ) {(gdb) n906原创 2022-04-30 23:52:50 · 1524 阅读 · 0 评论 -
美团七层负载均衡转发系统落地案例
由于AB框架只支持4种策略类型,对于业务要根据请求Cookie、自定义header控制转发的情况,均需要开发新的策略类型和发布上线。另外,策略类型和业务场景紧密相关,导致AB系统的扩展性极差,很难快速支持新业务的路由需求。无论是Nginx if指令,还是AB框架,要么需要reload重新加载才能生效,要么无法支持某些业务场景下的分流需求,所以都很难作为解决公司级分流框架的有效手段。针对它们所存在的不足,Oceanus开发了一套应用级、高可扩展的动态分流框架,不仅动态支持各种业务场景的分流需求,而且保证了原创 2022-04-30 16:42:20 · 1940 阅读 · 0 评论 -
nginx处理请求的十一阶段分析
nginx启动时master进程加载配置文件,根据配置文件初始化监听的socket,fork worker进程。worker进程与client建立socket连接处理请求,接收请求读取请求行、请求头、请求体。处理请求,根据处理结果响应请求,响应行/头/体。十一个阶段,每个阶段有各自的checker和handler通过cheker函数来判断是继续在本阶段handler,还是去下一个phase的handler处理。或者跳到某个阶段handler处理。原创 2022-04-29 16:19:57 · 1185 阅读 · 0 评论 -
openresty是如何通过lua代码获取nginx内请求数据的
openresty是如何通过lua代码获取nginx内请求数据的nginx中处理请求是围绕ngx_http_request_t结构体进行的。ngx_http_request_t结构体包含了当前http请求的所有数据。ngx_http_lua_module与nginx进行交互,主要围绕这个结构体实现的,lua代码获取nginx内部http请求数据,然后进行处理。原创 2022-04-29 14:17:25 · 1610 阅读 · 0 评论 -
ngx_event_openssl异步说明
异步增加部分ngx_event_openssl.c文件:1、ngx_ssl_create_connection(ngx_ssl_t *ssl, ngx_connection_t *c, ngx_uint_t flags)函数ngx_pcalloc创建ngx_ssl_connection_t *sc;sc->connection = SSL_new(ssl->ctx);...原创 2020-03-15 16:57:04 · 1439 阅读 · 0 评论 -
nginx的处理http请求流程分析
Nginx的连接整个流程如下:1. 在Nginx main函数的ngx_init_cycle()方法中,调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比如非阻塞、接受发送的缓冲区、绑定、监听处理)2. HTTP模块初始化优先于Event模块,HTTP模块通过ngx_http_block()方法进行初始化,然后调用...原创 2020-03-15 16:53:29 · 447 阅读 · 0 评论 -
nginx启动初始化流程源码分析
配置:ngx_event_process_init:遍历connections,初始化listenfd的回调函数,添加事件监听 static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle) { ... cycle->connections = ngx_all...原创 2020-02-27 20:41:26 · 253 阅读 · 0 评论 -
nginx域名解析部分完整源码分析
nginx域名解析流程一、域名查询的函数接口介绍在使用同步IO的情况下,调用gethostbyname()或者gethostbyname_r()就可以根据域名查询到对应的IP地址,但因为可能会通过网络进行远程查询,所以需要的时间比较长。为了不阻塞当前线程,Nginx采用了异步的方式进行域名查询。整个查询过程主要分为三个步骤,这点在各种异步处理时都是一样的:准备函...原创 2020-02-25 15:05:51 · 1156 阅读 · 0 评论 -
nginx ngx_http_reqstat_module模块说明
req_stat是计数器,目前只能按照server块的粒度来进行统计状态码。配置如下: req_status_lazy on; req_status_zone req_status "$server_addr:$server_port:$upstream_addr" 50M; req_status req_status; server ...原创 2020-02-25 14:56:21 · 1083 阅读 · 0 评论 -
nginx回源connect peer相关源码分析
ngx_http_upstream_init_round_robin 中初始化us->peer.init = ngx_http_upstream_init_round_robin_peer,然后us->peer.data为解析的upstream信息,backup和非backup等分开解析。ngx_http_upstream_init_round_robin_peer,完成...原创 2020-02-25 14:47:41 · 726 阅读 · 0 评论 -
nginx lua查看共享内存使用情况代码
local ngx_shared = ngx.sharedlocal dicts = { "token_dict","config_dict","ip_dict","limit_ip_dict","lock_dict","hit_url_dict","nginx_dict","stream_dict","sent_dict","syslog_dict"}local re = {}for _,v in ipairs(dicts) do if ngx_shared[v] then...原创 2022-02-22 09:45:08 · 2086 阅读 · 0 评论 -
nginx dyups动态修改upstream说明
dynamic upstream使用tengine dyups模块(https://github.com/yzprofile/ngx_http_dyups_module) 实现upstream热更新,减少tengine reload操作。修改项1.更新了upstream check 模块(https://github.com/yzprofile/nginx_upstream_check_module)支持tengine dyups module。2.upstream check module原创 2022-01-29 14:35:20 · 4146 阅读 · 0 评论 -
nginx调用openssl函数源码分析
ngx_http_init_connection中recv→handler设置为ngx_http_ssl_handshake,把这个读时间加入到epoll中,重点看handshake这个函数receive client hellostatic voidngx_http_ssl_handshake(ngx_event_t *rev){...n = recv(c->fd, (char *) buf, size, MSG_PEEK);//判断协议if (n == 1) {原创 2022-01-27 10:12:33 · 3116 阅读 · 0 评论 -
EXAR+QAT加速卡驱动安装测试流程
插卡。装环境openssl、驱动、engine。安装qat_server代码写配置。安装qat_client代码写配置。测试qat_client打量,观察看是否有bug。出测试报告。QAT安装测试参考”Intel QAT 卡评估手册”https://github.com/intel/QAT_Enginehttps://github.com/intel/asynch_mode_nginx原创 2022-01-23 17:05:11 · 1137 阅读 · 0 评论 -
syslog-ng配置方式
nginx目前的日志存储方式是通过syslog发送到日志服务器,日志服务器上使用的程序是syslog-ng。配置文件路径:/etc/syslog-ng/syslog-ng.conf// options是日志的一些基本选项options {flush_lines (0);time_reopen (10);log_fifo_size (1024);long_hostnames (off);owne...原创 2022-01-23 16:55:15 · 1705 阅读 · 0 评论 -
nginx worker shutting down状态超时退出配置
worker_shutdown_timeout目前线上的tengine经过reload之后,shutting down状态的worker过多,有些一直保持websocket的worker很长时间无法退出,因此需要引入该配置杜绝此类现象。该配置配置在MAIN_CONF中,配置参数为时间,暂定为一小时(shutting down状态的worker一小时之后自动退出)。worker_shutdown_timeout 1h;...原创 2022-01-23 16:50:00 · 4081 阅读 · 0 评论 -
nginx upstream完整交互源码分析
tengine访问上游服务器的几个阶段:启动upstream、连接上游服务器、向上游发送请求、接收上游响应(包头/包体)、结束请求。主要数据结构:ngx_http_upstream_t和ngx_http_upstream_conf_t数据结构typedef struct ngx_http_upstream_s ngx_http_upstream_t;struct ngx_http_upstream_s {ngx_http_upstream_handler_pt read...原创 2022-01-23 16:38:27 · 1584 阅读 · 0 评论 -
nginx状态码部分源码梳理
5xx和upstream_5xx记录状态码的函数是ngx_http_reqstat_log_handler,这个函数在ngx_http_reqstat_init中放在log phase里static ngx_int_tngx_http_reqstat_init(ngx_conf_t *cf){...h = ngx_array_push(&cmcf->phases[NGX_HTTP_LOG_PHASE].handlers);*h = ngx_http_reqstat_原创 2022-01-23 16:12:01 · 590 阅读 · 0 评论 -
nginx解析nginx.conf源码流程分析
nginx配置文件结构示例,基本覆盖常用的配置: user olwaf; worker_processes auto; worker_cpu_affinity auto; worker_rlimit_nofile 200000; error_log syslog:facility=local3,severity=warn,server=logserver:514,tag=olwaf warn; error_log /dev/null warn;......原创 2022-01-21 10:15:35 · 856 阅读 · 0 评论 -
通过分析nginx upstream源码来看动态配置upstream模块
upstream回源处理流程代码围绕着ngx_http_upstream.c展开,该模块主要为创建mainconf函数:static void *ngx_http_upstream_create_main_conf(ngx_conf_t *cf){...//创建main confumcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_upstream_main_conf_t));//创建upstream数组,每一个ngx_http_u原创 2022-01-18 13:53:24 · 1902 阅读 · 0 评论 -
nginx lua编程要点,看完肯定会提高你的编码能力
table.new(narray, nhash) 两个参数分别代表table里是array还是hash的table.new(10, 0) 或者 table.new(0, 10) 这样的,后者是 hash 性质的 tableLua table 可以同时拥有数组部分和哈希部分。在物理上,数组部分和哈希部分也是在 table 内部分开存储的。比如table.new(100, 200) 也是完全合法的。table.new(narr, nrec) 接口是标准 Lua C API ......原创 2021-06-10 00:22:14 · 867 阅读 · 2 评论 -
编译nginx执行./configure编译源码分析
configure文件详解起头有三个脚本. auto/options. auto/init. auto/sourcesauto/options1. 设置选项对应的shell变量以及他们的初始值help=noNGX_PREFIX=NGX_SBIN_PATH=NGX_CONF_PREFIX=NGX_CONF_PATH=NGX_ERROR_LOG_PATH=NGX_PID_PATH=NGX_LOCK_PATH=NGX_USER=NGX_GROUP=原创 2022-01-06 13:15:11 · 529 阅读 · 0 评论 -
cgroup cpuset绑定nginx进程核数
libcgroup查看cpunumactl --hardwareavailable: 2 nodes (0-1)node 0 cpus: 0 1 2 3 4 5 6 7node 0 size: 65141 MBnode 0 free: 31975 MBnode 1 cpus: 8 9 10 11 12 13 14 15node 1 size: 65536 MBnode 1 free: 36661 MBnode distances:node 0 10...原创 2022-01-06 11:05:37 · 1364 阅读 · 0 评论 -
nginx phase handler处理及log phase处理
nginx的phase共有11个,就是众所周知的十一个处理阶段,使用 ngx_http_phase_t 结构存储每个阶段可用的处理函数(handler),它实际上是动态数组 ngx_array_t,元素类型为 ngx_http_handler_pt,存储在ngx_http_core_main_conf_t中:typedef struct {ngx_array_t servers; /* ngx_http_core_srv_conf_t */...原创 2022-01-06 10:41:17 · 1802 阅读 · 0 评论 -
nginx知识点整理
配置解析ngx_http_blockngx_http_core_serverngx_http_optimize_serversinstance配置解析ngx_event_process_init:遍历connections,初始化listenfd的回调函数,添加事件监听static ngx_int_tngx_event_process_init(ngx_cycle_t *cycle){...cycle->connections =...原创 2022-01-05 14:14:50 · 1175 阅读 · 0 评论 -
nginx关闭请求处理ngx_http_finalize_request源码分析
ngx_http_finalize_request各个http模块在执行完某个操作都需要调用这个函数,来把请求的引用计数减去1,当引用计数为0时才会真正释放一个请求。这个函数实现比较复杂,考虑了各种场景,我们分别来看下这些场景。(1)当执行某个操作结束后:例如把读事件从epoll红黑树中删除时。 这个操作执行完成后,会调用这个函数,表示这个操作已经完成了,需要把这个操作对应的引用计数给减去1:典型的还比如upstream结束,子请求结束等调用。//由各个http模块调用的,释放h...原创 2022-01-04 13:40:17 · 1594 阅读 · 0 评论 -
nginx里的epoll与read write事件
epoll原理n = epoll_wait(epfd,events,20,500);for(i=0;i<n;++i){c = event_list[i].data.ptr;c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~3);/* 连接有可读事件,且该读事件是active活跃的 */if ((revents & EPOLLIN) && rev->active) {...原创 2022-01-04 11:05:51 · 710 阅读 · 0 评论 -
nginx共享内存原理和源码分析
简介nginx 共享内存是利用 mmap 将内容存储在内存中以及自旋锁。当 master 启动的时候,根据相应的指令去初始化共享内存。利用共享内存实现一个轻量级的 k/v 系统。全局变量ngx_cycle_s 结构struct ngx_cycle_s {void ****conf_ctx; //配置上下文数组(含所有模块)ngx_pool_t *pool; //内存池ngx_log_t *log; //日志ngx_log_t new_log;ngx_conne原创 2021-12-27 10:16:04 · 1621 阅读 · 2 评论 -
nginx upstream回源代码完整分析
nginx回源源码分析原创 2021-12-01 19:17:29 · 655 阅读 · 0 评论 -
nginx ngx_event_t结构体详解
nginx的ngx_event_t结构体:为添加到循环event事件使用的event事件结构体。原创 2021-11-30 16:02:04 · 2290 阅读 · 0 评论 -
tengine ngx_http_reqstat_module源码分析&移植
tengine ngx_http_reqstat_module源码分析。监视的运行状况有:连接数、请求数、各种响应码范围的请求数、输入输出流量、rt、upstream访问等。并集成到openresty中。原创 2021-11-25 15:07:23 · 2156 阅读 · 3 评论