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中增加一层新的网络架构,将网站的内容发布到最接近用户的网络的“边缘”,使用户可以就近取得所需的内容,以提高用户访问网站 ...
随机推荐
- 怎么利用jquery.form 提交form
说明:开发环境 vs2012 asp.net mvc c# 利用jQuery.form.js提交form 1.HTML前端代码 <%@ Page Language="C#" ...
- django使用自己的setting的方法
创建一个自己的setting xxx.setting export DJANGO_SETTINGS_MODULE="xxx.setting" 然后在项目中import原生的sett ...
- Git you are not allowed to push code to protected branches on this project?
error: You are not allowed to push code to protected branches on this project....error: failed to pu ...
- php中$t=date()函数参数意义及时间更改
php中date()函数用的最多的是:date('Y-m-d H:i:s', time()); 这里面的参数意义分别是:Y - 年,四位数字; 如: "2016":m - 月份, ...
- OpenCV改变像素颜色
Mat src=imread("image/color.jpg"); imshow("a",src); int i,j; int cPointR,cPointG ...
- Qt — 子窗体操作父窗体中的方法
父窗体与子窗体各自的代码如下: 1. 父窗体的代码: void FartherWindow::addactions() { SubWindow subwindow(this); // 把父窗体本身t ...
- 友盟分享到微信的几点备忘(IOS)
1.下载最新的友盟分享版本,参考友盟官方的demo 2.注册微信开放平台用户,不是公众平台,注册应用 3.参考文档和demo,加入sdk包和相应的lib 4.在plist加入URL types.URL ...
- oops信息的分析【转】
本文转载自:https://blog.csdn.net/zhangchiytu/article/details/8303172 oops是英语口语"糟糕"的意思,当LINUX 内核 ...
- BMP文件解析【转】
本文转载自:http://blog.csdn.net/Blues1021/article/details/44954817 BMP文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多 ...
- 9.1 NOIP普及组试题精解(2)
9-4 soldier.c #include <stdio.h> #define MAXN 21 }; int n, m, x, y; //n,m为B点的行列坐标位置,x,y为马的坐标位置 ...