Apache 起動:停止・再起動コマンドと graceful の違い
Linux サーバーで Apache の起動・停止・再起動は systemctl コマンドで実行し、サービス名は RHEL 系が httpd、Debian 系が apache2 です。AlmaLinux 9 サーバーで systemctl status の出力と httpd のユニットファイル、apachectl スクリプトを読んだ結果、restart は Apache をいったん停止してから起動し直し、graceful は親プロセスをそのまま残して設定だけを読み直しました。
停止と再起動はサービスを実際に止めてしまうため、テストしたサーバーでは起動・停止・再起動を実行していません。代わりに Apache 公式ドキュメントと httpd.service のマニュアル、サーバーに残っていた reload の記録で動作を確認しました。以下の出力のホスト名とポート番号、時刻、リクエスト数は例の値です。
1️⃣ Apache の起動・停止・再起動コマンド
Apache のサービス名はディストリビューションの系統によって違います。RHEL や AlmaLinux、Rocky Linux などの RHEL 系は httpd、Ubuntu と Debian は apache2 という名前で systemd に登録されます。
| タスク | RHEL 系(httpd) | Debian 系(apache2) |
|---|---|---|
| 起動 | systemctl start httpd | systemctl start apache2 |
| 停止 | systemctl stop httpd | systemctl stop apache2 |
| 再起動 | systemctl restart httpd | systemctl restart apache2 |
| 設定の再読み込み(graceful) | systemctl reload httpd | systemctl reload apache2 |
| 状態の確認 | systemctl status httpd | systemctl status apache2 |
| 起動時に自動で開始 | systemctl enable httpd | systemctl enable apache2 |
表のコマンドは root アカウントで実行します。一般ユーザーの場合はコマンドの前に sudo を付けます。
系統を取り違えて別の名前を入れると、コマンドは実行されません。RHEL 系のサーバーで apache2 として状態を問い合わせると、ユニットが見つからないというエラーが出ました。
systemctl status apache2Unit apache2.service could not be found.このときの終了コードは4で、同じサーバーで名前を httpd に変えると正常な出力が出ました。
RHEL 系では次の3つのコマンドで Apache を起動・停止・再起動します。
systemctl start httpdstart は止まっている Apache を起動します。起動したかどうかは systemctl status で確認します。
systemctl stop httpdstop は Apache を停止します。再び起動するまで Web リクエストを受け付けません。
systemctl restart httpdrestart は stop と start を順に実行します。設定ファイルだけを変えた場合は、接続を切らない reload(graceful)で反映します。
AlmaLinux 9 の apachectl は、Apache が配布する apachectl の代わりに入っているシェルスクリプトです。start と stop、restart、status を受け取ると systemctl にそのまま渡すため、apachectl restart と systemctl restart httpd は同じ動作をします。
2️⃣ Apache サービスの状態確認
Apache がいま動いているか、いつ起動したかは systemctl status で確認します。
systemctl status httpd● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
Active: active (running) since Sat 2026-10-17 08:30:49 UTC; 1 week 4 days ago
Docs: man:httpd.service(8)
Process: 2930107 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 741 (httpd)
Status: "Total requests: 52418; Idle/Busy workers 75/0;Requests/sec: 0.0528; Bytes served/sec: 3.9KB/sec"
Tasks: 224 (limit: 4615)
Memory: 184.3M (peak: 593.8M)
CPU: 47min 33.944s
CGroup: /system.slice/httpd.service
├─ 741 /usr/sbin/httpd -DFOREGROUND
├─2930111 /usr/sbin/httpd -DFOREGROUND
├─2930143 /usr/sbin/httpd -DFOREGROUND
└─2930144 /usr/sbin/httpd -DFOREGROUND
Oct 28 15:00:00 server systemd[1]: Reloading The Apache HTTP Server...
Oct 28 15:00:00 server systemd[1]: Reloaded The Apache HTTP Server.
Oct 28 15:00:00 server httpd[741]: Server configured, listening on: port 80[Active] 行の active (running) はいま実行中という意味で、since の後ろの時刻が起動した時点です。このサーバーは11日前に起動してから一度も止まっておらず、[Main PID] 741 がそのとき起動した親プロセスでした。
[CGroup] の下で 741 の下に並んでいる プロセスは、実際にリクエストを処理する子プロセスです。[Status] 行には、これまでに処理したリクエスト数と、待機中のワーカー(worker)・処理中のワーカーの数が出ます。
出力のいちばん下にあるログ3行は、1日1回同じ時刻に残った reload の記録でした。ログを日付ごとに分割する logrotateがローテーションを終えたあとに systemctl reload httpd を実行したもので、httpd.service のマニュアルにも logrotate の後に httpd を reload すると書かれています。
スクリプトや点検用のコマンドでは、単語を1つだけ出力する is-active と is-enabled を使います。
systemctl is-active httpdactive実行中のときは active と終了コード0が出ました。サーバーにない apache2 を入れても、止まっているサービスと同じ inactive と終了コード3が出たので、スクリプトではまずサービス名が正しいかを確認します。
systemctl is-enabled httpdenabledenabled は、起動時に Apache が自動で開始するよう登録された状態です。
3️⃣ Apache の再起動と graceful の違い
restart と graceful(reload)は、処理中だったリクエストと親プロセスの扱い方が違います。その違いは、まず httpd のユニットファイルで reload と stop に使う行で確認しました。
systemctl cat httpd | grep -E "Exec|Kill"ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
KillSignal=SIGWINCH
KillMode=mixedExecReload 行は reload を受けると httpd -k graceful を実行するという意味で、KillSignal 行は stop のときに送るシグナルが SIGWINCH(graceful-stop)だという意味です。
そのため systemctl restart httpd は、Apache を graceful-stop で止めてから新しく起動します。処理中のリクエストは終えてから停止しますが、親プロセスから新しく起動するので [Main PID] の番号が変わります。停止から起動までの間はポートを閉じるため、新しい接続を受け付けられません。Debian パッケージの apache2.service ユニットファイルも、停止のときに apachectl graceful-stop を実行します。
httpd -k restart は親プロセスに HUP シグナルを送ります。Apache 公式ドキュメントによると、親はそのまま残りますが子プロセスをすぐに終了させるため、処理中だったリクエストは切れ、リクエストの統計も0に戻ります。
graceful は親プロセスに USR1 シグナルを送ります。親は設定ファイルを読み直し、子プロセスは処理していたリクエストを終えた順に、新しい設定の子に入れ替わります。その間に届いた接続は OS が待たせておくので、失われません。
営業中の店が扉を閉めずに、レジの店員が接客を終えた順に新しいシフト表の店員と交代するのと同じです。
この違いは Main PID で確認しました。毎日 reload が実行されていたのに Main PID 741 と Active の時刻は11日前のままで、子プロセスの番号(2930111 など)は最後の reload を実行した [Process] 行の 2930107 のすぐ後の番号でした。
systemctl reload httpd と apachectl graceful、httpd -k graceful はすべて同じ graceful です。AlmaLinux 9 の apachectl は graceful を受け取ると systemctl kill で親プロセスに SIGUSR1 を送り、前に -k を付けた apachectl -k graceful も -k を外して同じ動作をします。
graceful は設定を読み直すだけなので、httpd パッケージを更新した後には向きません。httpd.service のマニュアルによると、更新したモジュールが新しい httpd にしかない機能を使う場合は reload では安全でないため、httpd パッケージは更新されるときに systemctl try-restart で Apache を自動的に再起動します。
4️⃣ Apache 設定の構文チェック
graceful で接続を切らずに反映しても、設定ファイルにタイプミスがあると Apache は新しい設定に切り替わりません。Apache 公式ドキュメントによると、restart と graceful は実行前にまず構文チェックを行い、エラーがあればエラーメッセージだけを出して再起動しません。
そのため、設定を直した後はまず apachectl -t で構文をチェックします。
apachectl -tSyntax OKapachectl -t を実行すると Syntax OK の1行が出て、apachectl configtest で実行しても同じ結果でした。RHEL 系の apachectl は -t を受け取ると httpd -t をそのまま実行します。
ディレクティブ名を1つ間違えて書いた試験用の設定ファイルでチェックすると、Syntax OK の代わりに AH00526 エラーとともに、何行目か、どのディレクティブを認識できなかったか([Invalid command 'DirectoryIndx'])が出て、終了コードは1でした。エラーメッセージに出た行を直してから、もう一度チェックします。
systemctl reload httpdチェックを通ったら reload で設定を反映します。Apache 公式ドキュメントによると、構文チェックは構文しか見ないため、通っても反映に失敗することがあります。reload の後は systemctl status の [Active] 行と、いちばん下のログをもう一度確認します。
🔲 Apache コマンドシミュレーター
下のシミュレーターの仮想サーバーで、systemctl と apachectl、httpd -k コマンドを実際に入力してみられます。reload の後は Main PID がそのままで、子プロセスの番号だけが変わります。restart の後は Main PID まで新しい番号に変わります。
🔢 FAQ & おすすめコンテンツ
Apache · 再起動エラー
Apache 再起動エラー | (20014)Internal error: Error retrieving pid file logs/httpd.pid
apachectl restart などのコマンドで pid ファイルのエラーが出る原因と、空の httpd.pid を片付ける手順です。
Apache · php-fpm
php-fpm max_children 警告:ワーカーを増やす前にログで原因を突き止める
Nginx と Apache、php-fpm 構成の WordPress サーバーで、max_children 警告が積み重なった原因をログで突き止めた記録です。
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。