Apache 起動:停止・再起動コマンドと graceful の違い

テスト環境RHEL系AlmaLinux 9.8rootアカウント2026-10-29 確認

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 httpdsystemctl start apache2
停止systemctl stop httpdsystemctl stop apache2
再起動systemctl restart httpdsystemctl restart apache2
設定の再読み込み(graceful)systemctl reload httpdsystemctl reload apache2
状態の確認systemctl status httpdsystemctl status apache2
起動時に自動で開始systemctl enable httpdsystemctl enable apache2

表のコマンドは root アカウントで実行します。一般ユーザーの場合はコマンドの前に sudo を付けます。

系統を取り違えて別の名前を入れると、コマンドは実行されません。RHEL 系のサーバーで apache2 として状態を問い合わせると、ユニットが見つからないというエラーが出ました。

systemctl status apache2
Unit apache2.service could not be found.

このときの終了コードは4で、同じサーバーで名前を httpd に変えると正常な出力が出ました。

RHEL 系では次の3つのコマンドで Apache を起動・停止・再起動します。

systemctl start httpd

start は止まっている Apache を起動します。起動したかどうかは systemctl status で確認します。

systemctl stop httpd

stop は Apache を停止します。再び起動するまで Web リクエストを受け付けません。

systemctl restart httpd

restart は 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 httpd
active

実行中のときは active と終了コード0が出ました。サーバーにない apache2 を入れても、止まっているサービスと同じ inactive と終了コード3が出たので、スクリプトではまずサービス名が正しいかを確認します。

systemctl is-enabled httpd
enabled

enabled は、起動時に 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=mixed

ExecReload 行は 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 が待たせておくので、失われません。

営業中の店が扉を閉めずに、レジの店員が接客を終えた順に新しいシフト表の店員と交代するのと同じです。

🔁 Apache の再起動3種類で変わること
解説ダイアグラム
🔁 コマンド
$ systemctl restart httpdhttpd -k restartsystemctl reload httpd
① 親プロセス(Main PID)停止してから新しく起動Main PID の番号が変わります。そのままHUP シグナルを受けて設定ファイルを読み直します。そのままUSR1 シグナルを受けて設定ファイルを読み直します。
② 処理中だったリクエスト終えてから終了停止が graceful-stop(WINCH)なので、処理中のリクエストを終えます。すぐに切れる子プロセスをすぐに終了し、新しい子を起動します。最後まで処理子はリクエストを終えた順に、新しい設定の子に入れ替わります。
③ 新しく届く接続再び起動するまで受け付けない停止するときにポートを閉じます。新しい子が起動してから処理ポートは開けたまま、新しい子が起動したら処理します。切れないポートを開けたままにして、OS が接続を待たせます。
systemctl restart httpd は Apache を停止してから再び起動するため、親プロセスから新しく起動し、その間は新しい接続を受け付けられません。
httpd -k restart は親プロセスに HUP シグナルを送って子プロセスをすぐに終わらせるため、処理中だったリクエストが切れます。
systemctl reload httpd と apachectl graceful は親プロセスをそのまま残し、子プロセスをリクエストが終わった順に入れ替えます。

この違いは 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 -t
Syntax OK

apachectl -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 まで新しい番号に変わります。

Apache コマンドシミュレーターRHEL 系 httpd
[root@server work]#
キーボードの↑↓で、前に入力したコマンドを呼び出せます。

🔢 FAQ & おすすめコンテンツ

AlmaLinux 9 で apachectl fullstatus を入力すると、fullstatus オプションをサポートしていないというエラー(not supported)と終了コード2が出ました。RHEL 系の apachectl は Apache が配布する apachectl の代わりに入っているスクリプトなので、start と stop、restart、status、graceful、graceful-stop、configtest、-t、-v しか受け付けません。

httpd.service のマニュアルによると、httpd ユニットは既定値がオフ(disabled)で、systemctl status の [Loaded] 行に出る preset: disabled がその既定値です。systemctl enable httpd を一度実行すると起動のたびに開始し、enable に --now を付けるといますぐ起動までします。

httpd.service のマニュアルによると、root シェルで httpd を直接実行すると systemd の外でサービスが起動し、SELinux などの既定のセキュリティ制限が適用されません。そのため起動と停止は systemctl か apachectl で行い、httpd コマンドは -t の構文チェックのように、サービスを起動しないオプションにだけ使います。

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 2   +   3   =