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

时间: 2024-10-10 18:10:30

lvs squid相关的相关文章

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

一安装LVS准备: 1.准备4台Centos 6.2 x86_64 注:本实验关闭 SELinux和IPtables防火墙. 管理IP地址 角色 备注 192.168.1.101 LVS主调度器(Master Director) 对外提供服务的VIP为192.168.1.180 192.168.1.114 LVS从调度器(Backup Director) 平时可以作为RS(真实服务器使用) 192.168.1.104 RS1(真实服务器)   192.168.1.103 RS2(真实服务器)  

LVS负载均衡之持久性连接介绍(会话篇)

在实际生产环境中,往往需要根据业务应用场景来设置lvs的会话超时时间以及防session连接丢失的问题提,如在业务支付环节,如若session丢失会导致重复扣款问题,严重影响到安全性,本小节解将会讲到关于lvs持久性连接问题 一.lvs负载均衡持久连接介绍: 引子(案例) 对于电子商务网站来说,用户在挑选商品的时候使用的是80端口来浏览的,当付款的时候则是通过443的ssl加密的方式,当然当用户挑选完商品付款 的时候,我们当然不希望https的443跳转到另外一台REAL SERVER上,很显然

Squid做代理的一些应用

一.squid acl访问控制 mv squid.conf squid.conf.backup egrep -v "^#|^$" squid.conf.backup > squid.conf [[email protected] etc]# wc -l squid.conf 44 squid.conf 1)对url进行关键字过滤 在squid.conf文件中添加如下两行: acl qq url_regex -i ^http://.*qq.*$ http_access deny q

squid配置

[转载请注明来源_hera] ★squid应用 用为缓存 squid用作缓存可以节省宝贵的带宽资源,也可以大大降低服务器的I/O 用为代理 squid可以用作正向代理和反向代理 =>正向代理:代理用户 正向代理相当于是一个介于用户端和原始服务器之间的代理服务器(即squid后面是客户端,前面是原始服务器),当客户端无法直接访问原始服务器的时候,但是它能访问代理服务器,这时候它就可以向代理服务器发送一个请求并指定目标为原始服务器,然后代理服务器向原始服务器转交请求并将从原始服务器获得的内容返回给客

squid 安装简单说明

suid 下载及安装 1. squid 安装硬件要求 Squid运行在所有流行的Unix系统上,也可以在Microsoft Windows上运行.尽管squid的Windows支持在不断改进,但也许在Unix上容易一些.假如你有一个喜欢的操作系统,我建议你使用那个.否则,假如你找人推荐,我很喜欢FreeBSD. squid对硬件要求不算高.内存是最重要的资源.内存短缺会严重影响性能.磁盘空间也是另一个重要因素.更多的磁盘空间意味着更多的缓存目标和更高的命中率.快速的磁盘和驱动器也是有利的.如果你

18.6 负载均衡集群介绍;18.7 LVS介绍;18.9 LVS NAT模式搭建(上);18.10 LVS NAT模式搭建(下)

扩展: lvs 三种模式详解 http://www.it165.net/admin/html/201401/2248.html lvs几种算法 http://www.aminglinux.com/bbs/thread-7407-1-1.html 关于arp_ignore和 arp_announce http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html lvs原理相关的   http://blog.csdn.net/pi9nc/

Lvs+Keepalived负载均衡方案

之前做的负载均衡,有需要的可以看一下. 这里列几个刚开始接触lvs时比较模糊的概念: LVS: Linux 虚拟服务器(Linux Virtual Server)是一组用来在真实服务器间平衡 IP 负载的整合软件组件,在linux2.4以后,LVS已经是linux内核的一部分. IPVS:IP虚拟服务器(IP Virtual Server)是运行在LVS下的提供负载平衡功能的一种技术. ipvsadm:ipvs的一个客户端工具. keepalived:是VRRP协议的完美实现,keepalive

lvs基础知识

一.LVS概述 LVS是Linux Virtual Server的简称,也叫Linux虚拟服务器,是一个由章文嵩教授主持开展的开源项目,官方站点为www.linuxvirtualserver.org.现在LVS已经是Linux内核的一部分,不需要编译内核.但在Linux2.4之前,要使用LVS需要将ipvs编译进内核才能使用. LVS提供的负载均衡技术和Linux操作系统实现了一个高性能的服务器集群,有良好的扩展性.可靠性和可操作性,极大地减轻了后台服务器的压力. LVS只要由三个部分组成:调度

LVS+Keepalived实现DBProxy的高可用

背景 在上一篇文章美团点评DBProxy读写分离使用说明实现了读写分离,但在最后提了二个问题:一是代理不管MySQL主从的复制状态,二是DBProxy本身是一个单点的存在.对于第一个可以通过自己定义的检测规则进行操作Admin接口,实现主从状态异常的处理.而对于第二个问题,需要再起一个DBProxy来防止单点故障,本文通过介绍LVS来实现DBProxy的负载均衡和高可用.MySQL的架构如下: LVS基础 http://www.linuxvirtualserver.org/zh/lvs1.htm