【Apache自動化講座 第3回】「新しいサイト作って」と言われたら、3秒で終わらせよう
こんにちは!「リナックス先生」です。
全3回のApache自動化講座、いよいよ最終回です。
第1回で管理を楽にし、第2回で監視を自動化しました。コウ君、だいぶ楽になったんじゃない?
先生!おかげさまで、夜もぐっすり眠れるようになりました!
でも、最近社内で「キャンペーン用のLP(ランディングページ)を作りたいから、テスト環境を用意して」って頻繁に頼まれるんです。
そのたびにディレクトリ掘って、設定ファイル書いて、権限変えて…ってやるのが地味に面倒で…。
素晴らしい悩みね!
「同じ作業を3回やったら自動化せよ」という格言があるわ。
今回は、ドメイン名を指定するだけで、Webサイトの公開準備がすべて完了する「バーチャルホスト自動生成スクリプト」を作るわよ。
これができれば、あなたは「作業者」から「自動化エンジニア」へと進化できるわ!
最終回のテーマは「プロビジョニング(環境構築)の自動化」です。
ヒアドキュメントというテクニックを使って、設定ファイルの中身を動的に作り出す方法をマスターしましょう。
本講座のカリキュラム(全3回)
AlmaLinux 9 (RHEL 9) 環境を前提に進めます。
- 基本操作の自動化:起動・停止スクリプトの作成と、変数・引数の活用
- 監視とメンテナンス:プロセス監視、ログの自動ローテーション、アラート通知
- 【今回】高度な自動化:バーチャルホスト作成の自動化と、設定ファイルの構文チェック
1. 手動手順の「面倒くささ」を確認する
Apacheで新しいWebサイト(例: test.example.com)を公開する場合、通常は以下の手順が必要です。
- 公開用ディレクトリを作成する (
mkdir) - ディレクトリの所有者をapacheユーザーに変更する (
chown) - ディレクトリのパーミッションを設定する (
chmod) - テスト用のindex.htmlを作成する
- ログ保存用ディレクトリを作成する
/etc/httpd/conf.d/に設定ファイルを作成する- 設定ファイルの構文チェックを行う (
configtest) - 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 というファイルができ、中身の $DOMAIN が mysite.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回: 毎回打つコマンドを短縮し、操作ミスを減らしました。
- 第2回: 24時間の監視を自動化し、障害対応のスピードを上げました。
- 第3回: 面倒な構築作業を自動化し、時間を生み出しました。
コウ君、どうだった?
最初は「コマンド覚えるの大変」って言ってたけど、今は「どうやって楽をしようか」って考えてる顔になってるわよ。
はい!
スクリプトを書く時間はかかりますけど、その後の作業が劇的に楽になるのが快感になってきました。
次はMySQLのバックアップとか、WordPressの自動インストールにも挑戦してみます!
シェルスクリプトは、サーバーエンジニアにとっての「最強の武器」です。
ぜひ、皆さんの現場にある「面倒くさい」を、技術の力で解決していってください。
3回の講座にお付き合いいただき、ありがとうございました!
▼作成したスクリプトを試すのに最適なVPSはこちら



コメント