浅析varnish VCC结构

Apr 23, 2010

VARNISH版本:2.0.4

vcc是varnish configure compile的简称,vcl是varnish配置文件,VCC把vcl转化成C语言文件然后调用c编译器生成可执行文件并加载到当前进程。

下面是VCC在读vcl文件时用到的结构体:

/*-----------------------------------------------------

general c code: struct tokenlist tl->fc;

forward decls (.h like): struct tokenlist tl->fh;

init c code: struct tokenlist tl->fi;

finish c code: struct tokenlist tl->ff;

body code of methods: struct tokenlist tl->fm;

-----------------------------------------------------*/

一个很常见的结构体:主要记录生成C文件的信息和backend的信息:

struct vp{
sf: vcl.XXXXXXX.c
vcl: "backend default {\n .host=\"173.26.100.214\"/n .port=\"80\";\n}\n "
}

关于读入头文件的函数:

vcloutputlang_h(tl->fh):把include/vcl.h和include/vrt.h加载进tl->fh中。

VCC调用函数栈:

mgt_VccCompile()    [varnishd.c L371];
mgt_run_cc()        [mgt_vcc.c  L270];  /*建立临时C文件*/
SUB_run()           [mgt_vcc.c  L209];  /*生成子进程运行vcc*/
|            |->run_vcc()     /*把vcl文件转换成的c文件写入vp->sf*/
|                             |->VCC_Compile()       [mgt_vcc.c  L157];
|                                                 |->vcc_CompileSource()   [vrt.h      L657];  /*读取vcl文件, 并
|                                                      把相关的头文件和C函数写入临时C文件中*/
|                                                                        |->VCC进程结束
|
|--->生成编译选项,例如“exec cc -fpic -shared -Wl,-x -o ./vcl.2vcJS889.so ./vcl.2vcJS889.c”
|                            |-> run_cc  加载sh程序,编译sf,生成.so文件。
|                                              |-> CC进程结束
|
V

dlopen() 编译生成的.so文件以动态链接库的形式被加载到管理进程中去,到此vcc结束

Get In Touch With Us ...