lvs squid相关
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相关的更多相关文章
- CentOS下LVS DR模式负载均衡配置详解
一安装LVS准备: 1.准备4台Centos 6.2 x86_64 注:本实验关闭 SELinux和IPtables防火墙. 管理IP地址 角色 备注 192.168.1.101 LVS主调度器(Ma ...
- LVS+Keepalived实现DBProxy的高可用
背景 在上一篇文章美团点评DBProxy读写分离使用说明实现了读写分离,但在最后提了二个问题:一是代理不管MySQL主从的复制状态,二是DBProxy本身是一个单点的存在.对于第一个可以通过自己定义的 ...
- lvs学习笔记
本人身为一个网工,最近一直在工作中学习linux的相关知识.前短时间通过自查资料学习了lvs的相关内容,摘录部分整理后和大家分享,内容较多,较琐碎,望见谅!!! LVS 从Linux内核版本2.6起, ...
- 高并发场景 LVS 安装及高可用实现
1.1 负载均衡介绍 1.1.1 负载均衡的妙用 负载均衡(Load Balance)集群提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据处理能力.提高网 ...
- LVS DR模式配置
关于LVS的相关介绍,以下两篇文章均做了具体的介绍: http://www.linuxvirtualserver.org/zh/lvs1.html http://www.cnblogs.com/liw ...
- LVS负载均衡之持久性连接介绍(session篇)
在实际生产环境中,往往需要根据业务应用场景来设置lvs的会话超时时间以及防session连接丢失的问题提,如在业务支付环节,如若session丢失会导致重复扣款问题,严重影响到安全性,本小节解将会讲到 ...
- 利用Squid + DNSPOD 搭建CDN服务器
首先下载squid for windows安装包 squid-2.7.STABLE5-bin.zip 然后解压缩,放到C盘squid目录内. 进入目录C:\squid\etc内,将所有文件的.defa ...
- Linux实战教学笔记42:squid代理与缓存实践(一)
第1章 Squid介绍 1.1 缓存服务器介绍 缓存服务器(英文意思cache server),即用来存储(介质为内存及硬盘)用户访问的网页,图片,文件等等信息的专用服务器.这种服务器不仅可以使用户可 ...
- 教你用squid做CDN把公司做到上市
我们都知道CDN(内容分发网络)是用来给网站加速用的,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络的“边缘”,使用户可以就近取得所需的内容,以提高用户访问网站 ...
随机推荐
- async & await (转载)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们 编程埋下了一些 ...
- PCA tries to preserve linear structure, MDS tries to preserve global geometry, and t-SNE tries to preserve topology (neighborhood structure)
https://colah.github.io/posts/2014-10-Visualizing-MNIST/
- 2017-2018-1 20179209《Linux内核原理与分析》第四周作业
本周学习内容为<跟踪分析MenuOS简单linux系统的启动过程>和教材中的进程调度及内核数据结构. 一.跟踪分析Linux内核的启动过程 这个实验我是在实验楼环境中完成的,最初想在自己的 ...
- 响应式布局【3】 --- bootstrap
本片文章主要讲解Bootstrap中如何实现响应式布局的. 参考资料&内容来源: https://code.ziqiangxuetang.com/bootstrap/bootstrap-gri ...
- ubuntu 更新软件命令
安装软件最好加权限(sudo) --default-timeout=100 设置超时时间100秒 install -U setuptools 表示更新安装setuptools sudo pip3 -- ...
- 多线程(三) iOS中的锁
锁的类别:互斥锁,递归锁,条件锁,自旋锁等 锁的实现方式:NSLock,NSRecursiveLock, NSConditionLock,@synchronized,GCD的信号量等 下面说一下常用的 ...
- html--<meta>设置缓存
html头文件设置常用之<meta>设置缓存 <meta http-equiv="pragma" content="no-cache"&g ...
- 【Leetcode-easy】ZigZag Conversion
思路1:String[numRow]行字符串数组.读取原始字符串每一个字符,设置行变量 nrow和行标志位flag(向下一行为1或向上一行为-1).将该字符连接到数组中对应的行字符串,同时nrow+= ...
- Spring Boot 生成接口文档 swagger2
swagger,中文“拽”的意思.它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试. 另外swagger很容易构建restful风格的api,简单优 ...
- office 2010 激活工具 迷你KMS使用说明
“迷你KMS”——“”体态轻盈仅只1MB.但却一身承担两大职能:KMS服务器和客户激活端.“迷你KMS”可激活Microsoft Office 2010系列三大版本,以及Windows 7企业.专业版 ...