• 締切済み

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

  • VirtualHostディレクティブの記述について

    教えてください。 サーバで既に構築してあるサイトについては、httpd.confの中でVirtualHostを使っています。 追加で検証用のサーバを立てるのですが、IPアドレスでアクセスできるようにしたいです。IPアドレスでサイトにアクセスするようにするには、追加のVirtualHostを書き、ServerNameにIPアドレスを指定すれば良いでしょうか? 宜しくお願い致します。

  • Apache VirtualHost でワイルドカード(?)設定

    Apache2.2.3を利用しています。 virtualhost.confに50程度のサブドメインを、 下記のように設定をしています。 *************************************************** <VirtualHost *:80>   ServerName suzuki.example.com   DocumentRoot /var/www/html/suzuki/ </VirtualHost> <VirtualHost *:80>   ServerName sato.example.com   DocumentRoot /var/www/html/sato/ </VirtualHost> <VirtualHost *:80>   ServerName yamada.example.com   DocumentRoot /var/www/html/yamada/ </VirtualHost> ・ ・ ・ *************************************************** つまり *************************************************** <VirtualHost *:80>   ServerName ▲▲▲.example.com   DocumentRoot /var/www/html/▲▲▲/ </VirtualHost> *************************************************** のようなルールになっているのですが、 これをワイルドカード使ってできないでしょうか? 宜しくお願いします!

  • apacheのVirtualHostの記述について

    サブドメイン *.hoge.com へアクセスされた際、 ドキュメントルート /var/www/subDomains/*/ を参照させたいので、httpd.confを以下のように設定しました。 <VirtualHost *> ServerAlias *.hoge.com VirtualDocumentRoot "/var/www/subDomains/%1/" ・・・  </VirtualHost> これはうまく動作するのですが、上記サブドメイン設定とは別に メインドメイン(hoge.com または www.hoge.com)へアクセスされた場合のみ ドキュメントルート /var/www/main/ を参照させたいのです。 なので、上記記述とは別に、 <VirtualHost *> DocumentRoot "/var/www/main/" ServerName www.hoge.com ・・・  </VirtualHost> を追加したのですが、このメインドメイン用記述は無視されてしまいます。 ※メインドメインへアクセスしても、サブドメイン用のVirtualDocumentRoot である /var/www/subDomains/www/ を参照してしまいます。 こうなってしまう原因は、サブドメイン用の記述である ServerAlias *.hoge.com の指定で、「www.hoge.com」が対象となっているからだと思いますが、 正規表現で「www.hoge.com」を除外する方法や、 その他解決策がありましたらご教授よろしくお願いします。 apacheのバージョンは2.2.15です。 ※ちなみに、正規表現による除外は「ServerAlias (?!www)*.hoge.com」を試してみましたがダメでした。 書き方が悪いのかもしれません。。

  • VirtualHostの設定

    名前ベースのVirtualHostの設定を試してるのですが、 Permission denied: file permissions deny server accessとなり アクセスできません。wwwはアクセスできます。 サイトでいろいろ調べているのですが、解決できませんでした。 パーミッションも777に設定しています。httpd.confの設定を載せます。pperというユーザーを追加しました。 *ホストとドメインは仮名 NameVirtualHost *:80 <VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot /var/www/html ServerName www.pani.mydns.jp ErrorLog logs/www.pani.mydns.jp-error_log CustomLog logs/www.pani.mydns.jp-access_log common </VirtualHost> <VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot /home/pper/html ServerName test.pani.mydns.jp ErrorLog logs/test.pani.mydns.jp-error_log CustomLog logs/test.pani.mydns.jp-access_log common </VirtualHost>

  • ApacheのVirtualHostを設定したい

    ApacheのVirtualHostを設定したい http://xxxxx.jp http://yyy.xxxxx.jp:5041 http://zzz.xxxxx.jp:5042 という3種類の接続方法をしたいが為に、VirtualHostを設定していますが、うまく設定できずに 困っています。 Listen 80 Listen 5041 Listen 5042 NameVirtualHost 111.222.333.444:80 NameVirtualHost 111.222.333.444:5041 NameVirtualHost 111.222.333.444:5042 <VirtualHost 111.222.333.444:80> ServerName xxxxx.jp DocumentRoot /test </VirtualHost> <VirtualHost 111.222.333.444:5041> ServerName yyy.xxxxx.jp DocumentRoot /test2 </VirtualHost> <VirtualHost 111.222.333.444:5042> ServerName zzz.xxxxx.jp DocumentRoot /test3 </VirtualHost> 今現状、こんな設定なのですが、これだと http://yyy.xxxxx.jp http://zzz.xxxxx.jp とアクセスすると、 http://xxxxx.jp と同じ結果が表示されてしまいます。 サブドメインが付与されているアドレスは、あくまでもポート指定が 5041、5042と正しく指定された場合のみアクセスされてほしいです。 (そうじゃないときは何らかのHTTPエラーが出ればいいです) どう設定すれば実現できるでしょうか?

  • apacheのvirtualhostについて

    Apache/1.3.22のname virtual hostについておたずねします。 httpd.confの記述で NameVirtualHost 219.***.***.*** <VirtualHost 219.***.***.*** ServerName www.********.co.jp DocumentRoot /home/web/docs ScriptAlias /cgi-bin/ /home/web/cgi-bin/ ErrorLog /home/web/logs/error_log CustomLog /home/web/logs/access_log combined </VirtualHost <VirtualHost 219.***.***.*** ServerName test.********.co.jp DocumentRoot /home/web/test ScriptAlias /cgi-bin/ /home/web/test-cgi-bin/ ErrorLog /home/web/logs/test-error_log CustomLog /home/web/logs/test-access_log combined </VirtualHost としているのですがVirtualHostが反映されません。 また、LAN内のサーバーですのでnamed.confはviewを使用し、zoneファイルは2通り用意しており外部からも内部からも正常に正引きできます。 どのような原因が考えられるでしょうか? また、対処法はどのようにすればよいのでしょうか? ご教授いただきますようお願いいたします。

  • Linux+Apache2+openSSLでVirtualHostは不可能?

    こんにちは。 RedHat Linux9 で、Apache2.0 + openSSLをインストールしたWebサーバーをたてています。 このサーバーでは「domain-A.com(仮)」 を動かしたいのですが、将来的に他のドメインも入れたいため、名前ベースのVirtualHostで構成したいと考えています。ところが、Apacheのマニュアルには「名前ベースのバーチャルホストは SSL プロトコルの特徴により、 SSL セキュアサーバには使えません。」と書かれています。 とりあえず、httpd.confにて、Domain-X.com(非SSL)とDomain-A.com(SSL)をバーチャルホストとして設定しました。 ssl.confにはDocumentRootとしてDomain-A.comのルートを指定しました。 すると、Domain-A.comをSSLで確認できたのですが、Domain-X.comにhttpsでアクセスするとDomain-Aのファイルが表示されてしまったのです。 ひとつのサーバーでSSLを使用するドメインを複数動かすことはできないのでしょうか? また、それができないなら、SSLを使用しないドメインにhttpsでアクセスした時に、SSLを使用するドメインのファイルが出ないようにする方法はないのでしょうか?

  • ApacheのVirtualHostの設定すると、メイン(?)の設定に影響してしまう

    いつもお世話になっております。 ApacheのVirtualHostの設定をして複数サイトを運営したいと思ったのですが、VirtualHostの設定をしたところ、VirtualHostでないURLの方までドキュメントルートがVirtualHostに設定した方のページが表示されるようになってしまいました。 説明が下手すぎるので、具体的にはieserverというDDNSにて aaaaa.dip.jp bbbbb.dip.jp という二つのサブドメインを取得しまして(ドメインは適当です) httpd.confのSection 2 'Main' server configrationには ServerName aaaaa.dip.jp:80 DocumentRoot "/var/www/html" と記述し、 Section 3: Virtual Hostsには NameVirtualHost *:80 <VirtualHost *:80> ServerName bbbbb.dip.jp DocumentRoot /var/www/sample <Directory "/var/www/sample"> Order allow,deny Allow from all </Directory> </VirtualHost> と記述しています。 これで、 http://aaaaa.dip.jpでアクセスすれば/var/www/htmlの中のindex.htmlが、 http://bbbbb.dip.jpでアクセスすれば/var/www/sampleの中のindex.htmlが 表示されると思ったのですが、 どっちのURLでアクセスしても/var/www/sampleの中のindex.htmlが表示されて しまうのです。 ちなみにVirtualHostの設定をコメントアウトしてからリスタートすると /var/www/htmlの中のindex.htmlが表示されるようになります。 何か設定が足りていないのでしょうか? 調べてもちょうど良い文献が見つからず四苦八苦しております。 原因が推測できれば教えていただけると助かります。

  • ApacheでのVirtual Hostの設定

    RedHatLinux9.0/Apache2.0 動的IPのADSLでhn.orgのDDNSを使い、サーバを立てました。 ドメインを持っているため、それを割り当てようと/etc/httpd/conf/httpd.confでVirtual Hostの設定をしたのですが、外部からドメインで接続しても指定したディレクトリを読みに行ってくれず、ディフォルトの/var/www/htmlのディレクトリが表示されていまいます。 DNS(bind?)をこちらで動かしてないのですが、それが原因なのでしょうか? httpd.confはこのようにしています。 # # Use name-based virtual hosting. # NameVirtualHost 127.0.0.1 # # VirtualHost example: # Almost any Apache directive may go into a VirtualHost container. # The first VirtualHost section is used for requests without a known # server name. # <VirtualHost 127.0.0.1> ServerAdmin admin@自分のドメイン.biz DocumentRoot /home/ff/www/ ServerName www.自分のドメイン.biz ServerAlias 自分のドメイン.biz ErrorLog logs/ff/error_log CustomLog logs/ff/access_log common </VirtualHost> また、NameVirtualHost 127.0.0.1と<VirtualHost 127.0.0.1>を、NameVirtualHost *と<VirtualHost *>に変えるとすべてのアクセスがForbiddenになってしまいます。 ログをみたところ、どういうわけかIE6.0なのにHTTP/1.0で繋がっているみたいなのですが、やはりそれなのでしょうか・・・? すみません。アドバイスよろしくお願いいたします。m(_ _)m

  • apache,ssl,virtualhost

    VPS上にいくつかのサブドメインでバーチャルホスト(名前ベース)を運用しています。 実現したいのは以下の設定です。  ブラウザに入力されたURL => リダイレクト先 (1)http://hoge.net => https://hoge.net (2)http://www.hoge.net => https://hoge.net (3)https://www.hoge.net => https://hoge.net SSL証明書が有効なのは、『hoge.net』と『hige.hoge.net』です。『www.hoge.net』は有効ではありません。 wwwについては、あっても無くてもアクセス可能とし、あった場合はリダイレクト(いわゆる無しで統一)したいので、設定してあります。 (1)と(2)は問題ないのですが、ブラウザに(3)を入力するとセキュリティの警告エラーが出てしまいます。 その警告を無視して進むとリダイレクトされて、正常に表示されます。 SSL証明書の追加取得以外で、この警告を回避してリダイレクトする方法を教えていただきたいです。 環境:apache2.2 設定内容:httpd.confではなくvhost.confファイルに下記を記述。(見易いように、先頭空白を全角に変更してあります。) <Directory /var/www/html/*/public_html>   Options FollowSymLinks   AllowOverride All   Order allow,deny   Allow from all </Directory> <VirtualHost *:80>   ServerName hoge.net   Redirect permanent / https://hoge.net </VirtualHost> <VirtualHost *:443>   ServerName hoge.net   DocumentRoot /var/www/html/hoge/public_html   SSLEngine on   SSLCertificateFile ++++++++++++++++   SSLCertificateKeyFile ++++++++++++++++ </VirtualHost> <VirtualHost *:80 *:443>   ServerName hige.hoge.net   DocumentRoot /var/www/html/hige/public_html   RewriteEngine on   RewriteCond %{HTTPS} off   RewriteRule . https://hige.hoge.net%{REQUEST_URI} [R=301,L]   SSLEngine on   SSLCertificateFile ++++++++++++++++   SSLCertificateKeyFile ++++++++++++++++ </VirtualHost> よろしくお願いいたします。