2014年9月11日木曜日

apacheやnginxの設定を環境毎に手書きしない


このエントリーをはてなブックマークに追加
~/myapp/etc/development/nginx.conf
~/myapp/etc/production/nginx.conf
上記のように開発環境と本番環境の2つを別々に管理していると、開発環境でテストしてもテストできたのはdevelopmentのほうだけで、 実際に使われるproductionのほうはテストされてません。

ぶっつけ本番と変わらないわけです。

なので、テンプレート化して生成するようにしましょう。やり方は簡単です。
環境ごとにバラバラに膨れ上がった設定ファイルでも本番環境のものが正なので、それを元にテンプレートファイルを作成していきます。本番の設定ファイルと同じものが生成されるかdiffを見ながら作業すればいいので半日で終わります。
テンプレートに渡す環境ごとのパラメータ(ホスト名など)はアプリ側で使用しているものがあると思いますので、それを使えばいいです。

テンプレートエンジンはなんでもいいのですが、どこでも同じものが使いたいので、Text::MicroTemplateを使っています。
nginx.conf
    server {
        listen       80;
        server_name <?= $_[0]->{PROJECT_HOST} ?>; 
        ....
    }

make.pl
#!/usr/bin/env perl

use File::Slurp qw/ write_file /;
use Text::MicroTemplate qw/:all/;
use Text::MicroTemplate::File;

my $mtf = Text::MicroTemplate::File->new(
    include_path => [ 'tmpl' ],
);

for my $env (qw/ development production /) {
    my $C = do "../config/${env}.pl";
    die $@ if $@;
    warn $C->{PROJECT_HOST};
    my $filled_template =  $mtf->render_file('nginx.conf', $C);
    write_file( "${env}/nginx.conf", {binmode => ':utf8'},$filled_template );
}
make.plを実行すると各種ファイルが更新されます。
ちなみにこの手の自動生成系はテストの実行時に毎回実行するようにしてあります。

0 件のコメント:

コメントを投稿