apache .htaccess

Apache

【UNIX】Apacheの再起動にはWebサービスを終了させずに設定変更を反映する「graceful」を使う

2018/05/11

以前、Apacheの再起動時に「Address already in use」というエラーが出て、うまく再起動ができないというポストを書いたのですが、どうすれば回避できるのかを、少し時間が空いた時に調査してみたのでまとめておきます。

Apacheの再起動コマンドについて

そもそもですが、Apacheの再起動のコマンドについて全然理解できていなかったので、その違いなどをまとめてみます。

Apacheの再起動コマンド

再起動に関するコマンドは次の4つがあります。

  1. restart
  2. condrestart
  3. reload
  4. graceful

1. restart

  • Apacheの stop, restart の処理を連続して行ないます
  • 子プロセスを kill します。親プロセスは終了しません(killしません)
  • 停止処理は、TERMシグナル(SIGTERM)を送って、プロセスを即終了します
  • 親プロセスは、設定ファイルを再読込して、ログファイル全てを開き直します
  • その後、新しい子プロセスを起動して応答を続けます
  • 親プロセスIDは変更されます

2. condrestart

  • restart の処理と同じですが、Apache httpd が起動しているときだけ再起動を行います

3. reload

  • HUPシグナル(SIGHUP)を送って、子プロセスを終了します
  • ただし、子プロセスのみを即終了して、親プロセスは終了しません
  • 処理中のリクエストはすべて中止されます
  • すべての子プロセスが終了したあとに、親プロセスは設定を再読み込みし、変更した設定が反映されます

変更後の設定の反映だけを行いたい場合に使用します。

4. graceful

  • 子プロセスは、現在のリクエストが終了後に終了します
  • 親プロセスは設定ファイルを読み直し、変更した設定が反映されます
  • 子プロセスが徐々になくなるに従って、 新しい子プロセスが起動されます

実行中のリクエストの処理を中止させたくない場合に使用します。

違いのまとめ

restartWebサービスを即終了して再起動する。
condrestartWebサービスを即終了して再起動する。
reloadWebサービスを終了しないで、設定変更を反映する。
実行中のリクエストの処理を中止しても構わない場合に使用する。
gracefulWebサービスを終了しないで、設定変更を反映する。
実行中のリクエストの処理を中止させたくない場合に使用する。

(参考)手元にあるサーバ(CentOS)での挙動

/etc/rc.d/init.d/httpd restart

失敗

/etc/rc.d/init.d/httpd condrestart

成功

/etc/rc.d/init.d/httpd reload

失敗

/etc/rc.d/init.d/httpd graceful

失敗

/usr/local/apache2/bin/apachectl restart

成功

/usr/local/apache2/bin/apachectl condrestart

→ 使い方のヘルプが出る

/usr/local/apache2/bin/apachectl reload

→ 使い方のヘルプが出る

/usr/local/apache2/bin/apachectl graceful

成功

結論

/usr/local/apache2/bin/apachectl graceful を使えば、幸せになれそう。

(参考)Apacheの起動・停止コマンド

ついでにと言ってはなんですが、起動と停止のコマンドについてもちょこっと載っけておきます。

なお社内で作成しているサーバのApacheは、伝統的に以下の手順でサービスを登録し、「service httpd start」「service httpd stop」で起動、停止ができるようにしています。

ファイルを設置

ファイルを編集

Apacheのインストール先に合わせて設定を2か所ほど変更。
編集該当部分

httpd=${HTTPD-/usr/local/apache2/bin/httpd}
CONFFILE=/usr/local/apache2/conf/httpd.conf

編集が終わったら、保存。

スクリプトに実行権限付与

サービスに登録

自動起動設定

以上の設定で、

Apache起動

Apache停止

これで起動、停止ができます

(参考)Apacheの起動

  1. service httpd start
  2. /etc/rc.d/init.d/httpd start
  3. /usr/local/apache2/bin/apachectl start

(参考)Apacheの停止

  1. service httpd stop
  2. /etc/init.d/httpd stop
  3. /usr/local/apache/bin/apachectl stop

apachectl と httpd の違い

apachectl も httpd も、apacheを操作するコマンドですが、正式なのは「apachectl」の方とのこと。

  • /usr/local/apache2/bin/apachectl start
    ↑もともとのapacheの正当な起動方法
  • /etc/rc.d/init.d/httpd start
    ↑Red Hat用に誰かが作ったapacheの起動スクリプト
  • /etc/init.d/httpd start
    ↑Debian用に誰かが作ったapacheの起動スクリプト

関連ポスト

(98)Address already in use: と出てapacheが再起動できない場合の対策

参考文献

-Apache
-, , , , , ,