Nginx
文章平均质量分 80
alpha_2017
这个作者很懒,什么都没留下…
展开
-
Nginx源码分析 - 核心模块初始化顺序,根据ctx创建上下文
1. 在ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle)函数中,取出核心模块,然后创建上下文2. 使用GDB打印断点查看内容原创 2021-06-10 22:39:37 · 251 阅读 · 0 评论 -
Nginx源码分析 - 模块的赋值及编号 --- 方便了解nginx模块
使用gdb跟踪在编译完成后,根据makfie的配置就生成了下面两种在main函数中完成了对模块的编号上图中的成员赋值,在下面gdb打印出的值是一致的,还可以打印共有多少个模块及模块的最大值...原创 2021-06-10 22:08:42 · 135 阅读 · 0 评论 -
Nginx惊群问题分析及解决
1. 惊群效应1.1 简介惊群问题又名惊群效应。简单来说就是多个进程或者线程在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒。唤醒后通常只有一个进程获得了该事件并进行处理,其他进程发现获取事件失败后又继续进入了等待状态,在一定程度上降低了系统性能。打个比方就是:当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。简单地说:就是扔一块食物,原创 2021-05-29 00:06:19 · 1568 阅读 · 0 评论 -
Nginx源码分析 - 基础数据结构篇 - 字符串结构 ngx_string.c(08)
目录一、数据结构定义1. ngx_str_t 字符串结构2. ngx_keyval_t 字符串K V结构一、数据结构图三、具体函数实现1. 初始化一个字符串 ngx_string2. 设置字符串Nginx的ngx_str_t字符串结构非常简单和好用。nxg_string.c文件中包含了很多常用的字符串操作方法,具体我们就不讲解了,主要简单来看下Nginx的字符串数据结构一、数据结构定义1. ngx_str_t 字符串结构/** * 字符串结构 */typ.原创 2021-05-11 23:18:49 · 539 阅读 · 0 评论 -
Nginx源码分析 - 实战篇 - 编写一个自定义的模块(24)
目录一、创建扩展模块目录二、创建config文件三、创建ngx_http_hello_module.c文件四、修改Nginx.conf文件五、编译Nginx源码六、浏览器访问从前面的篇章中,我们基本了解了Nginx的运行原理。Nginx整个框架都是通过模块的方式,对整个系统进行解耦和扩展。在HTTP的http/modules/目录下,有非常多的关于HTTP协议的模块,每个模块都有不同的功能。接下去我们就需要创建一个自定义的模块。一、创建扩展模块目录我们在nginx-1转载 2021-05-13 12:26:28 · 425 阅读 · 0 评论 -
Nginx源码分析 - 实战篇 - 编写一个阶段化的模块(25)
目录一、代码实例二、初始化绑定阶段处理三、回调函数写日志四、编译调试结果一、代码实例HTTP模块篇,我们讲过Nginx的HTTP阶段处理 《Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler》我们代码在《Nginx源码分析 - 实战篇 - 编写一个自定义的模块》的基础上,将定义一个回调函数挂载到HTTP处理的阶段上。#include <ngx_config.h>#include <ngx_core.h>#i转载 2021-05-13 12:26:42 · 220 阅读 · 0 评论 -
Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)
目录一、HTTP模块11个阶段处理二、阶段处理的初始化ngx_http_block三、阶段处理过程ngx_http_core_run_phases四、挂载自定义模块上一章我们讲解了HTTP request的解析过程。我们基本知道了Nginx是如何解析HTTP的行和头。这一章我们主要讲解Nginx的阶段处理(PHASE 状态机实现)。阶段处理的概念如何理解,我举个例子:一个HTTP请求过来,除了解析HTTP的行和头外,还需要解析URI的rewrite、接受HTTP BODY中的POST转载 2021-05-13 12:25:44 · 224 阅读 · 0 评论 -
Nginx源码分析 - HTTP模块篇 - HTTP Request解析过程(22)
目录一、HTTP Request解析流程图二、源码分析1. 等待read事件ngx_http_wait_request_handler2. 处理头部请求行ngx_http_process_request_line3. 处理HTTP协议的header部分ngx_http_process_request_headers4. 处理request信息ngx_http_process_request5. 核心分发函数ngx_http_handler上一章我们讲解了整个Nginx的tcp转载 2021-05-13 12:25:10 · 833 阅读 · 0 评论 -
Nginx源码分析 - HTTP模块篇 - TCP连接建立过程(21)
目录一、监听套接字初始化函数ngx_http_optimize_servers二、Nginx整个连接的过程上一章,我们讲解了HTTP模块是如何初始化的。这一章节,主要讲解监听套接字初始化函数ngx_http_optimize_servers和Nginx整个连接的过程一、监听套接字初始化函数ngx_http_optimize_serversngx_http_optimize_servers主要处理Nginx服务的监听套接字/** * ngx_http_optimize_servers转载 2021-05-13 12:24:54 · 185 阅读 · 0 评论 -
Nginx源码分析 - HTTP模块篇 - HTTP模块的初始化(20)
目录一、http模块的配置二、HTTP核心模块的数据结构三、ngx_http_block函数详解前面几章整理了Nginx的事件模块,这一章开始整理HTTP模块。HTTP模块的初始化工作,都在src/http/nginx_http.c 中的ngx_http_block函数中进行的。一、http模块的配置在看nginx_http_block之前,我们还必须看一下nginx.conf中 HTTP大模块的配置文件,只有理解了HTTP模块的配置,才能更好的理解HTTP模块如何初始化的。配转载 2021-05-12 23:07:42 · 329 阅读 · 0 评论 -
Nginx源码分析 - Event事件篇 - Epoll事件模块(19)
目录一、Epoll模块的数据结构1. epoll模块命令集 ngx_epoll_commands2. epoll模块上下文 ngx_epoll_module_ctx3. epoll模块配置 ngx_epoll_module二、Epoll模块的初始化1. 配置文件初始化ngx_events_block2. 模块初始化ngx_event_process_init三、核心函数1. ngx_epoll_process_events实现了收集、分发事件接口这一篇主要讲解一下..转载 2021-05-12 23:05:58 · 538 阅读 · 0 评论 -
Nginx源码分析 - Event事件篇 - Event模块的进程初始化(18)
目录一、源码分析1. Event核心模块ngx_event_core_module2. Event模块初始化ngx_worker_process_init3. 初始化核心函数ngx_event_process_init二、TCP连接和读取事件逻辑1. ngx_event_process_init 初始化事件循环2.ngx_http_init_connection 初始化http连接,读取read事件数据3. ls->handler的回调函数是如何赋值的前面一篇我..转载 2021-05-12 23:02:15 · 323 阅读 · 0 评论 -
Nginx源码分析 - Event事件篇 - Nginx的Event事件模块概览(17)
目录一、event模块的概览二、重要数据结构1. ngx_listening_s 侦听结构2. ngx_connection_s socket连接对象结构3. ngx_event_s 事件数据结构前一章,我们讲解了《Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理 》中实际上已经涉及到了一部分事件模块的概念。细心的可以发现,Nginx的事件都是由nginx_event.c文件中的ngx_process_events_and_timers进程事件分发器这个函数开..转载 2021-05-12 22:59:08 · 712 阅读 · 0 评论 -
Nginx源码分析 - Event事件篇 - Event模块和配置的初始化(16)
目录一、Event模块的数据结构1. event事件模块的配置2. ngx_events_module 事件模块3. ngx_event_core_module 事件核心模块4. ngx_event_conf_t 事件conf结构二、Event模块结构图三、Event模块的初始化1. ngx_event_module_init 模块初始化函数四、Event模块配置的初始化1. ngx_events_module 模块配置初始化2. ngx_conf_parse 解原创 2021-05-12 22:57:24 · 453 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理(15)
目录Nginx解决惊群和进程负载均衡处理的要点具体的实现1. ngx_process_events_and_timers 进程事件分发器2. ngx_trylock_accept_mutex 获取accept锁3. ngx_enable_accept_events 和 ngx_disable_accept_events4. ngx_event_process_posted 事件队列处理5. ngx_process_events 事件的核心处理函数Linux2.6版本之前还存在转载 2021-05-12 22:54:01 · 203 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 多进程实现(14)
目录一、Nginx多进程实现的流程图二、Nginx多进程具体实现1. ngx_master_process_cycle 进入多进程模式2. ngx_start_worker_processes 创建工作进程3. ngx_spawn_process fork工作进程4. ngx_worker_process_cycle 子进程的回调函数5. ngx_worker_process_init 工作进程初始化默认情况下,Nginx都是多进程的运行模式。Nginx和Memcached不原创 2021-05-12 22:51:44 · 358 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 解析配置文件(13)
目录一、Nginx的配置文件nginx.conf二、数据结构逻辑关系图三、相关数据结构1. ngx_cycle_s的conf_ctx和modules2. ngx_module_s的index和commands3. ngx_command_s 命令集的结构四、核心模块的定义1. 核心模块在nginx.c的文件头部2. 核心模块的配置结构ngx_core_conf_t五、具体解析流程1. 创建核心模块配置文件数据结构ngx_core_conf_t2. 创建一个临时转载 2021-05-12 22:49:30 · 761 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 模块的初始化(12)
目录一、模块的数据结构1. ngx_module_s 模块结构2. ngx_core_module 核心模块二、模块的初始化1. 模块编号处理ngx_preinit_modules2. 初始化cycle->modules 分配内存3. 每个模块进行初始化ngx_init_modules4. 统计有多少个模块ngx_count_modules5. 模块的工作进程初始化init_processNginx是高度模块化的,各个功能都会封装在模块中。例如core模块、HT转载 2021-05-12 22:43:52 · 292 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 全局变量cycle初始化(11)
目录一、数据结构1. ngx_cycle_t的数据结构2. ngx_core_conf_t的数据结构二、初始化过程1. 创建一个内存池。2. 拷贝配置文件的路径前缀(/usr/local/nginx)3. Nginx的路径前缀拷贝4. 拷贝配置文件信息5. 拷贝配置参数信息6. 路径信息初始化7. 初始化打开的文件句柄8. 初始化shared_memory链表9. 初始化listening数组10. 模块创建和核心配置结构初始化ngx_core_con原创 2021-05-12 22:39:33 · 396 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - 平滑重启和信号控制(10)
目录一、平滑重启二、信号处理一、平滑重启上一篇文章我们分析了Nginx的启动流程。其中ngx_add_inherited_sockets主要用于继承Socket文件句柄。Nginx有平滑重启的功能,通过平滑重启,可以让用户无感知并且不中断。#平滑重启 sudo kill -HUP `cat /usr/local/nginx-1.4.7/nginx.pid` Nginx支持热切换,为了保证切换之后的套接...原创 2021-05-11 23:26:35 · 350 阅读 · 0 评论 -
Nginx源码分析 - 主流程篇 - Nginx的启动流程(09)
目录一、Nginx的启动过程二、重要流程分析1. ngx_get_options 解析外部参数2. init_cycle 初始化全局变量3. 变量保存方法ngx_save_argv和ngx_process_options4. 给模块打标ngx_preinit_modules5. 创建PID文件ngx_create_pidfile前几篇主要介绍了Nginx比较常用的一些基础数据结构,例如pool,buf,array,list等。通过对Nginx基础数据结构的理解,能更好的帮助我转载 2021-05-11 23:23:03 · 383 阅读 · 0 评论 -
Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)
目录一、数据结构定义1. ngx_hash_elt_t hash表的元素结构2.ngx_hash_t hash表结构3. ngx_hash_init_t hash表初始化结构二、数据结构图三、具体函数实现1. 查找一个元素 ngx_hash_find2. 创建一个hash表 ngx_hash_initNginx的hash表结构和我们之前阅读memcached的时候看到的会有很大的差别。笔者在阅读Nginx的hash模块的时候,阅读了好几天,比较不容易理解,但是Nginx.转载 2021-05-11 23:16:58 · 243 阅读 · 0 评论 -
Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)
目录一、数据结构定义1. ngx_list_part_t 链表节点定义2. ngx_list_t 链表结构二、数据结构图三、具体函数实现1. 创建一个list ngx_list_create2. 使用一个list元素 ngx_list_pushNginx的list单向链表的结构和Nginx的数组结构Array有点类似,总体来说,数据结构也是非常简单清晰的。Nginx的单向链表也是固定了每个元素的大小,并且用单向链表的方式连接。一、数据结构定义1. ngx_list_转载 2021-05-11 23:14:15 · 151 阅读 · 0 评论 -
Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c(05)
目录一、数据结构定义二、数据结构图三、具体函数实现1. 链表常用操作方法2. 获取链表的主体结构 ngx_queue_dataNginx的链表结构非常小巧和简单。设计的非常精巧。通过链表的简单和精巧的设计,让Nginx的链表的数据结构和具体业务依赖进行了解耦。一般我们在设计c语言程序的时候,完全可以学习Nginx的这种数据结构的设计方式。一、数据结构定义链表数据结构 ngx_queue_ttypedef struct ngx_queue_s ngx_queue_t;转载 2021-05-11 23:12:29 · 137 阅读 · 0 评论 -
Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c(04)
目录一、数据结构定义1. 缓冲区内存块的数据结构 ngx_buf_t2. 缓冲区链表结构 ngx_chain_t二、数据结构图三、具体函数实现1. 创建一个缓冲区buf ngx_create_temp_buf2. 创建一个缓冲区的链表结构 ngx_alloc_chain_link3. 批量创建多个缓冲区buf ngx_create_chain_of_bufs4. 拷贝缓冲区链表 ngx_chain_add_copy5. 获取一个空闲的buf链表结构 ngx_chain转载 2021-05-11 23:10:35 · 504 阅读 · 0 评论 -
Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c(03)
前面一章我们介绍了Nginx的内存池的数据结构。Nginx的内存管理都是围绕内存池来实现的,包括array数组类型也是基于Nginx的pool来实现数据结构。Nginx的Array结构设计得非常小巧,主要用于存储小块内存。Nginx的数组每个元素的大小是固定的。一、数据结构定义ngx_array_t 数组的基础数据结构/* 数组Array数据结构 */typedef struct { void *elts; /* 指向数组第一个元素指针*/ ngx_uin转载 2021-05-11 23:06:38 · 200 阅读 · 0 评论 -
Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c(02)
Nginx的内存管理是通过内存池来实现的。Nginx的内存池的设计非常的精巧,很多场景下,我们可以将Nginx的内存池实现抽象出来改造成我们开发中的内存池。一、内存池一般我们使用malloc/alloc/free等函数来分配和释放内存。但是直接使用这些函数会有一些弊端:虽然系统自带的ptmalloc内存分配管理器,也有自己的内存优化管理方案(申请内存块以及将内存交还给系统都有自己的优化方案,具体可以研究一下ptmalloc的源码),但是直接使用malloc/alloc/free,仍然会导致内存分配转载 2021-05-11 23:03:40 · 163 阅读 · 0 评论 -
Nginx源码分析 - 初探Nginx的架构(01)
Nginx是我们日常使用非常多的一款服务器。Nginx的源码写的非常漂亮,是c语言学习和进阶的最好的学习资料。我们这里分析的是1.13.1的版本。一、源码目录下面我们先看下Nginx的目录结构:Nginx的源码主要分布在src/目录下,而src/目录下主要包含三部分比较重要的模块。core:包含了Nginx的最基础的库和框架。包括了内存池、链表、hashmap、String等常用的数据结构。event:事件模块。Nginx自己实现了事件模型。而我们所熟悉的Memcached是使用了转载 2021-05-11 22:52:46 · 550 阅读 · 0 评论 -
KeepAlived+Nginx 模拟nginx单点故障转移,实现高可用
架构双机高可用方法目前分为两种:1)Nginx+keepalived 双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。 2)Nginx+keepalived 双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状原创 2021-03-13 13:40:26 · 678 阅读 · 0 评论 -
nginx -- 负载均衡
正向代理反向代理负载均衡fastcgi配置原创 2021-02-27 14:52:21 · 121 阅读 · 0 评论 -
nginx master-worker进程间通信
父子进程间通信原创 2021-02-17 12:20:28 · 715 阅读 · 0 评论 -
nginx创建n个工作子进程
nginx创建n个工作子进程nginx属于多进程方案,那么是怎么创建n个进程的呢??原创 2021-02-16 17:13:19 · 451 阅读 · 0 评论 -
Nginx配置
1.nginx.confuser www www; ## Default: nobodyworker_processes 5; ## Default: 1error_log logs/error.log;pid logs/nginx.pid;worker_rlimit_nofile 8192;events { worker_connections 4096; ## Default: 1024}http { include conf/原创 2021-01-18 21:33:55 · 140 阅读 · 0 评论 -
Nginx连接池实现,源码阅读
1. 连接池的作用 为了提高Nginx的访问速度,Nginx使用了连接池。连接池是一个数组,里面预先分配了很多个(根据配置文件的配置)ngx_connection_s结构。当有客户端请求连接时,就从该数组中找到一个没有使用的ngx_connection_s,用来连接用户。当用户close时,Nginx并没有释放掉这些数组,而是标记为可连接,然后等待下个客户端的连接。参考资料:1.https://www.cnblogs.com/pizixu/articles/12456...原创 2020-10-18 10:40:12 · 298 阅读 · 0 评论 -
Nginx 内存池源码阅读
1. 内存分配逻辑:分配一块内存,如果分配的内存size小于内存池的pool->max的限制,则属于小内存块分配,走小内存块分配逻辑;否则走大内存分配逻辑。小内存分配逻辑:循环读取pool->d上的内存块,是否有足够的空间容纳需要分配的size,如果可以容纳,则直接分配内存;否则内存池需要申请新的内存块,调用ngx_palloc_block。大内存分配逻辑:当分配的内存size大于内存池的pool->max的限制,则会直接调用ngx_palloc_large方法申请一块独立的内存块,原创 2020-10-17 22:02:29 · 132 阅读 · 0 评论 -
VScode单步跟踪Nginx(虚拟机中搭建Nginx)源码
1. 在vscode中通过ssh连接虚拟机时,需要使用root权限2. 具体编译 编译nginx源码,debug版本过程wget http://nginx.org/download/nginx-1.13.7.tar.gzwget https://www.openssl.org/source/openssl-1.1.0g.tar.gzwget http://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gzwget http://www.zlib.net/zlib-原创 2020-10-15 23:10:53 · 1370 阅读 · 2 评论 -
nginx中的共享内存的3种方式
1. NGX_HAVE_MAP_ANON 匿名的文件映射2. NGX_HAVE_MAP_DEVZERO 关联了fd的映射 fd = open("/dev/zero", O_RDWR);3. NGX_HAVE_SYSVSHM 系统V则是通过映射shm文件系统中的文件实现进程间的共享内存通信。 也就是说,每个共享内存区域对应shm文件系统的一个文件./* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, ...原创 2020-10-11 21:42:52 · 1019 阅读 · 0 评论 -
Nginx源码阅读 --- http模块 --- TCP连接过程
Nginx整个连接的过程整个流程如下:在Nginx main函数的ngx_init_cycle()方法中,调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比如非阻塞、接受发送的缓冲区、绑定、监听处理) HTTP模块初始化优先于Event模块,HTTP模块通过ngx_http_block()方法进行初始化,然后调用ngx_http_optimize_servers()进行套接字的创建和初始化(ngx_http_init_...转载 2020-08-02 22:39:52 · 266 阅读 · 0 评论 -
Nginx源码阅读 ---- 模块的初始化过程,工作进程中初始化事件模块
1. 模块初始化过程,根据配置文件,先编号,然后记录上下文,然后调用create_conf函数2. 在工作进程中绑定连接函数:原创 2020-08-02 22:14:08 · 135 阅读 · 0 评论 -
Nginx源码阅读 --- nginx evnet事件接受请求时,函数执行过程
1. 首先了解几个地方:监听套接字listen可读后(提前准备好处理函数ngx_http_init_connection),建立连接(ngx_event_accept), 并把后续可读处理函数设置为(ngx_http_wait_request_handler),使用epoll_wait函数驱动整个过程进行2. 具体代码跟踪:当解析到配置文件http时,调用下面函数进行初始化监听处理函数,3. 当建立http请求后的处理过程:...原创 2020-08-02 22:08:59 · 163 阅读 · 0 评论