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中增加一层新的网络架构,将网站的内容发布到最接近用户的网络的“边缘”,使用户可以就近取得所需的内容,以提高用户访问网站 ...
随机推荐
- HibernateTemplate方法的使用
1.查询帖子(Post)为例 查找所有的帖子 public List<Post> findPosts() { String hql = "from Post p left joi ...
- Chernoff-Hoeffding inequality -- Chernoff bounds, and some applications
https://www.cs.utah.edu/~jeffp/teaching/cs5955/L3-Chern-Hoeff.pdf [大数据-通过随机过程降维 ] When dealing with ...
- 流畅的python学习笔记第八章:深拷贝,浅拷贝,可变参数
首先来看赋值,浅拷贝,深拷贝. 一赋值: a=['word',2,3] b=a print id(a),id(b) print [id(x) for x in a] print [id(x) for ...
- RANDOM 的用法
random 用法 1.利用RANDOM取随机数 shell有一个环境变量RANDOM,范围是0--32767 如果我们想要产生0-25范围内的数:$(($RANDOM%26),在$(()) 是可以省 ...
- Gemini.Workflow 双子工作流入门教程一:定义流程:流程图属性
简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:流程定义:流程图属性. 步骤一:在流程管理的流程定 ...
- 7-10 括号匹配(25 分) 【STL】
7-10 括号匹配(25 分) 给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行中给出一行字 ...
- logback 配置详解(下)
logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写 ...
- JAVA- JDBC之DBHelper
package com.myit.util; import java.lang.reflect.Field; import java.sql.Connection; import java.sql.D ...
- jQuery选项卡tabulous
jQuery选项卡tabulous,jQuery,选项卡,tab标签切换代码,扁平设计,jQuery选项卡tabulous是一款支持Scale.Slide.Scale Up.Flip等效果jquery ...
- PHP的深copy和浅copy
1.对象复制的由来 为什么对象会有“复制”这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 /** * 电视机类 */ class Television { /** * ...