如何解析Nginx配置文件?

时间:2012-06-28 08:02:13

标签: c parsing nginx

我想找到一种解析nginx配置文件的方法,以便动态生成我将用作文档的图表。

nginx配置文件语法如下所示(此示例有意为简洁,我管理的配置文件实际上要复杂得多):

location / {
   if (GET) {
      echo_exec @memcache;
   }
   if (POST) {
      echo_exec @application;
   }
}

location @memcache {
   # try to get content from cache
   if (notfound) {
       # fallback to application
       echo_exec @application;
   }
}
location @application {
   # forwarding request to application
}

我希望生成这样的图表(当鼠标移到进程框上时,你会看到注释,正在调用哪些指令......):

enter image description here

据我所知nginx配置文件语法是自定义的。我能够在src/core/ngx_conf_file.c内的源代码中找到解析器,如下所示:

        case ';':
        case '{':
            if (cf->args->nelts == 0) {
                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                   "unexpected \"%c\"", ch);
                return NGX_ERROR;
            }

            if (ch == '{') {
                return NGX_CONF_BLOCK_START;
            }

            return NGX_OK;

不幸的是我对C一无所知,所以不知道如何重复使用该代码。

您是否知道nginx配置文件语法是否接近已存在哪些解析器的已知语法,我可以重新使用并调整以满足我的需求?

2 个答案:

答案 0 :(得分:4)

您可能需要查看我刚刚在GitHub上发布的Config::Neat Perl模块。我在搜索用Perl编写的类似配置解析器时遇到了你的问题,但是找不到任何合适的配置解析器。

Config :: Neat受nginx配置语法的启发,虽然它不需要在每行末尾加分号,但不支持具有相同名称的块。但是,它可能会为您提供起点。

答案 1 :(得分:0)

我是hypoconf的作者。该项目尚未死亡,我只是将其重命名为NAPKIN并转移到github。我现在会在Google Code页面上留言,以便人们知道。 我没有时间完成它,所以上次提交是从9个月前开始的,所以仍然没有1.0 / beta,但是如果你知道如何操作它,软件基本上可以工作(到目前为止没有文档,只生成nginx配置)文件)。我打算一旦找到空余时间就打算完成它。

您的请求的问题在于我编写的解析器是为生成配置文件从存储在内存中的值(早先从YAML读取),而不是相反 - 不分析它们。 好消息是,基于我的代码(甚至从头开始)为你需要的东西编写一个新的解析器应该相对容易。它会比我在那里更简单,更简单。但是,我还没有对代码进行评论,所以这是一个真正的混乱找到你的方式。

解析配置文件的最快方法是逐行检查,使用像SuperStack class之类的东西将整个配置构建为关联数组,然后只打印数组或将其转储为使用一些预编程魔法的图片。 我在这里看到的唯一问题是IF和如何对待它们,但它应该很容易解决。

无论如何,添加到NAPKIN会是一个有趣的功能。

我会给你发一封电子邮件,继续这个想法。