这一部分,我们看看nginx怎样来组织http block,server block和location location的。
1、 ngx_http_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
首先设置一个ngx_http_conf_ctx_t结构,即ctx。
typedef struct {
void **main_conf;
void **srv_conf;
void **loc_conf;
} ngx_http_conf_ctx_t;
在分析这个结构中成员的作用时,先来看这样一个结构:
typedef struct {
ngx_int_t(*preconfiguration)(ngx_conf_t *cf);
ngx_int_t(*postconfiguration)(ngx_conf_t *cf);
void *(*create_main_conf)(ngx_conf_t*cf);
char*(*init_main_conf)(ngx_conf_t *cf, void *conf);
void*(*create_srv_conf)(ngx_conf_t *cf);
char*(*merge_srv_conf)(ngx_conf_t *cf, void *prev, void *conf);
void *(*create_loc_conf)(ngx_conf_t*cf);
char*(*merge_loc_conf)(ngx_conf_t *cf, void *prev, void *conf);
} ngx_http_module_t;
各个module可以根据需要设置这些函数指针。这些函数有他们各自的用途,create开头的主要是创建该module需要使用的结构体等等。
再看ngx_http_conf_ctx_t结构,这个结构体中的三个成员都是二级指针。实际上,各个module中create开头的函数都会创建module的配置结构,将得到的结构指针放到相应的数组中,如create_main_conf返回的指针会放到ctx->main_conf[i]中,create_srv_conf返回的指针会放到ctx->srv_conf[i]中。当然了这里会先对所有属于NGX_HTTP_MODULE的模块进行计数。
接下来,我们会先临时保存一下cf,因为在后面的递归解析时,cf的一些成员会被更改,而当返回的时候,原来的cf还要继续用。
pcf = *cf;
cf->ctx = ctx;
我们看这个preconfiguration,即ngx_http_module_t中的第一个函数指针。它的作用是什么?
当查看ngx_modules数组的时候,会发现下面几个module设置了preconfiguration:
ngx_http_core_preconfiguration (实际上调用了ngx_http_variables_add_core_vars),
ngx_http_upstream_add_variables,
ngx_http_proxy_add_variables,
ngx_http_browser_add_variable
说白了,这四个函数主要是在开始后面的解析之前,设置一些变量,来为后用(主要是在脚本解析编译的时候)。我们看到的是,他们依次设置了这么几个变量(即,全局数组):
ngx_http_core_variables,ngx_http_upstream_vars,ngx_http_proxy_vars,ngx_http_browsers。具体内容大家可以自己去读下代码,这些信息都是后面解析可能会用到的,这也就是preconfiguration中pre前缀的意思了!
接下来这两句告诉我们,下面要解析的内容是只涉及http相关module,而且其配置的指令是直接出现在http block中,而非server或者location,即所谓的MAIN_CONF。
cf->module_type = NGX_HTTP_MODULE;
cf->cmd_type = NGX_HTTP_MAIN_CONF;
当下面这句返回的时候,整个解析就结束了,这也体现了递归的特点!
rv = ngx_conf_parse(cf, NULL);
这里先进到递归过程的内部,出来之后我们再看后面的处理。
进入ngx_conf_parse之后,会遇到“server”,然后会调用ngx_http_core_server处理server block的配置。
2、 ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void*dummy)
首先会创建一个ngx_http_conf_ctx_t结构,我们知道http block中可能会配置多个server,这样ngx_http_core_server也就被调用多次,我们后面会看到这些ngx_http_conf_ctx_t,即ctx,在各层之间建立一系列复杂的关系。
看下面这两句,server里面的ctx->main_conf指向http ctx的main_conf,这么做的原因很简单,block 的main_conf在各个server公用的,这里只是继承上层的main_conf配置。
http_ctx = cf->ctx;
ctx->main_conf = http_ctx->main_conf;
接下来会出现跟http block处理中相似的一幕,ctx->srv_conf和ctx->loc_conf分别得到了初始化。这里大家应该意识到location block中肯定也会有相似的一幕,呵呵!
我们看到有这样的一个层次:http->server->location,在每个层次的处理时,都会创建一个ctx(即ngx_http_conf_ctx_t),然后它会继承上层的配置,只处理属于自己层次的东西,如location block中的ctx,srv_conf和main_conf都会继承上层的,而loc_conf则会在当前被设置。
后面会很多次的使用ngx_http_core_module,毕竟接下来的都是http配置的处理。
接下的几句比较好理解,有几点需要强调一下。
cscf->ctx = ctx; //这样在解析server部分的时候,就可以很方便的引用上层和下层的配置。
cmcf->servers; // main_conf中的servers是一个数组,httpblock中配置的各个server,都会作为数组成员放到里面.
后面的处理跟http block中的类似,进入到server{}的里面,继续解析,并将处理location的
配置。在ngx_conf_parse返回之后,若发现没有配置listen,那么nginx会这设置默认的。
先说一下,location的解析是整个配置解析里面最复杂的,下次会单独展开来讲。
分享到:
相关推荐
nginx
解析nginx配置文件,并将nginx配置文件格式化成对象,方便java程序管理nginx配置。解析配置文件并非使用正则匹配,而是使用语法分析树处理解决的。 标签:nginx
Nginx 配置文件解析.docx
01Nginx配置文件结构解析
nginx代理服务配置解析,各种标签的包含关系,及解析。 升级版的https://download.csdn.net/download/zhangminemail/11467442 如果要下载,请下载上面路径的(升级版)Nginx配置文件.xmind
主要介绍了Python运维自动化之nginx配置文件对比操作,涉及Python针对文件的读取、遍历、比较进而达到差异对比的相关操作技巧,需要的朋友可以参考下
主要介绍了node解析修改nginx配置文件操作,结合实例形式分析了node.js使用nginx-conf解析修改nginx配置文件的相关操作技巧,需要的朋友可以参考下
pynginx配置 这个 repo 现在很可能坏了,因为这是 pynginxconfig 的不稳定版本。 您可以尝试使用 master 分支来查看 pynginxconfig 的未来。 测试现在正在运行,您可以通过使用python test.py来查看它也将 sinse ...
nginx配置文件解析器 另一个使用jison用JS编写的解析器 用法 cd your-project-path npm install -l nginx-conf-parser 然后使用它: var nginxParser = require ( 'nginx-conf-parser' ) . parser ; var result ...
搭建一个网站传统的方法是使用一个web服务器去解析文件入口文件,如使用Nginx,Apache解析到对应的入口文件,但是随着技术的发展,一些语言可以自己起一个web服务,如Node,PHP,使用开发语言启动一个web服务默认只能在...
可靠,快速的NGINX配置文件解析器和生成器 安装 您可以通过以下方式安装和: pip install crossplane 命令行界面 usage: crossplane <command> [options] various operations for nginx config files optional ...
主要介绍了Nginx服务器配置文件完全解析,Nginx的异步非阻塞特性使其拥有非常出色的性能,需要的朋友可以参考下
Nginxify 解析 NGINX 配置文件的 JSON 配置并在配置中创建适当的表示。 NGINX 配置文件位置 默认生成的配置文件位于/etc/nginx/sites-enabled/nginxify.conf ,如果默认情况下不包含此文件,例如在 Mac OS X 上,您...
10.nginx配置实例(反向代理实例二) 11.nginx配置实例(负载均衡) 12.nginx配置实例(动静分离准备工作) 13.nginx配置实例(动静分离) 14.nginx配置实例(高可用准备工作) 15.nginx配置实例(高可用主备...
可以指定多个 DNS 并重置域名 TTL 延长 nginx 解析缓存来保障解析成功率: 代码如下: resolver 223.5.5.5 223.6.6.6 1.2.4.8 114.114.114.114 valid=3600s; 如果还有解析错误,可以用 dnsmasq 在本地自建 DNS,顺带...
Nginx配置Java解析器该库有助于分析Nginx Web服务器配置文件,查找指定的参数,块,正则表达式或注释。 然后可以修改AST并将其转换回纯文件。特征使用ANTLR4解析功能将配置文件转换为AST树JavaCC同样可用(不建议...
阅读这一部分的读者不需要了解C语言,就可以学习如何部署Nginx,学习如何向其中添加各种官方、第三方的功能模块,如何通过修改配置文件来更改Nginx及各模块的功能,如何修改Linux操作系统上的参数来优化服务器性能,...
Nginx的配置文件位于`/etc/nginx/nginx.conf`,该文件是一个文本文件,用于描述Nginx服务器的行为和设置。以下是Nginx配置的一般描述: 1. 服务端口和服务器块:配置Nginx监听的端口和定义服务器块。服务器块可以...
1、作为Web服务器,Nginx处理静态文件、索引文件,自动索引的效率非常高 2、作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度 3、作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,...