理解 Nginx 源码
文章平均质量分 93
本专栏是对 Nginx 高性能服务器源码的学习与理解。根据对其源码的解读,了解Nginx服务器的基本框架。
逆风微积分
目前从事Android系统框架层开发工作
展开
-
Nginx 中 upstream 机制的负载均衡
负载均衡upstream 机制使得 Nginx 以反向代理的形式运行,因此 Nginx 接收客户端的请求,并根据客户端的请求,Nginx 选择合适后端服务器来处理该请求。但是若存在多台后端服务器时,Nginx 是根据怎样的策略来决定哪个后端服务器负责处理请求?这就涉及到后端服务器的负载均衡问题。 Nginx 的负载均衡策略可以划分为两大类:内置策略 和 扩展策略。内置策略包含 加权轮询 和 IP_hash。原创 2015-02-06 19:30:05 · 4368 阅读 · 4 评论 -
Nginx 中 upstream 机制的实现
在Nginx中调用 ngx_http_upstream_init 方法启动 upstream 机制,但是在使用 upstream 机制之前必须调用ngx_http_upstream_create 方法创建 ngx_http_upstream_t 结构体,因为默认情况下 ngx_http_request_t 结构体中的 upstream 成员是指向 NULL,该结构体的具体初始化工作还需由 HTTP 模块完成。原创 2015-02-05 09:58:26 · 4592 阅读 · 0 评论 -
Nginx 中处理 HTTP 请求
在 Nginx 的初始化启动过程中,worker 工作进程会调用事件模块的 ngx_event_process_init 方法为每个监听套接字 ngx_listening_t 分配一个 ngx_connection_t 连接,并设置该连接上读事件的回调方法 handler 为 ngx_event_accept,同时将读事件挂载到 epoll 事件机制中等待监听套接字连接上的可读事件发生,到此,Nginx 就可以接收并处理来自客户端的请求。当监听套接字连接上的可读事件发生时,即该连接上有来自客户端发出的连接请原创 2015-01-31 09:13:48 · 7232 阅读 · 6 评论 -
Nginx 中 HTTP 模块初始化
本文更具体的分析 HTTP 模块的初始化过程。HTTP 模块初始化过程主要有:上下文结构初始化、配置项解析、配置项合并、server 相关端口设置。原创 2015-01-24 10:48:30 · 5484 阅读 · 18 评论 -
Nginx 事件驱动模块连接处理
由于 Nginx 工作在 master-worker 多进程模式,若所有 worker 进程在同一时间监听同一个端口,当该端口有新的连接事件出现时,每个 worker 进程都会调用函数 ngx_event_accept 试图与新的连接建立通信,即所有 worker 进程都会被唤醒,这就是所谓的“惊群”问题,这样会导致系统性能下降。幸好在 Nginx 采用了 ngx_accept_mutex 同步锁机制,即只有获得该锁的 worker 进程才能去处理新的连接事件,也就在同一时间只能有一个 worker 进程监原创 2015-01-19 20:16:07 · 2125 阅读 · 0 评论 -
Nginx 定时器事件
在 Nginx 中定时器事件的实现与内核无关。在事件模块中,当等待的事件不能在指定的时间内到达,则会触发 Nginx 的超时机制,超时机制会对发生超时的事件进行管理,并对这些超时事件作出处理。对于定时事件的管理包括两方面:定时事件对象的组织形式 和 定时事件对象的超时检测。原创 2015-01-18 22:07:37 · 1941 阅读 · 0 评论 -
Nginx 的 epoll 事件驱动模块
本文介绍在 Linux 系统下基于 Nginx 的事件驱动框架以及不同类型事件驱动模块的管理的 epoll 事件驱动模块。原创 2015-01-18 17:29:15 · 2534 阅读 · 0 评论 -
Nginx 事件模块
Nginx 是以事件的触发来驱动的,事件驱动模型主要包括事件收集、事件发送、事件处理(即事件管理)三部分。在 Nginx 的工作进程中主要关注的事件是 IO 网络事件 和 定时器事件。原创 2015-01-17 20:59:46 · 4583 阅读 · 0 评论 -
Nginx 源码结构分析
学习 Nginx 的构架之前,对 Nginx 源码结构进行简单的分析,可以了解 Nginx 模块结构以及模块之间的关系。充分理解 Nginx 的基本构架。解压源码到相应的文件后,我们可以看到有一个存放源码的目录文件 src,该目录文件存储 Nginx 所有的源代码。原创 2015-01-15 18:01:47 · 2550 阅读 · 0 评论 -
Nginx 中的 upstream 与 subrequest 机制
Nginx 提供了两种全异步方式与第三方服务进行通信:upstream 和 subrequest。upstream 在与第三方服务器交互时(包括建立 TCP 连接、发送请求、接收响应、关闭 TCP 连接),不会阻塞 Nginx 进程处理其他请求。subrequest 只是分解复杂请求的一种设计模式,它可以把原始请求分解为多个子请求,使得诸多请求协同完成一个用户请求,并且每个请求只关注一个功能。subrequest 访问第三方服务最终也是基于 upstream 实现的。 upstream 被定原创 2015-01-14 21:22:41 · 6832 阅读 · 5 评论 -
Nginx 配置解析
简单介绍了 Nginx 启动的过程,并分析了其启动过程的源码。在启动过程中有一个步骤非常重要,就是调用函数 ngx_init_cycle(),该函数的调用为配置解析提供了接口。配置解析接口大概可分为两个阶段:准备数据阶段 和 配置解析阶段;原创 2015-01-12 09:07:28 · 3179 阅读 · 0 评论 -
Nginx 启动初始化过程
本节分析了 Nginx 启动过程的源码原创 2015-01-11 16:27:02 · 2475 阅读 · 0 评论 -
Nginx 模块开发
通常,服务器启动时,任何 Handler 模块都有可能去处理配置文件中的位置(location)定义。若出现多个Handler 模块被配置成需要处理某一特定的位置location 时,最终只有其中一个Handler 模块是成功的。 若 Handler 模块的作用是把一个请求反向代理到后台服务器,则会出现另一种类型的空间模块—— Load-balancer(负载均衡器)。 Load-balancer 后端服务器会发出一个请求来决定哪个服务器接收请求。Nginx 目前支持两种 Load-bala原创 2015-01-09 10:22:09 · 7807 阅读 · 11 评论 -
Nginx 红黑树结构 ngx_rbtree_t
本文分析了 Nginx 红黑树的源码实现,其基本实现跟算法导论中的红黑树是一样的。原创 2015-01-07 17:41:27 · 2033 阅读 · 1 评论 -
Nginx 哈希表结构 ngx_hash_t
哈希表结合了数组和链表的特点,使其寻址、插入以及删除操作更加方便。哈希表的过程是将关键字通过某种哈希函数映射到相应的哈希表位置,即对应的哈希值所在哈希表的位置。但是会出现多个关键字映射相同位置的情况导致冲突问题,为了解决这种情况,哈希表使用两个可选择的方法:拉链法和开放寻址法。Nginx 的哈希表中使用开放寻址来解决冲突问题,为了处理字符串,Nginx 还实现了支持通配符操作的相关函数,原创 2015-01-06 22:07:09 · 1926 阅读 · 1 评论 -
Nginx 队列双向链表结构 ngx_queue_t
在 Nginx 的队列实现中,实质就是具有头节点的双向循环链表,这里的双向链表中的节点是没有数据区的,只有两个指向节点的指针。需注意的是队列链表的内存分配不是直接从内存池分配的,即没有进行内存池管理,而是需要我们自己管理内存,所有我们可以指定它在内存池管理或者直接在堆里面进行管理,最好使用内存池进行管理。原创 2015-01-06 09:58:18 · 2296 阅读 · 0 评论 -
Nginx 链表结构 ngx_list_t
ngx_list_t 是 Nginx 封装的链表容器,链表容器内存分配是基于内存池进行的,操作方便,效率高。Nginx 链表容器和普通链表类似,均有链表表头和链表节点,通过节点指针组成链表。原创 2015-01-04 20:59:09 · 1765 阅读 · 0 评论 -
Nginx 数组结构 ngx_array_t
在 Nginx 数组中,内存分配是基于内存池的,并不是固定不变的,也不是需要多少内存就申请多少,若当前内存不足以存储所需元素时,按照当前数组的两倍内存大小进行申请,这样做减少内存分配的次数,提高效率。原创 2015-01-04 14:39:07 · 1796 阅读 · 0 评论 -
Nginx 基本数据结构
在学习 Nginx 之前首先了解其基本的数据结构是非常重要的,这是入门必须了解的一个步骤。本节只是简单介绍了 Nginx 对基本数据的一种封装,包括 基本整型数据类型、字符串数据类型、缓冲区类型以及 chain 数据类型原创 2015-01-04 11:15:38 · 1636 阅读 · 0 评论 -
Nginx 内存池管理
本文简单介绍了Nginx 内存池的管理机制。 Nginx 使用内存池对内存进行管理,把内存分配归结为 大内存分配 和 小内存分配。若申请的内存大小比同页的内存池最大值 max 还大,则是大内存分配,否则为小内存分配。原创 2015-01-03 21:53:23 · 2099 阅读 · 0 评论 -
Nginx 配置文件
Nginx 是一个高性能、高并发的服务器,这里首先了解 Nginx 启动时读取的配置文件,大概了解其基本结构。原创 2015-01-03 16:01:48 · 2667 阅读 · 2 评论