【Apache自動化講座 第3回・完結】Webサイト開設をコマンド一発で!バーチャルホスト自動生成スクリプト

【Apache自動化講座 第3回】「新しいサイト作って」と言われたら、3秒で終わらせよう

こんにちは!「リナックス先生」です。
全3回のApache自動化講座、いよいよ最終回です。
第1回で管理を楽にし、第2回で監視を自動化しました。コウ君、だいぶ楽になったんじゃない?

コウ君

先生!おかげさまで、夜もぐっすり眠れるようになりました!
でも、最近社内で「キャンペーン用のLP(ランディングページ)を作りたいから、テスト環境を用意して」って頻繁に頼まれるんです。
そのたびにディレクトリ掘って、設定ファイル書いて、権限変えて…ってやるのが地味に面倒で…。

リナックス先生

素晴らしい悩みね!
「同じ作業を3回やったら自動化せよ」という格言があるわ。
今回は、ドメイン名を指定するだけで、Webサイトの公開準備がすべて完了する「バーチャルホスト自動生成スクリプト」を作るわよ。
これができれば、あなたは「作業者」から「自動化エンジニア」へと進化できるわ!

最終回のテーマは「プロビジョニング(環境構築)の自動化」です。
ヒアドキュメントというテクニックを使って、設定ファイルの中身を動的に作り出す方法をマスターしましょう。

本講座のカリキュラム(全3回)

AlmaLinux 9 (RHEL 9) 環境を前提に進めます。

  1. 基本操作の自動化:起動・停止スクリプトの作成と、変数・引数の活用
  2. 監視とメンテナンス:プロセス監視、ログの自動ローテーション、アラート通知
  3. 【今回】高度な自動化:バーチャルホスト作成の自動化と、設定ファイルの構文チェック

1. 手動手順の「面倒くささ」を確認する

Apacheで新しいWebサイト(例: test.example.com)を公開する場合、通常は以下の手順が必要です。

  1. 公開用ディレクトリを作成する (mkdir)
  2. ディレクトリの所有者をapacheユーザーに変更する (chown)
  3. ディレクトリのパーミッションを設定する (chmod)
  4. テスト用のindex.htmlを作成する
  5. ログ保存用ディレクトリを作成する
  6. /etc/httpd/conf.d/ に設定ファイルを作成する
  7. 設定ファイルの構文チェックを行う (configtest)
  8. Apacheを再読み込みする (reload)

これら8ステップを毎回手動でやるのは、ミスの元ですし、何より時間の無駄です。
スクリプト化して、add_vhost.sh test.example.com という1コマンドで終わらせましょう。

2. 設定ファイルを自動生成する「ヒアドキュメント」

今回のスクリプトの肝は、「設定ファイル(テキストファイル)をスクリプトの中で作ってしまう」という技術です。
これには「ヒアドキュメント」という機能を使います。

💡 ヒアドキュメントとは?

cat << EOF から EOF までの間に書いた文字を、そのままファイルに吐き出す機能です。
変数($DOMAINなど)を含めると、自動で中身を展開してくれるので、テンプレート作成に最適です。

実験してみよう

DOMAIN="mysite.com"

cat <<EOF > test.conf
<VirtualHost *:80>
    ServerName $DOMAIN
    DocumentRoot /var/www/html/$DOMAIN
</VirtualHost>
EOF

これを実行すると、test.conf というファイルができ、中身の $DOMAINmysite.com に置き換わっているはずです。
これを利用します。

3. バーチャルホスト自動生成スクリプトの作成

では、集大成となるスクリプト add_vhost.sh を作成します。

[root@localhost ~]# vi ~/bin/add_vhost.sh

ソースコード:

#!/bin/bash

# ================================
# 設定エリア
# ================================
WEB_ROOT="/var/www/html"
CONF_DIR="/etc/httpd/conf.d"
LOG_DIR_BASE="/var/log/httpd"
APACHE_USER="apache"
APACHE_GROUP="apache"

# ================================
# 引数チェック
# ================================
# rootユーザーか確認
if [ "$(id -u)" -ne 0 ]; then
    echo "エラー: root権限で実行してください。"
    exit 1
fi

# ドメイン名が指定されているか確認
if [ -z "$1" ]; then
    echo "使用法: $0 [ドメイン名]"
    echo "例: $0 test.example.com"
    exit 1
fi

DOMAIN="$1"
DOC_ROOT="${WEB_ROOT}/${DOMAIN}"
CONF_FILE="${CONF_DIR}/${DOMAIN}.conf"

# ================================
# 既存チェック
# ================================
if [ -d "$DOC_ROOT" ]; then
    echo "エラー: ディレクトリ $DOC_ROOT は既に存在します。"
    exit 1
fi

