【新・実践シェルスクリプト講座 第1回】黒い画面でポチポチするな!「Webサーバー構築」を全自動化する魔法の100行

【新・実践シェルスクリプト講座 第1回】「えっ、まだ手動でインストールしてるの?」環境構築を自動化して”神”になろう

こんにちは!「リナックス先生」です。
前回までの講座(シーズン1)で、サーバーの「監視」や「バックアップ」は完璧になりましたね。
しかし、コウ君。君はまだ、エンジニアとして一番大事な時間を無駄にしていませんか?

コウ君

えっ? どういうことですか?
実は昨日、新しいVPSを契約したんですけど、Apacheを入れて、PHPを入れて、設定ファイルを書き換えて…ってやってたら、環境を作るだけで半日終わっちゃいました。
これ、もっと楽になりませんか?

リナックス先生

それよ!
プロのエンジニアは「同じ作業を2回繰り返さない」生き物なの。
今回は、コマンド一発でWebサーバー環境(LAMP)を構築し、設定ファイルの書き換えまで完了させる「プロビジョニング(構築)スクリプト」を作るわよ!

新シリーズ「新・実践シェルスクリプト講座」の第1回は、**「環境構築の自動化」**です。
dnf コマンドによるインストールはもちろん、初心者が最もつまずきやすい「設定ファイル(conf)の自動書き換え」を、sed コマンドを駆使して攻略します。

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

本シリーズでは、「サーバーを作って、動かし続け、使いやすくする」ための攻撃的な自動化技術を学びます。

  1. 【今回】黒い画面でポチポチするな!「Webサーバー構築(LAMP環境)」をボタン一発で全自動化する
  2. Webサイトが死んだら自動で蘇生せよ!「サービス死活監視」と「自動再起動」
  3. ローカル保存じゃ終わらない!「DBバックアップ」と「AWS S3/クラウドへの自動転送」
  4. 黒い画面をアプリ化!?「対話型メニュー」で作る自分だけの管理ツール

1. 手動構築の「何」が問題なのか?

Webサーバー(今回は AlmaLinux 9 + Apache + PHP + MariaDB のLAMP構成)を作る手順を思い出してみましょう。

  1. dnf install httpd php mariadb-server ... を打つ。
  2. systemctl start httpd で起動する。
  3. firewall-cmd でポートを開ける。
  4. /etc/php.ini を開いて、タイムゾーンを書き換える。
  5. /etc/httpd/conf/httpd.conf を開いて、ServerNameを書き換える。

これを10台のサーバーでやるとしたら?
タイポ(入力ミス)をして、1台だけ設定が違っていたら?
「Infrastructure as Code(コードによるインフラ管理)」の第一歩として、これをスクリプト化します。

2. 設定ファイル書き換えの魔術師「sed」

パッケージを入れるだけなら簡単ですが、最大の難関は「テキストファイルの編集」です。
スクリプトの中で vim を開くわけにはいきません。
そこで登場するのが、ストリームエディタ sed です。

基本形:置換して上書き保存

sed -i 's/変更前/変更後/g' ファイル名
  • -i: ファイルを直接上書きする (in-place)
  • s: 置換 (substitute)
  • g: 全て置換 (global) ※これがないと最初の1個だけ置換される

実践:php.iniのタイムゾーン変更

PHPの設定ファイルには ;date.timezone = というコメントアウトされた行があります。
これを date.timezone = Asia/Tokyo に変えたい場合、こう書きます。

sed -i 's/;date.timezone =/date.timezone = Asia\/Tokyo/g' /etc/php.ini

※スラッシュ / はエスケープ \/ する必要があります。

3. 全自動構築スクリプト「setup_lamp.sh」

それでは、実用的な構築スクリプトを作成しましょう。
このスクリプトを実行するだけで、まっさらなVPSが「Webサーバー」に早変わりします。

vim setup_lamp.sh を作成します。

#!/bin/bash

# ==========================================
# 設定エリア
# ==========================================
# ログファイル
LOG_FILE="/var/log/setup_lamp.log"
# インストールするPHPのバージョンなど(必要に応じて変更)
PHP_PACKAGES="php php-cli php-fpm php-mysqlnd php-mbstring php-json"

# --- 安全設定 ---
# エラーで停止、未定義変数で停止、パイプエラー検知
set -euo pipefail

# ==========================================
# 関数定義
# ==========================================
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

check_root() {
    if [[ $EUID -ne 0 ]]; then
        echo "エラー: rootユーザーで実行してください"
        exit 1
    fi
}

# ==========================================
# メイン処理
# ==========================================
check_root
log "=== LAMP環境構築を開始します ==="

# 1. システムの更新
log "システムを更新しています..."
dnf -y update >> "$LOG_FILE" 2>&1

# 2. Apache (Webサーバー) のインストール
log "Apacheをインストール中..."
if ! rpm -q httpd &> /dev/null; then
    dnf -y install httpd >> "$LOG_FILE" 2>&1
    log "Apacheインストール完了"
else
    log "Apacheは既にインストールされています (スキップ)"
fi

# 3. MariaDB (データベース) のインストール
log "MariaDBをインストール中..."
if ! rpm -q mariadb-server &> /dev/null; then
    dnf -y install mariadb-server >> "$LOG_FILE" 2>&1
    log "MariaDBインストール完了"
