SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場

Apacheホスティング環境(Webサーバー+PHP実行環境)をコマンド一発で構築する一撃シェルスクリプト

ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場 第1回


  • X ポスト
  • このエントリーをはてなブックマークに追加

バーチャルホストの作成

 それでは、バーチャルホスト作成時(VHMAINTEコマンドに引数createを与えて実行したとき)の処理を見てみましょう。このときの処理は、次の順序で実行されます。

 ①ログディレクトリの作成
 ②ユーザーやテストコンテンツの作成
 ③バーチャルホストのconfigの生成

①ログディレクトリの作成

 まず最初に、バーチャルホストごとのログディレクトリがなければ作成します。

バーチャルホストごとのログディレクトリがなければ作成
## Log Directory Create
for A in $(cat ${VHLIST} | grep -i ^create | awk '{print $2}' | sort | uniq)
do
  [ ! -d /home/logs/${A} ] && mkdir -p /home/logs/${A}
done

 作成するホストが「www.example.com」のときには/home/logs/www.example.com ディレクトリが出来上がり、ここにアクセスログとエラーログが格納されます。ホスト名は/root/etc/VHLISTファイルから2フィールド目を抜き出しています。createで始まる行が複数行あると、その行のぶんだけ処理を行いますが、重複は排除するようにしています。

②ユーザーやテストコンテンツの作成

 コードが長いのですが、ここでは次の処理が実行されます。

  • ユーザーの作成
  • ドキュメントルートの作成
  • テストコンテンツ(htmlとPHP)の作成

 ユーザーの作成では、データを/root/etc/VHLISTファイルから取り出します。/root/etc/VHLISTファイルの第3フィールドがユーザー名で、「ADD_USER」変数に格納します。第4フィールドはパスワードで、「PASSWORD」変数に格納しています。ユーザーのホームディレクトリは「/home/vhosts/ホスト名」なので、/root/etc/VHLISTファイルの第2フィールドを「FQDN」変数に格納しています。

 なお、パスワードは、/root/etc/VHLISTファイルに平文で書かれているため、これをSHA512で暗号化する必要があるのですが、ここはPythonのワンライナー(1行スクリプト)で行っています。

 ユーザーを作成し終わった後は、/home/vhosts/ホスト名ディレクトリの下にtmpディレクトリとpublic_html(ドキュメントルート)を作成し、ヒアドキュメントでテストファイル(index.htmlとtest.php)を生成しています。

 そして最後に、ユーザーのホームディレクトリ以下すべてのオーナーをrootから作成したユーザーに変更し、ホームディレクトリのパーミッションを711にしています。

ユーザーやテストコンテンツの作成
## User Create
for B in $(cat ${VHLIST} | grep -i ^create | awk '{print $3}' | sort | uniq)
do
  if [ ! 0 = $(grep ^${B} /etc/passwd > /dev/null ; echo $?) ];
  then
    ADD_USER=$(grep ${B} ${VHLIST} | awk '{print $3}' | sort | uniq)
    PASSWORD=$(cat ${VHLIST} | grep ${B} | awk '{print $4}' | sort | uniq)
    FQDN=$(cat ${VHLIST} | grep ${B} | awk '{print $2}' | sort | uniq)
    # User ADD
    useradd ${ADD_USER} \
    -p $(python -c "import crypt, getpass, pwd; print crypt.crypt('${PASSWORD}','\\$6\\$${SALT}$')") \
    -d ${VHDIR}/${FQDN}/
    # VirtualHost Directory Create
    mkdir -p ${VHDIR}/${FQDN}/{tmp,public_html}
cat << '_HTMLEND_' | tee ${VHDIR}/${FQDN}/public_html/index.html
<html>
  <head>
    <title>testpage</title>
  </head>
  <body>
    <p>
      これはテストコンテンツです。<br>
      PHPのテストはこの<a href="./test.php" target="_blank"><b>リンク</b></a>をクリックしてください。
    </p>
  </body>
</html>
_HTMLEND_
cat << '_PHPEND_' | tee ${VHDIR}/${FQDN}/public_html/test.php
<?php phpinfo(); ?>
_PHPEND_
    chown -R ${ADD_USER}. ${VHDIR}/${FQDN}
    chmod 711 ${VHDIR}/${FQDN}
  fi
done

③バーチャルホストのconfigの生成

 ユーザーの作成、テストコンテンツの配置が終わると、次はApacheのバーチャルホストのconfigを生成します。

Apacheのバーチャルホストのconfigを生成
## VirtualHost Config Generate
if [ ! 0 = $(grep ^NameVirtualHost /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/* > /dev/null ; echo $?) ];
then
  echo "NameVirtualHost *:80" >> /etc/httpd/conf/httpd.conf
fi
for C in $(cat ${VHLIST} | grep -i ^create | awk '{print $2}' | sort | uniq)
do
if [ ! -f /etc/httpd/conf.d/${C}.conf ];
then
cat << _VHCONFEOL_ | tee /etc/httpd/conf.d/${C}.conf
<VirtualHost *:80>
    ServerAdmin webmaster@$(uname -n)
    DocumentRoot /home/vhosts/${C}/public_html
    ServerName ${C}
    ErrorLog /home/logs/${C}/error_log
    CustomLog /home/logs/${C}/access_log combined
    Options None
    <Directory /home/vhosts/${C}/public_html>
      AllowOverride AuthConfig FileInfo Indexes Limit
      Order allow,deny
      Allow from all
    </Directory>
</VirtualHost>
_VHCONFEOL_
fi
done

 最初のif文は、httpd.confか/etc/httpd/conf.d/以下のconfigファイルのどれかにNameVirtualHostディレクティブがなければ、httpd.confにこれを追記します。2つ目のif文にある「/etc/httpd/conf.d/ホスト名.conf」ファイルを生成する箇所では、変数を展開する必要があるため、区切り文字「_VHCONFEOL_」はあえてシングルクォートで囲っていません。

 以上がバーチャルホスト作成の処理となります。運用ツールを使ってバーチャルホストを作成した後は、Apacheを再読み込みすることで設定が反映されます。

次のページ
バーチャルホストの削除

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ツールがなくてもサーバー構築でたじろがない! 一撃シェルスクリプト道場連載記事一覧

もっと読む

この記事の著者

濱田 康貴(ハマダ ヤスタカ)

サーバーエンジニアとして主にLinuxのWEBサーバーを設計、構築、運用を行っています。運用ツールの相棒としてシェルスクリプトやワンライナーは心強いパートナーと信じて疑わず、ブログでTIPSを公開しています。2009年5月のUSP友の会活動開始より参画し、現副会長。最近では、USP友の会で「一撃サーバー構築シェルスクリプト勉強会」を開催しているほか、日本で唯一のシェルスクリプト総合誌『シェルスクリプトマガジン』(毎月25日発売)で、隔月(偶数月号)連載「教えて先輩 サーバー運用お助けTips」を執筆しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8434 2015/04/02 19:58

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング