4

我想找到一种解析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
}

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

在此处输入图像描述

据我所知,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配置文件语法是否接近另一种已知语法,其中解析器已经存在,我可以重新使用和调整以满足我的需要?

4

2 回答 2

4

您可能想查看我刚刚在 GitHub 上发布的Config::Neat Perl 模块。我在搜索用 Perl 编写的类似配置解析器时遇到了您的问题,但没有找到任何像样的解析器。

Config::Neat 受到 nginx 配置语法的启发,尽管它不需要在每行末尾使用分号,并且 [尚未] 支持具有相同名称的块。但是,它可能会成为您的起点。

于 2012-09-22T21:08:08.123 回答
0

我是hypoconf的作者。该项目并没有死,我只是将其重命名为 NAPKIN 并移至 github。我现在将在 Google 代码页面上做一个注释,以便人们知道。我还没来得及完成,所以最后一次提交是9个月前的,所以还没有1.0/beta,但是如果你知道如何操作,软件基本上可以工作(目前没有文档,只生成nginx配置)文件)。不过,我确实打算完成它,只要我找到一些空闲时间。

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

解析配置文件的最快方法是逐行浏览它,使用类似我的SuperStack 类的东西将整个配置构建为关联数组,然后使用一些预编程的魔法打印数组或将其作为图片转储. 我在这里看到的唯一问题是 IF 以及如何处理它们,但它应该很容易解决。

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

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

于 2012-06-28T20:00:32.860 回答