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和谁之间的连接)

最新文章

  1. web api authentication
  2. 设计模式之美:Visitor(访问者)
  3. Technical reading July-15
  4. ThinkPHP在Ubuntu上 : mkdir的使用
  5. 用node-webkit 开发 PC 客户端
  6. Java for LeetCode 035 Search Insert Position
  7. C# 程序开始主要是写类和方法 的基本步骤和调用方法
  8. Atmega8型号细分区别
  9. HDU 1194 - Beat the Spread!
  10. Ksoap 使用简介
  11. out/target/common/obj/PACKAGING/public_api.txt android.view.KeyEvent.KEYCODE_has changed value from
  12. PACS发展历史
  13. Django REST framework+Vue 打造生鲜超市(七)
  14. jquery获取radio选中值及遍历
  15. CentOS搭建OpenVPN以及WIN&Android&iOS的安装连接
  16. vim折叠设置(转载)
  17. CSS学习笔记:盒子模型
  18. MariaDB 视图与触发器(11)
  19. java ftp上载下传 遇到的问题
  20. go语言之进阶篇error接口的使用

热门文章

  1. js对象的扁平化与反扁平化
  2. docker (centOS 7) 使用笔记3 - 修改docker默认的虚拟网址
  3. 关于sql语句实现将'1,2,3'转1,2,3等竖横转换问题
  4. 洛谷 P 1133 教主的花园
  5. 【CF1028A】Find Square(签到)
  6. poj 2492 A Bug's Life 二分图染色 || 种类并查集
  7. luogu 1327 数列排序 & 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节
  8. 回调函数 typedef bool (*IsUsed)(const string &name,boost::shared_ptr<ShpGeometry> oneGeometry);
  9. PL/SQL Developer工具包和InstantClient连接Oracle 11g数据库
  10. 牛客网 牛客小白月赛1 B.简单题2-控制输出格式