upstream 即上游的意思,是一个想对到概念,从客户端到中间的网络链路到服务器到链路中,可以将越接近客户到设备越理解成下游,相反到为上游,所以如果只有一个upstream,可以将其为理解成转发客户到请求到服务器,然后响应服务器转发到客户端到过程,源码主要流程如下:

1、创建upstream

ngx_http_upstream_init

删除超时定时器

创建到上游到请求

挂接一些处理函数,包含第6步中要用到的请求结束后upstream到清理函数

2、建立与上游的连接

ngx_http_upstream_connect

创建socket、connetion,发起tcp建连请求,使用epoll发送请求,挂接upstream的handler,包括第4、5步中处理上游应答的处理函数

3、发送到上游的请求

ngx_http_upstream_send_request

4、处理上游的响应头

process_header 解析请求头

ngx_http_upstream_process_headers处理请求头

5、处理上游的响应体

ngx_http_upstream_process_body_in_memory

如果需要转发相应体,可以自己实现input_filter,若不自己实现则使用默认的ngx_http_upstream_non_buffered_filter

(1)upstream与上游之间网速很快时,使用大内存甚至文件,缓存上游大请求

(2)upstream与下游之间网速很快时,使用固定大小内存,不需要过多缓存请求

ngx_http_upstream_send_response中通过判断

buffering决定走上述的那个流程

6、结束upstream 请求

ngx_http_upstream_cleanup

主要释放一些upstream使用的资源

传统方法中常用的钩子:

uscf->peer.init_upstream. 初始化 upstream配置,

在upstream配置初始化过程中用钩子us->peer.init初始化请求,

在初始化请求中往往创建请求和upstream的关系,然后用钩子peer.get定义获取后端服务器方法等,peer.free与peer.get匹配。

nginx源码中upstream的主要流程的更多相关文章

  1. nginx源码分析之hash的实现

    nginx实现了自己的hash数据结构,正如数据结构中讲述的那样,nginx用开放链表法解决冲突,不过不同的是一旦一个hash表被初始化后就不会被修改,即插入和删除,只进行查询操作,所以nginx通过 ...

  2. 菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)

    俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔.对复杂的nginx而言,main函数就是“牛之鼻”,只要能理清main函数,就一定能理解其中 ...

  3. nginx源码安装

    1,首先解决系统环境: 安装rpm包组{CentOS6 跟开发相关的包组:} a.  Development Tools #yum groupinstall "Development Too ...

  4. Nginx源码分析:3张图看懂启动及进程工作原理

    编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由陈科在高可用架构群分享.转载请注明来自高可用架构公众号「ArchNotes」.   导读:很多工程师及架构师都希望了解及掌握高性能服务器 ...

  5. nginx源码分析-源码结构

    本文主要简单介绍nginx源码目录结构.程序编译流程.如何构建学习nginx的环境等.本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该 ...

  6. 菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t[转]

    菜鸟nginx源码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...

  7. 菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上)[转]

    菜鸟nginx源码剖析数据结构篇(六) 哈希表 ngx_hash_t(上) Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...

  8. 菜鸟nginx源码剖析数据结构篇(五) 基数树 ngx_radix_tree_t[转]

    菜鸟nginx源码剖析数据结构篇(五) 基数树 ngx_radix_tree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blo ...

  9. nginx源码分析线程池详解

    nginx源码分析线程池详解 一.前言     nginx是采用多进程模型,master和worker之间主要通过pipe管道的方式进行通信,多进程的优势就在于各个进程互不影响.但是经常会有人问道,n ...

随机推荐

  1. IMSDroid问题集

    1.IMSDroid切换摄像头后的接收方横屏显示.事实上非常多种情况下都会突然发现就横屏了.解决的方法就是切换摄像头时同一时候切换横竖屏显示 2.IMSDroid掉音问题:IMSDroid通话几分钟后 ...

  2. Finder打开剪切功能

    在终端里输入 defaults write com.apple.finder AllowCutForItems 1 如果要改回来,把1改成0就可以了.

  3. str_replace 替换 小技巧

    // $id:1 $id:1,2,3,4,5 public function delete($id) { // 把1替换掉不允许删除ID为1的角色             在前面分别加了 , 号   ...

  4. Smart pointer 智能指针小总结

    Smart pointer line 58之后smart pointer里的计数已经是0,所以会真正释放它引用的对象,调用被引用对象的析构函数.如果继续用指针访问,会出现如下图的内存访问异常.所以说如 ...

  5. python入门课程 第一章 课程介绍

    1-1 Python入门课程介绍特点:    优雅.明确.简单适合领域:    web网站和各种网络服务    系统工具和脚本    作为"胶水"语言把其他语言开发的模块包装起来方 ...

  6. [Java开发之路](8)输入流和输出流

    1. Java流的分类 按流向分: 输入流: 能够从当中读入一个字节序列的对象称作输入流. 输出流: 能够向当中写入一个字节序列的对象称作输出流. 这些字节序列的来源地和目的地能够是文件,并且通常都是 ...

  7. 获取系统时间的DOS命令

    DOS C:\Users\yaozhendong>echo %date:~0,10% %time%2011/12/24 19:45:41.25 前段时间工作中需要对一个地址做定时PING操作,并 ...

  8. Python 基本数据类型和序列类型

    python 3.6.4 中,有9种数据类型: int, float, bool, complex, list, tuple, string, set, dict (1).int 整型,不可变 (2) ...

  9. WPF 支持集合绑定的控件

    WPF 支持集合绑定的控件 ListBox ComboBox ListView DataGrid

  10. Wooden Sticks(hdu1051)

    Wooden Sticks Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...