Apache httpdのコンフィグをパースしてJSONにする

昨夜書くぞーという気持ちが急に生まれて、久しぶりに6時間くらいぶっ通しで書いた。

解決したかった課題

筆者に所属するGMOペパボでは数百万サイトをホスティングしており、それらの配信はhttpdにより行われています。httpdの設定は設定をAPI経由で配布されるデーモンによって行われておりますが、古いアーキテクチャに起因し、一部の情報が配布した設定ファイルにしかないという課題がありました。例えばある設定をAPI経由でサーバに設定したが、どの値が設定されているかはDBなどに情報はなく、設定ファイルをみるしかないという感じです。

そういった状況だと普段運用している場合にはほとんど困ることがないのですが、例えばスケジューラーによって動的に配信ホストを変えたりだとか、FUSEを利用して設定ファイルをプラガブルに配信しようと思った場合に、設定ファイルの取り回しがどうしてもネックになってしまいます。

FUSEについては同僚のインフラ・ジーニアス @harasouの書いたブログがロックです。

Panalysisが提供すること

Panalysisではhttpdのコンフィグを読み込み、JSONに構造化することと、JSONからhttpdのコンフィグを生成することをサポートしています。なぜ双方向をサポートしているかというと、Panalysis自体の動作正常性を見る場合に、既存のコンフィグとJSONの一致化検証をするに当たり、差分を見たかったからです。

要はこういうことがやりたい

# configからjson作る
$ cat misc/sample.conf | pkg/darwin_amd64/panalysis -c | jq > /tmp/conf_to_json;
# jsonからconfig作る
$ cat /tmp/conf_to_json | pkg/darwin_amd64/panalysis -j > /tmp/json_to_conf;
# コメントと空白を無視してDIFFとる
$ diff -I '^\s*\#' -Bw misc/sample.conf /tmp/json_to_conf;
194,195d67
<       #PHPIniDir "C:/Windows"
<

Panalysisを使って今後、何をやるか

まずは既存のhttpdの設定ファイルをすべてDBに吸い上げ、FUSEで管理できるようにします。その後は、アーキテクチャを組み換え、動的な配信サーバのスケジューリングや、 止まらない超高集積WEBサーバを実現していきたいと思っています。僕と一緒に要素技術を生み出しながら世の中にないアーキテクチャを作ること、コードの力で運用を変えつつ、その先の世界を変える仕事を一緒にやりたい仲間を募集しています。