if [ -f "$CONF_FILE" ]; then
    echo "エラー: 設定ファイル $CONF_FILE は既に存在します。"
    exit 1
fi

echo "========================================"
echo " バーチャルホスト作成を開始します"
echo " ドメイン: $DOMAIN"
echo "========================================"

# 1. ディレクトリ作成
echo "1. ディレクトリを作成中..."
mkdir -p "$DOC_ROOT"

# 2. テストページ作成
echo "2. index.html を作成中..."
cat <<EOF > "${DOC_ROOT}/index.html"
<html>
<head><title>Welcome to $DOMAIN</title></head>
<body>
    <h1>Success! The $DOMAIN virtual host is working!</h1>
</body>
</html>
EOF

# 3. 権限設定
echo "3. 権限を設定中..."
chown -R ${APACHE_USER}:${APACHE_GROUP} "$DOC_ROOT"
chmod -R 755 "$DOC_ROOT"

# 4. 設定ファイル生成(ヒアドキュメント)
echo "4. Apache設定ファイルを生成中..."
cat <<EOF > "$CONF_FILE"
<VirtualHost *:80>
    ServerName $DOMAIN
    DocumentRoot $DOC_ROOT
    
    <Directory "$DOC_ROOT">
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${LOG_DIR_BASE}/${DOMAIN}_error.log
    CustomLog ${LOG_DIR_BASE}/${DOMAIN}_access.log combined
</VirtualHost>
EOF

echo "   -> 作成: $CONF_FILE"

# 5. 構文チェック&再読み込み
echo "5. 設定を反映中..."
apachectl configtest
if [ $? -eq 0 ]; then
    systemctl reload httpd
    echo "========================================"
    echo " [完了] サイトの準備が整いました!"
    echo " URL: http://$DOMAIN"
    echo "========================================"
else
    echo "【失敗】設定ファイルにエラーがあります!"
    echo "作成したファイルを削除して元に戻します..."
    rm -f "$CONF_FILE"
    # ※ディレクトリは安全のため残す、または手動確認を促す
    exit 1
fi

権限付与:

[root@localhost ~]# chmod +x ~/bin/add_vhost.sh
コウ君

うわぁ…!今まで5分かけてやってた作業が、一瞬で終わるコードになっちゃいました!
chown 忘れとかのポカミスもなくなるし、最高です!

4. 実行して確認する

実際に架空のドメインで作成してみましょう。

[root@localhost ~]# ~/bin/add_vhost.sh demo.local
========================================
 バーチャルホスト作成を開始します
 ドメイン: demo.local
========================================
1. ディレクトリを作成中...
2. index.html を作成中...
3. 権限を設定中...
4. Apache設定ファイルを生成中...
   -> 作成: /etc/httpd/conf.d/demo.local.conf
5. 設定を反映中...
Syntax OK
========================================
 [完了] サイトの準備が整いました!
 URL: http://demo.local
========================================

完璧です!
あとは自分のPCの hosts ファイルを書き換えるか、DNSを設定すれば、ブラウザからアクセスできます。

5. さらなる応用:SSL化も自動化できる?

今回はHTTP(80番ポート)の設定を作りましたが、今の時代はHTTPSが必須ですよね。
無料でSSL証明書を発行できる「Let’s Encrypt (Certbot)」を使えば、このスクリプトの最後に以下の1行を足すだけで、SSL化まで全自動にできます。

# Certbotを使って自動でSSL設定を入れる(要:DNS設定済み)
certbot --apache -d "$DOMAIN" --non-interactive --agree-tos -m admin@example.com

これが「インフラのコード化(Infrastructure as Code)」の入り口です。
一度スクリプトにしてしまえば、誰がやっても同じ品質で、一瞬で環境が作れるようになります。

講座のまとめ:エンジニアとしての成長

全3回にわたり、Apacheを題材にシェルスクリプトの活用法を学んできました。

  1. 第1回: 毎回打つコマンドを短縮し、操作ミスを減らしました。
  2. 第2回: 24時間の監視を自動化し、障害対応のスピードを上げました。
  3. 第3回: 面倒な構築作業を自動化し、時間を生み出しました。
リナックス先生

コウ君、どうだった?
最初は「コマンド覚えるの大変」って言ってたけど、今は「どうやって楽をしようか」って考えてる顔になってるわよ。

コウ君

はい!
スクリプトを書く時間はかかりますけど、その後の作業が劇的に楽になるのが快感になってきました。
次はMySQLのバックアップとか、WordPressの自動インストールにも挑戦してみます!

シェルスクリプトは、サーバーエンジニアにとっての「最強の武器」です。
ぜひ、皆さんの現場にある「面倒くさい」を、技術の力で解決していってください。
3回の講座にお付き合いいただき、ありがとうございました!

▼作成したスクリプトを試すのに最適なVPSはこちら

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント