使用中のプロセスが終了するのを待ってhttpdサービスを停止する|graceful-stopの使い方

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Webサーバー管理, サーバー管理 > 使用中のプロセスが終了するのを待ってhttpdサービスを停止する|graceful-stopの使い方
「Apacheを停止したいけれど、通信中のユーザーを切断したくない…」
\n
\n本番運用中のWebサーバーで systemctl stop httpd を実行すると、処理中のリクエストが途中で切断されてしまいます。ダウンロード中のユーザーや決済処理中の顧客に影響を与えないためには、接続が終わるのを待ってから停止する仕組みが必要です。
\n
\nこの記事では、Apache HTTP Serverの graceful-stop を使って、通信中のクライアントに影響を与えずhttpdサービスを停止する方法を解説します。
\n
\n
【この記事でわかること】
\n\n・graceful-stop は通信中のリクエストが完了するのを待ってから停止する
\n・apachectl graceful-stop または httpd -k graceful-stop で実行できる
\n・systemctl stop httpd は即時停止で既存接続を切断する
\n・RHEL9系は apachectl、Ubuntu LTSは apache2ctl とコマンド名が異なる
\n・待ち時間の上限は GracefulShutdownTimeout ディレクティブで設定できる
\n

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

graceful-stopとは

graceful-stop は、Apache HTTP Serverを「丁寧に」停止するための操作です。実行すると親プロセスは新規リクエストの受付をやめ、現在処理中の子プロセスがすべての接続を完了するのを待ってから終了します。

ダウンロード途中で切断されたり、決済処理が中断されたりしないため、本番環境のサービス停止やメンテナンス切り替えで重宝します。

反対に systemctl stop httpd は即時停止で、実行中のリクエストがあっても強制的に切断します。

RHEL9系でgraceful-stopを実行する

AlmaLinux9/Rocky Linux9/RHEL9では、apachectl を使って次のように実行します。

# apachectl graceful-stop を実行する # apachectl graceful-stop # または httpd バイナリを直接指定する # httpd -k graceful-stop

graceful-stopを実行しても「OK」などの表示は出ません。停止の進行状況は pssystemctl status httpd で確認します。

# 停止の進行状況を確認する # ps -ef | grep httpd

Ubuntu LTSでの実行方法

Ubuntu 22.04/24.04 LTSではApacheのパッケージ名が apache2 で、コマンドも apache2ctl になります。

$ sudo apache2ctl graceful-stop

systemdのユニット名も異なるため、systemctl stop apache2 と対になる操作として使い分けます。

systemctlとgraceful-stopの違い

両者の動作の違いをまとめます。

操作 既存接続 用途
systemctl stop httpd 即時切断 緊急停止・開発環境
apachectl graceful-stop 完了を待つ 本番の計画停止
apachectl graceful 完了を待って再読込 設定変更の反映
なお、systemdユニットファイルに ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop が定義されているディストリビューションもあります。その場合は systemctl stop httpd 自体がgraceful-stop相当になります。以下のコマンドで確認できます。

# ExecStop の設定を確認する # systemctl cat httpd | grep ExecStop ExecStop=/usr/sbin/httpd -k graceful-stop

graceful-stop実行時の注意点

graceful-stopは便利ですが、いくつか注意が必要です。

・長時間接続(WebSocketや大容量ダウンロード)があると、停止まで数分以上待たされることがある
・停止途中に新規リクエストは受け付けないが、ポートは解放されていないため別プロセスの起動とは競合する
・接続がなかなか終わらない場合は、最終的に systemctl kill httpd で強制停止する判断も必要

待ち時間の上限を決めておきたい場合は、GracefulShutdownTimeout ディレクティブを httpd.conf に設定します(単位は秒)。

# 最大60秒待ってから強制終了する設定 GracefulShutdownTimeout 60

まとめ

やりたいこと コマンド
接続完了を待って停止する(RHEL9系) apachectl graceful-stop
接続完了を待って停止する(Ubuntu) sudo apache2ctl graceful-stop
即時停止する systemctl stop httpd
停止の進行状況を確認する ps -ef | grep httpd
ExecStop設定を確認する systemctl cat httpd | grep ExecStop
待ち時間の上限を設定する httpd.conf に GracefulShutdownTimeout 60

Apacheの安全な停止だけでなく、本番サーバーを正しく管理するための「型」を身につけたいですか?

graceful-stopを使いこなすことは、本番環境でのサービス影響を最小化するための重要なスキルです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。