http://zh.linuxvirtualserver.org/

这几天在要对用户请求过来的post 的body内容进行处理,就具体了解了一下squid 处理post请求的具体流程,在这里具体分享一下。具体描述如下:

1、当一个请求到达squid,squid首先读取用户请求的内容,调用的函数是clientReadRequest,在clientReadRequest后,squid获取了客户端发来的请求内容,主要是header头,如果body较小的话,也会把body内容带过来,

2、squid读完请求后便开始尝试解析请求,进入函数clientTryParseRequest,解析请求的时候会判断方法是不是post, post请求的content-length值是多少,如果content-length头存在,且大于0,就会设置相应的request->body_reader = clientReadBody,request->body_reader_data = conn,其实就是设置读body的函数,这里如果body大于squid设置的限制的话,请求就会被丢弃。

3、这样就进入了squid处理请求的通用流程中(相应的acl校验-->clientProcessRequest-->MISS流程-->fwdStart-->httpStart-->httpSendRequest)在httpSendRequest中,会首先发送header到源站,然后进入httpSendRequestEntry流程,

4、httpSendRequestEntry函数,调用requestReadBody 函数,并设置body的处理函数为httpRequestBodyHandler,requestReadBody函数读取会调用先前第2步注册的request->body_reader回调,也就是clientReadBody函数从conn.in.buf中将body数据读出来,然后clientReadBody函数调用clientProcessBody函数,clientProcessBody 就数处理body的函数,在这里就是调用在第4步开头提到的body处理函数httpRequestBodyHandler,来处理body

5、body作何处理呢?当然是发送给源站,在将body发给源站后,如果发现还有body需要读,需要处理就又要进入第4步的httpSendRequestEntry流程。如果body已经读完、发完,就要进入httpSendRequestEntryDone,做发送完成的处理。

以上就是squid处理post请求的主要流程,但是看完以上流程,您可能还不了解squid读到客户端的body,如果body很大,一次读不完需要多次读的情况下,以上过程是怎么联动起来的呢?这就要重新回到第一步,去解读clientReadRequest函数了,毕竟所有的用户的数据都是从这里读入的。

在clientReadRequest函数中,在读到用户数据以后,把这些数据当做请求处理之前,会判断conn->body.callback是否为空,如果不为空就直接调用clientProcessBody,这样就进入了上面的第4步啦。而第4步中提到的httpRequestBodyHenadler正式这个conn->body.callback,这样的话,clientReadRequest读到的数据就能直接发送到源站了,在此你可以体会到callback这类回调函数的威力了把!

如有疑问欢迎回帖一起讨论。

from:http://blog.sina.com.cn/s/blog_68d83f050100otey.html

lvs squid相关的更多相关文章

  1. CentOS下LVS DR模式负载均衡配置详解

    一安装LVS准备: 1.准备4台Centos 6.2 x86_64 注:本实验关闭 SELinux和IPtables防火墙. 管理IP地址 角色 备注 192.168.1.101 LVS主调度器(Ma ...

  2. LVS+Keepalived实现DBProxy的高可用

    背景 在上一篇文章美团点评DBProxy读写分离使用说明实现了读写分离,但在最后提了二个问题:一是代理不管MySQL主从的复制状态,二是DBProxy本身是一个单点的存在.对于第一个可以通过自己定义的 ...

  3. lvs学习笔记

    本人身为一个网工,最近一直在工作中学习linux的相关知识.前短时间通过自查资料学习了lvs的相关内容,摘录部分整理后和大家分享,内容较多,较琐碎,望见谅!!! LVS 从Linux内核版本2.6起, ...

  4. 高并发场景 LVS 安装及高可用实现

    1.1 负载均衡介绍 1.1.1 负载均衡的妙用 负载均衡(Load Balance)集群提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据处理能力.提高网 ...

  5. LVS DR模式配置

    关于LVS的相关介绍,以下两篇文章均做了具体的介绍: http://www.linuxvirtualserver.org/zh/lvs1.html http://www.cnblogs.com/liw ...

  6. LVS负载均衡之持久性连接介绍(session篇)

    在实际生产环境中,往往需要根据业务应用场景来设置lvs的会话超时时间以及防session连接丢失的问题提,如在业务支付环节,如若session丢失会导致重复扣款问题,严重影响到安全性,本小节解将会讲到 ...

  7. 利用Squid + DNSPOD 搭建CDN服务器

    首先下载squid for windows安装包 squid-2.7.STABLE5-bin.zip 然后解压缩,放到C盘squid目录内. 进入目录C:\squid\etc内,将所有文件的.defa ...

  8. Linux实战教学笔记42:squid代理与缓存实践(一)

    第1章 Squid介绍 1.1 缓存服务器介绍 缓存服务器(英文意思cache server),即用来存储(介质为内存及硬盘)用户访问的网页,图片,文件等等信息的专用服务器.这种服务器不仅可以使用户可 ...

  9. 教你用squid做CDN把公司做到上市

    我们都知道CDN(内容分发网络)是用来给网站加速用的,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络的“边缘”,使用户可以就近取得所需的内容,以提高用户访问网站 ...

随机推荐

  1. Linuxt图形界面安装

    通常安装图形界面需要安装Xorg.桌面环境(Gnome.KDE.xfce等).字体等.你的Linux是什么版本?具体要看你的linux来决定用什么命令来安装. #yum grouplist 自己看看列 ...

  2. 常用sql集锦

    1.从数据库A中把表tableA导入到数据库B中 --如果主键是自增,则必须列出具体字段.-- select * into tableA from A..tableA 2.批量更改表中某列中的某个字符 ...

  3. windowsphone8.1学习笔记之应用数据(一)

    数据存储分为两种:云存储和应用数据(即本地存储),wp中的应用数据分为两种,一种是应用设置:一种是应用文件.wp的数据相关都是通过ApplicationData来实现,一个程序只有数据存储区. 先说应 ...

  4. 怎样做大做强企业中的ERP?

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/luozhonghua2014/article/details/37672409           ...

  5. 取得微信用户OpenID

    公司需要微信这个平台和用户交流,于是开始研究微信公众平台.微信公众平台分为两种模式,其一是编辑模式,比如用户发什么内容,你可以响应什么内容.另外一种便是开发模式,这个模式功能丰富,不仅仅可以获取到用户 ...

  6. Javascript代码收集

    1.模仿jquery each 原文地址 function each(obj, fn){ var i; if(Object.prototype.toString.call(obj) === '[obj ...

  7. empty blank

    非nil对象才能调用 empty nil: 对象是否存在empty: ”“ []blank: nil emptypresent: ! blank

  8. Machine Learning No.10: Anomaly detection

    1. Algorithm 2. evaluating an anomaly detection system 3. anomaly detection vs supervised learning 4 ...

  9. iOS SDK:iOS调试技巧

    感谢原创 在程序中,无论是你想弄清楚为什么数组中有3个对象而不是5个,或者为什么一个新的玩家开始之后,游戏在倒退——调试在这些处理过程中是比较重要的一部分.通过本文的学习,我们将知道在程序中,可以使用 ...

  10. cmd 环境变量设置方法详细解释

    cmd设置环境变量可以方便我们bat脚本的运行,但是要注意的是变量只在当前的cmd窗口有作用(局部生效),如果想要设置持久的环境变量需要我们通过两种手段进行设置:一种是直接修改注册表,另一种是通过我的 ...