else
    log "MariaDBは既にインストールされています (スキップ)"
fi

# 4. PHPのインストール
log "PHPと関連モジュールをインストール中..."
# 既存チェックは簡易的にphpコマンドで
if ! command -v php &> /dev/null; then
    dnf -y install $PHP_PACKAGES >> "$LOG_FILE" 2>&1
    log "PHPインストール完了"
else
    log "PHPは既にインストールされています (スキップ)"
fi

# 5. 設定ファイルの自動書き換え (sedマジック!)
log "設定ファイルを調整中..."

# PHP: タイムゾーンを東京に設定
# バックアップを取ってから書き換える (php.ini.bakができる)
sed -i.bak 's/;date.timezone =/date.timezone = Asia\/Tokyo/g' /etc/php.ini

# PHP: メモリ上限を 128M -> 256M に変更
sed -i 's/memory_limit = 128M/memory_limit = 256M/g' /etc/php.ini

# Apache: ServerNameの設定 (警告消し)
# #ServerName www.example.com:80 という行を探して、その下に追記するテクニック
if ! grep -q "^ServerName localhost" /etc/httpd/conf/httpd.conf; then
    sed -i '/#ServerName www.example.com:80/a ServerName localhost:80' /etc/httpd/conf/httpd.conf
fi

log "設定ファイルの変更完了"

# 6. サービスの起動と自動起動設定
log "サービスを起動中..."
systemctl enable --now httpd
systemctl enable --now mariadb

# 7. ファイアウォール設定 (http/https許可)
log "ファイアウォール設定中..."
if command -v firewall-cmd &> /dev/null; then
    # 既に許可されていなければ追加
    if ! firewall-cmd --list-services | grep -q http; then
        firewall-cmd --permanent --add-service=http
        firewall-cmd --permanent --add-service=https
        firewall-cmd --reload
        log "ポート80/443を開放しました"
    fi
fi

# 8. テストページの作成
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
chown apache:apache /var/www/html/info.php

log "=== 全処理完了 ==="
log "ブラウザで http://$(curl -s ifconfig.me)/info.php にアクセスして確認してください。"

💡 プロのテクニック:冪等性(べきとうせい)を意識せよ

スクリプトの中で if ! rpm -q httpd ... のように「既にインストールされているか?」をチェックしていますね。
これを入れずに dnf -y install... を毎回実行してもエラーにはなりませんが、無駄な時間がかかります。
何度実行しても結果が変わらず、エラーも出ない作りを「冪等性(Idempotency)」と呼び、インフラ自動化の最も重要な概念です。

4. 解説:ここが「自動化」のキモ!

① ログ出力のリダイレクト >> "$LOG_FILE" 2>&1

インストールコマンドは大量の文字を画面に出力します。
dnf -y update などの出力を全てログファイルに捨てる(保存する)ことで、スクリプト実行時の画面をスッキリさせつつ、後でエラー解析ができるようにしています。

② sed -i.bak によるバックアップ

sed -i.bak と書くと、書き換える前のファイルを php.ini.bak として自動保存してくれます。
「スクリプトで設定を壊してしまった!」という時も、mv php.ini.bak php.ini で元に戻せる安心設計です。

③ systemctl enable --now

昔は enable (自動起動設定) と start (今すぐ起動) を2行書いていましたが、今は enable --now で1行で書けます。
モダンなLinuxコマンドを使うのも、スクリプトを短くするコツです。

5. 動作確認

実行権限を与えて実行します。

[root@localhost ~]# chmod +x setup_lamp.sh
[root@localhost ~]# ./setup_lamp.sh
[2026-01-07 10:00:00] === LAMP環境構築を開始します ===
[2026-01-07 10:00:00] システムを更新しています...
[2026-01-07 10:01:20] Apacheをインストール中...
...
[2026-01-07 10:03:00] === 全処理完了 ===
[2026-01-07 10:03:00] ブラウザで http://xxx.xxx.xxx.xxx/info.php にアクセスして確認してください。

たった数分放置するだけで、Webサーバーが完成しました。
これで、VPSを契約するたびに半日かける必要はありません。「秒」で仕事が終わります。

まとめ:構築こそ自動化すべき

今回は「新・実践シェルスクリプト講座」の第1回として、Webサーバー構築の自動化を行いました。

対象 自動化のポイント
インストール dnf -y で確認メッセージを飛ばす
設定変更 sed コマンドでテキスト置換を行う
サービス起動 systemctl enable --now で一括起動
安全性 set -euo pipefail と事前チェック(冪等性)

次回は、こうして構築したWebサーバーが「止まった時」にどうするか?
ただ監視するだけでなく、「自動で再起動して復旧させ、Discordに『直しておいたよ』と通知する」という、自己修復スクリプトを作成します。
深夜の障害対応コールから解放されたい人、必見です!

リナックス先生

今回のスクリプトは、VPSを「初期化(OS再インストール)」するたびに使える一生モノの資産よ。
自分好みの設定(vimの設定やエイリアス)を追加して、最強の my_setup.sh を育てていってね!

▼何度でもOS再インストール無料!実験に最適なVPS

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

コメント