nginx使用了间接回调机制。结合upstream机制的使用来说明一下,首先明白几个事实:

1)事实上ngxin和下游client的连接使用的是ngx_http_connection_t,每一个连接相应着一个读事件、一个写事件,epoll监听队列监听的是事件(ngx_event_t),可是事件的data字段相应于这个事件所属的连接(ngx-connection_t)。可是nginx和上游server之间的连接使用的ngx_peer_connection_t。事实上ngx_peer_connection_t是ngx_connection_t结构体的封装,前者包含了后者。算是后者的高级应用

2)ngx_connection_t相应nginx和client的连接。每一个这种连接都有一个请求(ngx_http_request_t)与之相相应。同一时候请求中有连个字段,write_event_handler和read_event_handler,这连个字段属于请求的读写回调,可是他非常显然不能被激活,能激活的就是读写事件(ngx_event_t)

3)在HTTP请求的后期阶段,nginx通过连接上的读写事件回调(这个已经被epoll监控)来间接调用请求上的读写回调。这么一来,假设想该变请求上的流程。仅仅须要改动

ngx_http_request_t上的read_event_handler和write_event_handler就可以。这种实现能够在ngx_http_handler函数中体现

4)nginx在处理upstream和上游的连接时,每个upstream连接(ngx_peer_connection_t)相应一个upstream机制(ngx_http_upstream_t)。由于upstream的连接也能够看成ngx-connection_t,所以和ngx_connection_t类似,ngx_http_upstream_t中也有两个字段read_event_handler和write_event-handler,这样在处理和上游的连接上的读写回调时也是间接调用了ngx_http_upstream_t的读写回调函数
这个在ngx_http_upstream_connection中能够看到 c=u->peer.connection。这里的c(ngx-connection_t)是和上游server之间的连接

c->write->hanlder = ngx_http_upstream_handler,在这一行和接下来的几行。认真阅读,会发现ngx_http_upstream_handler和ngx_http_handler有相似之处

5)这么一来,在接下来的处理中仅仅需关注ngx_http_upstream_t上的读写(write_event_handler & read_event_handler)就可以完毕nginx和上游server之间的交互,仅仅需关系ngx_http_request_t中的读写(write_event_handler & read_event_handler)就可以完毕nginx和client之间的监护

(总结:在连诶http请求和经过upstream机制的请求时,一定要明确当前的ngx_connection_t是指nginx和谁之间的连接)

nginx的源代码分析--间接回调机制的使用和类比的更多相关文章

  1. Android源代码分析-资源载入机制

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 我们 ...

  2. nginx源码分析:module机制

    根据nginx官方文档,添加一个module的介绍,当我们需要添加一个module时,需要以下操作: 1.为该module新建一个目录. 2.添加一个config文件,一个module核心代码源文件. ...

  3. Memcached源代码分析 - Memcached源代码分析之消息回应(3)

    文章列表: <Memcached源代码分析 - Memcached源代码分析之基于Libevent的网络模型(1)> <Memcached源代码分析 - Memcached源代码分析 ...

  4. nginx源代码分析--进程间通信机制 &amp; 同步机制

    Nginx源代码分析-进程间通信机制 从nginx的进程模型能够知道.master进程和worker进程须要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号, ...

  5. hostapd源代码分析(二):hostapd的工作机制

    [转]hostapd源代码分析(二):hostapd的工作机制 原文链接:http://blog.csdn.net/qq_21949217/article/details/46004433 在我的上一 ...

  6. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  7. Nginx源代码分析—业务流程

    Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...

  8. Android 中View的绘制机制源代码分析 一

    尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...

  9. Java提高篇——通过分析 JDK 源代码研究 Hash 存储机制

    HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实 ...

随机推荐

  1. LibreOJ2045 - 「CQOI2016」密钥破解

    Portal Description 给出三个正整数\(e,N,c(\leq2^{62})\).已知\(N\)能表示成\(p\cdot q\)的形式,其中\(p,q\)为质数.计算\(r=(p-1)( ...

  2. 【bzoj2440】[中山市选2011]完全平方数 莫比乌斯反演

    Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱.这天是小 ...

  3. Zygote原理学习

    1 zygote分析 1.1 简介 Zygote本身是一个NATIVE层的应用程序,与驱动.内核无关.前面已经介绍过了,zygote由init进程根据init.rc配置文件创建.其实本质上来说,zyg ...

  4. linux-3.2.36内核启动1-启动参数(arm平台 启动参数的获取和处理,分析setup_arch)【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/17093297 最近公司要求调试一个内核,启动时有问题,所以就花了一点时间看看内核启动. 看的过 ...

  5. 反汇编->C++虚函数深度分析

    先来查看一简单例子 #include<iostream> using namespace std; class Base{ public: virtual void f() { cout ...

  6. Linux 之 文件内容查看

    文件内容查看 参考教程:[千峰教育] 文件内容查看: cat: 作用:一次性顺序显示文件的所有内容 格式:cat file tac: 作用:一次性倒序显示文件的所有内容 格式:tac file hea ...

  7. poj 1573(搜索)

    Robot Motion Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12351   Accepted: 5982 Des ...

  8. LeetCode OJ--Median of Two Sorted Arrays ***

    http://oj.leetcode.com/problems/median-of-two-sorted-arrays/ 找两个有序数组的中位数,因为有序数组,并且复杂度要求O(lg(m+n))所以想 ...

  9. 小程序-引用其他js文件

    我也是小白菜,之所以有这个记录是因为我做项目时遇到了这个问题 流程: 1.需要建立一个js文件   content.js function myContent() { console.log(&quo ...

  10. BZOJ2243 [SDOI2011]染色(树链剖分+线段树合并)

    题目链接 BZOJ2243 树链剖分 $+$ 线段树 线段树每个节点维护$lc$, $rc$, $s$ $lc$代表该区间的最左端的颜色,$rc$代表该区间的最右端的颜色 $s$代表该区间的所有连续颜 ...