@suzu6

主にWEBと解析の技術について書きます。

広く浅くも続ければ深くなるはず。

configtestとgracefulでApacheの安全に再起動して設定を反映させる

本番稼働中のサーバのApacheの設定を変更したり、新しくホストを追加する作業には神経を使う。 サイトを止めないよう、できるだけ安全にApacheの設定を変更するコマンドと手順を紹介する。

※間違いがあるかもしれません。コマンドを実行される前にApacheのドキュメントをご確認ください。

環境

  • CentOS 7.4
  • Apache 2.4

コマンドは基本apachectlを使っていきます。

systemctlhttpd/etc/rc.d/init.d/httpd2とたくさんあるので対応したコマンドも載せておく。

restartは使わないで

環境構築のときはrestartをよく使うかもしれませんが、 Apacheが止まってはまずい状況では使わないで下さい。

restartはApacheを停止してから起動します。 設定を間違えていた場合、修正する時間サイトが停止してしまいます。 また、誰かがサイトにアクセス中だと子プロセスが走っていますが、restartは子プロセスをkillします。

  1. configtestでconfの構文チェック
  2. gracefulで緩やかに再起動させる

以上の手順を踏まれた方が安全に設定を反映できます。

設定ファイルの変更後の確認 configtest

apachectl configtestもしくはapachectl -t

confファイルを書き換えた後は記述が正しいかconfigtestで確認できます。 構文が間違っているとエラー箇所を教えてくれますし、正しくてもディレクトリがない場合もWarningで教えてくれます。

$ sudo apachectl configtest
Syntax OK

問題なければSyntax OKとなる。

# 権限がない場合の例
$ apachectl -t
Syntax error on line 31 of /etc/httpd/conf.d/ssl.conf:
SSLPassPhraseDialog: file '/root/bin/echo_passphrase' does not exist

権限も検知してくれる。

# DocumentRootのディレクトリがない場合の例
$ sudo apachectl configtest
AH00112: Warning: DocumentRoot [/var/www/app/public] does not exist
Syntax OK

構文エラーがなくとも、Warningを示してくれる。 エラーもWarningも全て修正しておきたい。

$ httpd -t
$ httpd configtest
$ /etc/init.d/httpd configtest

Apacheを止めずに設定反映 graceful

apachectl -k graceful

graceful緩やかな再起動です。 子プロセスは現在の処理を完了してから終了します。 親プロセスは設定を反映しておき、新しい子プロセスから新しい設定で動かす。

また、再起動前に構文チェックが走りエラーがある場合再起動されない。 (※これでも正しく再起動することは保証されていないため、事前にチェックは必要)

$ sudo apachectl -k graceful

正しく再起動できた場合特に表示はない。

$ httpd -t
$ httpd configtest
$ /etc/init.d/httpd configtest

systemctlではsystemctl reload httpdがほぼ同じコマンド。

httpdがもし立ち上がらなかったら

$ sudo cat /var/log/httpd/error_log

/var/log/httpd/error_logにエラーログがある。 読んでググれば大体検討は付くはず。

参考

何かあったらこれをまず見る。

ログの操作も載っている。

http -tapachectl configtestは環境変数を読み込むか読み込まないかの違いがあるらしい。

gracefulが「プロセスが終わるのを待ってから新しい設定を反映させる」か検証された記事。 reloadは子プロセスの終了を待つが、gracefulは子プロセスを強制終了させるらしい。(ドキュメントと異なる?)

gracefulrestartの挙動の違いがわかりやすい。