• 締切済み

VirtualHostの記述を削除するスクリプトについて

VirtualHostの記述を削除するスクリプトについて あるサーバからいくつかのドメインを別のサーバに移して運用することになりました。 そのための設定を行っているのですが、移設先のサーバにはそのまま設定要項を virtualhost.conf(仮定)に追記すればいいのですが、既存のサーバから 楽に削除する方法はないでしょうか。 全部で500くらいあるドメインの中から対象は100くらいあります。 そのため、手動で実行するにはあまりにも非効率でリスクがあります。 対象のServerNameがあるディレクティブを最小マッチで指定して ごっそり置換できればよいのですが・・・ shell(sh/bash),perl,PHPのいずれかを考えています。 ですが、私の知識不足もあり、PerlとPHPはよくわかりません。 詳細は勉強するとして、サンプルを頂けないでしょうか。 もしくは「できない!」なんて意見もお願いいたします。 補足ですが、作業サーバも大量にあり、環境もまちまちになってしまうので、 バージョン依存するようなものは避けていただけると助かります。 (とはいえ、Perlだったら5.x系、PHPだったら4.x系以降くらいで) 今のところPerl案が根強いので本カテゴリにて質問させていただきます。 よろしくお願いします。

みんなの回答

回答No.4

ちょっと修正 $ diff -u delete_virtualhost.pl delete_virtualhost+.pl --- delete_virtualhost.pl 2010-09-08 21:59:49.000000000 +0900 +++ delete_virtualhost+.pl 2010-09-08 22:29:27.065905463 +0900 @@ -10,9 +10,9 @@    my $regexp = $_;    $regexp =~ s/\x0D?\x0A?$//;    $regexp = quotemeta $regexp; -  $regexp = '(' . $regexp . ')';    $regexp; } @domain_list; +$domain_pattern = '(' . $domain_pattern . ')'; my $conf_file = shift || die "need conf conf_file"; my $backup = $conf_file . '.bak';

回答No.3

test.conf から domain_list.txt にマッチするディレクティブを削除しています。元の test.conf は test.conf.bak にバックアップしています。 以下、表示がくずれるので、空白 2 文字を全角空白 1 文字で書いていることに注意。 --- delete_virtualhost.pl #!/usr/bin/perl use strict; use warnings; my $domain_list_file = shift || die "need list file"; open my $list_fh, '<', $domain_list_file or die "$!:$domain_list_file"; my @domain_list = <$list_fh>; close $list_fh or die "$!:$domain_list_file"; my $domain_pattern = join '|', map {   my $regexp = $_;   $regexp =~ s/\x0D?\x0A?$//;   $regexp = quotemeta $regexp;   $regexp = '(' . $regexp . ')';   $regexp; } @domain_list; my $conf_file = shift || die "need conf conf_file"; my $backup = $conf_file . '.bak'; rename $conf_file, $backup or die "rename $conf_file, $backup"; open my $in_fh, '<', $backup  or die "$!:$backup"; open my $out_fh, '>', $conf_file or die "$!:$conf_file"; my $saved_text = q{}; my $del_match = 0; while ( my $line = <$in_fh> ) {   if ( ( $line =~ m{^[ \t]*<VirtualHost} )     .. ( $line =~ m{^[ \t]*</VirtualHost>} ) )   {     $saved_text .= $line;     my $chomped_line = $line;     $chomped_line =~ s/\x0D?\x0A?$//;     if ( $chomped_line       =~ m/^[ \t]*ServerName[ \t]+${domain_pattern}[ \t]*$/ )     {       $del_match = 1;     }   }   else {     if ( $del_match == 0 ) {       print {$out_fh} $saved_text, $line;     }     else {       print {$out_fh} $line;     }     $saved_text = q{};     $del_match = 0;   } } close $in_fh or die "$!:$backup"; close $out_fh or die "$!:$conf_file"; --- domain_list.txt 空行があると上手く動かないと思います。 aaa.com ccc.com --- test.conf <Dummy1 />   Options dummy1 </Dummy1> <VirtualHost *:80/>   ServerName aaa.com </VirtualHost> <VirtualHost *:80/>   ServerName bbb.com </VirtualHost> <VirtualHost *:80/>   ServerName ccc.com </VirtualHost> <VirtualHost *:80/>   ServerName ddd.com </VirtualHost> <Dummy2 />   Options dummy2 </Dummy2> --- perl delete_virtualhost.pl domain_list.txt test.conf perl delete_virtualhost.pl domain_list.txt test.conf

