https://barrel.reisalin.com/books/950a4/page/apachephp-fpm
のスクリプトの改良版となります。
スクリプト特徴
- 管理者(root)権限で実行するかのチェック
- サービス再起動前に有効なサイトとドメイン名を事前に確認
- 構文にミスがないかを確認
- 再起動前の最終確認をy/nで行う
- PHP-FPMにも対応(インストールされていない場合はスキップ)
- 再起動後にサービスの状況を表示する
-rオプションでreloadのみ実施
スクリプト内容
- apache2-check.sh
#!/bin/bash
#================================================================
# Apache & PHP-FPM Management Script
#================================================================
# --- Colors for Output ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# --- Settings ---
SITES_DIR="/etc/apache2/sites-enabled"
# Default to 8.3, but allow override via ENV like: PHP_VERSION=8.2 ./script.sh
PHP_VERSION="${PHP_VERSION:-8.3}"
# --- Flags ---
AUTO_YES=false
RESTART_APACHE=true
RESTART_PHP=true
EXCLUSIVE_MODE=false
ACTION_TYPE="restart" # default action
ACTION_LABEL="再起動"
# --- Usage ---
usage() {
echo -e "${CYAN}Usage: $(basename "$0") [-y] [-r] [-a] [-p] [-h]${NC}"
echo " -y : 確認をスキップ (Auto-Yes)"
echo " -r : restartの代わりに reload を使用 (設定反映のみの場合に推奨)"
echo " -a : Apacheのみ対象"
echo " -p : PHP-FPMのみ対象"
echo " -h : ヘルプ表示"
exit 0
}
# --- Argument Parsing ---
while getopts "yraph" opt; do
case $opt in
y) AUTO_YES=true ;;
r)
ACTION_TYPE="reload"
ACTION_LABEL="リロード(設定読込)"
;;
a)
if ! $EXCLUSIVE_MODE; then
RESTART_APACHE=false; RESTART_PHP=false; EXCLUSIVE_MODE=true
fi
RESTART_APACHE=true
;;
p)
if ! $EXCLUSIVE_MODE; then
RESTART_APACHE=false; RESTART_PHP=false; EXCLUSIVE_MODE=true
fi
RESTART_PHP=true
;;
h) usage ;;
\?) usage ;;
esac
done
PHP_FPM_SERVICE="php${PHP_VERSION}-fpm"
PHP_FPM_COMMAND="php-fpm${PHP_VERSION}"
# --- Function: Action & Check ---
manage_service() {
local service_name="$1"
local service_label="$2"
local confirm_action="n"
# PHP-FPM doesn't support 'reload' gracefully in all versions/configs,
# but systemd handles it usually. If not, fallback or stick to restart.
# For this script, we assume systemctl reload works or fails safely.
if [ "$AUTO_YES" = true ]; then
confirm_action="y"
echo -e "${YELLOW}${service_label} を ${ACTION_LABEL} します... (-y)${NC}"
else
read -p "${service_label} を ${ACTION_LABEL} しますか? (y/n): " confirm_action
fi
if [[ "$confirm_action" =~ ^[Yy]$ ]]; then
if ! systemctl "$ACTION_TYPE" "$service_name"; then
echo -e "${RED}エラー: ${service_label} の ${ACTION_LABEL} に失敗しました。${NC}"
# On failure, show status immediately
systemctl status "$service_name" --no-pager
else
echo -e "${GREEN}${service_label} が正常に ${ACTION_LABEL} されました。${NC}"
echo "---- ステータス ----"
systemctl is-active "$service_name"
echo "--------------------"
fi
else
echo -e "${CYAN}${service_label} の処理はキャンセルされました。${NC}"
fi
echo
}
# --- Root Check ---
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}エラー: root権限が必要です。sudoしてください。${NC}"
exit 1
fi
# --- 1. Display Sites ---
echo -e "${CYAN}==== 有効なサイト設定 (VHosts) ====${NC}"
if [ -z "$(ls -A "$SITES_DIR" 2>/dev/null)" ]; then
echo "サイト設定が存在しません。"
else
shopt -s nullglob
for site in "$SITES_DIR"/*; do
echo -e "${YELLOW}File: $(basename "$site")${NC}"
# Parse Logic (Kept your logic, it works well)
grep -hi -E "^\s*(ServerName|ServerAlias)\s+" "$site" | sed -E 's/^[[:blank:]]+//;s/[[:blank:]]*#.*//' | awk '{
orig=$1; dir=tolower(orig);
proper=(dir=="servername"?"ServerName":(dir=="serveralias"?"ServerAlias":orig));
for(i=2;i<=NF;i++){
d=tolower($i); sub(/[;,]*$/,"",d); gsub(/^[[:blank:]]+|[[:blank:]]+$/,"",d);
if(d) printf " %s %s\n", proper, d
}
}' | sort -u
done
shopt -u nullglob
fi
echo -e "${CYAN}==================================${NC}\n"
# --- 2. Syntax Check (Revelio) ---
echo -e "${CYAN}--- 構文チェック (Revelio) ---${NC}"
SYNTAX_OK=true
if [ "$RESTART_APACHE" = true ]; then
echo -n "Apache: "
if apachectl configtest 2>&1 | grep -q "Syntax OK"; then
echo -e "${GREEN}Syntax OK${NC}"
else
echo -e "${RED}Syntax Error Detected!${NC}"
apachectl configtest
SYNTAX_OK=false
fi
fi
PHP_FPM_ENABLED=false
if [ "$RESTART_PHP" = true ]; then
# Simple check for binary existence
if command -v "$PHP_FPM_COMMAND" &>/dev/null; then
PHP_FPM_ENABLED=true
echo -n "${PHP_FPM_SERVICE}: "
if "$PHP_FPM_COMMAND" -t 2>&1 | grep -q "test is successful"; then
echo -e "${GREEN}Syntax OK${NC}"
else
echo -e "${RED}Syntax Error Detected!${NC}"
"$PHP_FPM_COMMAND" -t
SYNTAX_OK=false
fi
else
echo -e "${YELLOW}Warning: ${PHP_FPM_COMMAND} not found. Skipping PHP check.${NC}"
RESTART_PHP=false
fi
fi
if [ "$SYNTAX_OK" = false ]; then
echo -e "\n${RED}構文エラーがあるため、処理を中断します (Protego)。${NC}"
exit 1
fi
echo
# --- 3. Execute Action ---
if [ "$RESTART_APACHE" = false ] && [ "$RESTART_PHP" = false ]; then
echo "対象サービスなし。終了します。"
exit 0
fi
if [ "$RESTART_APACHE" = true ]; then
manage_service "apache2" "Apache"
fi
if [ "$RESTART_PHP" = true ] && [ "$PHP_FPM_ENABLED" = true ]; then
manage_service "$PHP_FPM_SERVICE" "$PHP_FPM_SERVICE"
fi
echo -e "${CYAN}👏 Finito!${NC}"
主な改良点
-r(Reload) オプションの追加: プロセスを殺さずに設定を読み直す。- カラー出力: 重要なメッセージを強調。
- PHPバージョンの柔軟性: 環境変数でも渡せるように変更。
スクリプトのコマンド化
このスクリプトをコマンドとして実行できるようにします。
sudo ln -sf /path/to/script/apache2-check.sh /usr/local/bin/apache2-check
- コマンド確認
which apache2-check
/usr/local/bin/apache2-check と表示されることを確認します。
後は、
sudo apache2-check
を実行すればOKです。
引数によるオプション
また、このコマンドは以下の引数での柔軟な処理も特徴です。
-y確認プロンプトを全てスキップし、全てyで応答。(cronなどで威力を発揮)-aApacheのみを対象。PHP-FPMを組み込んでいないとき、変更対象がApacheのみの場合。-pPHP-FPMのみを対象。PHP-FPMの設定のみを変更した場合。-rReload。設定変更のみを対象。- 引数無し : デフォルトでApacheとPHP-FPMを確認プロンプト込みで再起動確認。
-hこの引数を表示。