読者です 読者をやめる 読者になる 読者になる

女子WEBエンジニアのTechメモ

都内の某企業でマーケッターやってます。営業→WEBエンジニア・オフショア開発チーム駐在→マーケッター(SEO)ちょっと便利だなと思ったことをメモしています。

apache再起動にはrestartよりもgracefulを使うべき

インフラ

わたし「vhosts変更したので、サーバーの再起動をお願いします。gracefulで大丈夫です」

後輩「gracefulってなんですか?」

このやりとり、わたしも昔やったなあと思いつつ、復習がてらにまとめておきます。

前提としている環境

  • apache 2.2 / 2.4
  • CentOS6.x系(Linux OS であればほぼ同じ?)

(おさらい)apacheの起動・停止に使うコマンド

apacheの起動

下記のいずれか。

$ service httpd start
/etc/init.d/httpd start
apachectl start
/usr/local/apache/bin/apachectl start

apacheの停止

下記のいずれか

$ service httpd stop
/etc/init.d/httpd stop
apachectl stop
/usr/local/apache/bin/apachectl stop

apacheの再起動のコマンドと違い(restart/condrestart/reload/graceful)

restart

WEBサービスを今すぐ終了して再起動を行います。実行中のリクエストの処理は中止されます。

  • 親プロセス:子プロセスをすべて終了後、親プロセスも終了。起動処理の際に親プロセスのIDは変更されます。
  • TERMシグナルを送信してプロセスを即時終了した後(=停止処理)、連続して開始処理を行います。開始処理の際に、設定の変更が適用されます。

condrestart

WEBサービスを今すぐ終了して再起動を行います。実行中のリクエストの処理は中止されます。

restartの処理と流れは同じですが、apacheが起動されているときのみ再起動が行われます。

reload

WEBサービスを終了しないで、変更した設定の反映を行う。実行中のリクエストの処理は中止されます。

  • 子プロセス:HUPシグナル(SIGHUP)が送信され、子プロセスが終了します。
  • 親プロセス:終了しません。子プロセスがすべて終了したあと、親プロセスは設定を再読込して変更を適用します。

親プロセスをとめずに、変更後の設定の反映だけを行いたい場合に使用します。

graceful

WEBサービスを終了しないで、変更した設定の反映を行います。実行中のリクエストの処理は中止されません。

  • 子プロセス:USR1シグナルが送信され、子プロセスが終了します。ただし、実行中のリクエスト処理が完了した後に、子プロセスの終了が行われます。
  • 親プロセス:子プロセスをすべて終了後、親プロセスは設定を再読込して変更を適用します。

restartよりもgracefulを使うわけ

gracefulの場合、実行中のリクエストを即時終了しないので、他の開発者やサービス利用中のユーザーに優しいのです。

いきなりゲーム機のコンセントを引き抜くお母ちゃんと、「今のダンジョン終わったらコンセント抜くからねー終わったら教えてねー」と声かけてくれるお母ちゃんと、どっちがいいか?というと後者ですよね・・・

とはいえ、
gracefulだと反映されない設定変更もあるので、gracefulでも反映されない場合や、httpd.confとかを変更した場合は、タイミングをみてrestartが良さそうです。

graceful-stopというものも

apacheを停止するとき、stopでなくgraceful-stopを使うこともできるようです。

graceful-stopは、処理中のリクエストが終了をまって、すべての子プロセスを終了し、親プロセスを終了します。
※ GracefulShutdownTimeout で設定した時間がすぎると、子プロセス処理中でも、残りの子プロセスにTERMシグナルが送信され、強制終了となります。

apacheでエラーになったときはバージョン確認を

apacheでエラーになったときに多かったのが、「バージョンによる文法・コマンドの違い」でした。
(apacheに限ったことではなく、サーバーや他アプリケーションでも同じことですが・・・!)

そのため、「ドキュメント通りにやってるのにエラーになる!」というときは、ドキュメントの対象としているバージョンと現在使っているapacheのバージョンが一致しているか確認しましょう。

サーバーのバージョンを確認することで、実行中のapacheのバージョンを確認できます。
サーバーの確認方法はこちら↓

$ httpd -v

わからないことメモ

  • CentOS 7.系だと、systemctlコマンドを使うらしいけど、apachectlやservice httpd は使えない?
  • service httpd と /etc/init.d/httpd と apachectl の違いがよくわからない。

Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集

Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集

できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 できるPROシリーズ

できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 できるPROシリーズ

  • 作者: 辻秀典,渡辺高志,鈴木幸敏,できるシリーズ編集部
  • 出版社/メーカー: インプレス
  • 発売日: 2013/02/17
  • メディア: Kindle版
  • この商品を含むブログを見る
サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)

サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design plus)