回答No.2

以下、表示がくずれるので空白2文字を全角空白1文字にしていることに注意 --- foo.pl #!/usr/bin/perl use strict; use warnings; my $file = shift || die "need conf file"; open my $fh, '<', $file or die "$!:$file"; while (<$fh>) {   if ( m{^[ \t]*<VirtualHost[ \t]+192\.168\.0\.1/>} ..     m{^[ \t]*</VirtualHost>} )   {     ;  # not print   }   else {     print;   } } close $fh or die "$!:$file"; --- test.conf <Dummy1 />   Options dummy1 </Dummy1> <VirtualHost 192.168.0.1/>   Options aaa </VirtualHost> <VirtualHost 192.168.0.2/>   Options bbb </VirtualHost> <Dummy2 />   Options dummy2 </Dummy2> <VirtualHost 192.168.0.1/>   Options ccc </VirtualHost> <Dummy3 />   Options dummy3 </Dummy3> --- result $ perl foo.pl test.conf <Dummy1 />   Options dummy1 </Dummy1> <VirtualHost 192.168.0.2/>   Options bbb </VirtualHost> <Dummy2 />   Options dummy2 </Dummy2> <Dummy3 />   Options dummy3 </Dummy3> --- diff $ perl foo.pl > test.conf+ $ diff test.conf test.conf+ 5,7d4 < <VirtualHost 192.168.0.1/> <   Options aaa < </VirtualHost> 17,19d13 < <VirtualHost 192.168.0.1/> <   Options ccc < </VirtualHost>

purple_cub
質問者

補足

スクリプトありがとうございました。 まだ、実行してはいないのですが、だいぶ答えに近づいた気がします。 1点拝見させていただいたところで、修正しなければならないなと思っているのが 今回削除対象がIPアドレスベースではなく、ドメインベースですので、 Options aaa を残したまま Options ccc を削除しなければならない点です。 おそらくこのスクリプトだとIPベースで削除する気がするので 改良の必要があります。 また対象が大量にあるので出来ればIPアドレス、ドメイン、を 引数にして渡せればベターなのですが。 引数が無理であれば対象が書かれたドメインリストを読み込んで 処理する、など可能でしょうか? これから試しますが、ぱっと思い浮かばないので もし、上記要件も満たせるスクリプトがあるならお願いします。 他力本願で申し訳ありませんが、よろしくお願いします。

回答No.1

まさか500もあるバーチャルホストの設定を、(複数のサーバに分かれているとはいえ)httpd.confに書きこんでしまっているということですかね。 スクリプトに自信がないなら、悪いことは言わないから人海戦術で目視確認しながら編集しなおした方が良いように思います。 エラーで起動しなけりゃ元に戻せばいいや、という程度の停止が許されるなら別ですが... 直接関係ありませんが、バーチャルホストが多い場合はhttpd.conで include vhost.d/*.conf 等としておいて、バーチャルホストの設定ファイルは例えば www.virtualhost-hogehoge.com.conf というような個別ファイルにしてvhost.d/ディレクトリに置いておくというやり方が後々管理が楽ですよ。 これなら個別設定ファイルを削除・リネーム・退避するだけですから。

purple_cub
質問者

補足

早速のご意見ありがとうございます。 > まさか500もあるバーチャルホストの設定を、(複数のサーバに分かれているとはいえ)httpd.confに書きこんでしまっているということですかね。 補足がたりませんでしたね、すみません。 こちらvhostsが500あるサーバが多数、、、なので全体で万単位のドメインとなります。 そのサーバ群を移動する形になります。 そのためこの状況から現運用を変更するのはちょっと、ただごとではなくなります。 また、裏事情ですが、このように標準のApache構成以外もあります。 要はホスティングソフトですね。 pleskとか、c-panelとかです。 これらからやってくる、これらに行く、っていうパターンもあり一筋縄ではいかないのですよ。 おっしゃることはとても筋が通っております。 しかしながら、事情が事情ですので(構築バグに近いか?)表題の通りアドバイスをいただければと思います。 ちなみに1サーバだけを取り上げましたが、全部で削除しなければならないVhostは8000にも及ぶので これを人海戦術でやるのはやはり、いろいろ問題があるのです(工数とか)。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう