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 Code ページにメモを載せます。まだ完了する時間がなかったので、最後のコミットは 9 か月前のものなので、まだ 1.0/beta はありませんが、操作方法を知っていればソフトウェアは基本的に機能します (これまでのところドキュメントはなく、nginx 構成のみを生成します)。ファイル)。とはいえ、余裕ができ次第完成させたいと思っています。

あなたの要求の問題は、私が書いたパーサーが、メモリに保存された値 (YAML から以前に読み取られたもの) から構成ファイルを生成するためのものであり、その逆ではなく、それらを分析しないことです。幸いなことに、私のコードに基づいて (または最初から) 必要なパーサーを作成するのは比較的簡単です。私が持っているものよりもはるかに簡単です。しかし、私はまだコードにコメントしていません。

構成ファイルを解析する最も簡単な方法は、行ごとに調べて、私のSuperStack クラスのようなものを使用して構成全体を連想配列として構築し、配列を印刷するか、事前にプログラムされた魔法を使用して画像としてダンプすることです。 . ここで私が目にする唯一の問題は、IF とその処理方法ですが、解決するのは簡単なはずです。

とにかく、NAPKIN に追加するのは興味深い機能です。

この考えを続けるためにメールを送ります。

于 2012-06-28T20:00:32.860 に答える