nginx配置初始化(1)
我会将开发中遇到的配置初始化问题记录下来,日后有时间会慢慢的整理起来
在开发中发现,自定义的create_loc_conf这个函数被调用了不止一次,于是通过打印堆栈结合源码进行了追踪,结果发现:
所有的调用都是从init_cycle这个函数作为入口点,这个函数做的事情如他的名字一样,初始化cycle结构体,这个结构体很重要,全程参与了配置文件的解析。nginx对配置文件的解析是状态机模式,状态是当前读到的token,行为是在cmd结构体中定义的对应这个token的回调函数,而这个token附加的类型则规定了回调函数的输入,比如如果是NGX_CONF_BLOCK,则解析会在读到block的末尾也就是大括号时结束,否则读到分号结束。
create_loc_conf这个函数第一次被调用是在读到http这个token,这个token string是在nginx的顶层出现,定义的函数是ngx_http_block,这个函数会处理整个block数据,在这个函数中,对各个http模块编号后,就开始调用模块的create_conf函数,从而create_loc_conf被调用了一次,所有create出来的数据会根据其分配的编号,放入cycle->ctx结构体。
然后在http内部,每个server token都会调用所有模块的create_srv_conf和create_loc_conf,而每个location token会调用所有模块的create_loc_conf。从而,实际create_loc_conf的调用次数是取决于配置文件的具体内容。
在开发中,本来试图在location段配置一个项,然后在init_worker中读取这个配置项,但既然是在worker进程初始化时用到的值那么这个值就应该是main_conf,因为对于worker进程而言并没有location的概念,只有当请求到来时,根据匹配规则才会将其分配到某个location下,这时可以通过r获取location的配置项,如hello world中的例子那样。