バーチャルホストの作成
それでは、バーチャルホスト作成時(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を生成します。
## 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を再読み込みすることで設定が反映されます。