【UNIX】Apacheの再起動にはWebサービスを終了させずに設定変更を反映する「graceful」を使う
2018/05/11
以前、Apacheの再起動時に「Address already in use」というエラーが出て、うまく再起動ができないというポストを書いたのですが、どうすれば回避できるのかを、少し時間が空いた時に調査してみたのでまとめておきます。
Apacheの再起動コマンドについて
そもそもですが、Apacheの再起動のコマンドについて全然理解できていなかったので、その違いなどをまとめてみます。
Apacheの再起動コマンド
再起動に関するコマンドは次の4つがあります。
- restart
- condrestart
- reload
- graceful
1. restart
- Apacheの stop, restart の処理を連続して行ないます
- 子プロセスを kill します。親プロセスは終了しません(killしません)
- 停止処理は、TERMシグナル(SIGTERM)を送って、プロセスを即終了します
- 親プロセスは、設定ファイルを再読込して、ログファイル全てを開き直します
- その後、新しい子プロセスを起動して応答を続けます
- 親プロセスIDは変更されます
2. condrestart
- restart の処理と同じですが、Apache httpd が起動しているときだけ再起動を行います
3. reload
- HUPシグナル(SIGHUP)を送って、子プロセスを終了します
- ただし、子プロセスのみを即終了して、親プロセスは終了しません
- 処理中のリクエストはすべて中止されます
- すべての子プロセスが終了したあとに、親プロセスは設定を再読み込みし、変更した設定が反映されます
変更後の設定の反映だけを行いたい場合に使用します。
4. graceful
- 子プロセスは、現在のリクエストが終了後に終了します
- 親プロセスは設定ファイルを読み直し、変更した設定が反映されます
- 子プロセスが徐々になくなるに従って、 新しい子プロセスが起動されます
実行中のリクエストの処理を中止させたくない場合に使用します。
違いのまとめ
restart | Webサービスを即終了して再起動する。 |
---|---|
condrestart | Webサービスを即終了して再起動する。 |
reload | Webサービスを終了しないで、設定変更を反映する。 実行中のリクエストの処理を中止しても構わない場合に使用する。 |
graceful | Webサービスを終了しないで、設定変更を反映する。 実行中のリクエストの処理を中止させたくない場合に使用する。 |
(参考)手元にあるサーバ(CentOS)での挙動
/etc/rc.d/init.d/httpd restart
1 2 3 4 5 |
httpd を停止中: [失敗] httpd を起動中: (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down Unable to open logs [失敗] |
→ 失敗
/etc/rc.d/init.d/httpd condrestart
→ 成功
/etc/rc.d/init.d/httpd reload
1 |
httpd を再読み込み中: [失敗] |
→ 失敗
/etc/rc.d/init.d/httpd graceful
1 2 3 4 |
httpd not running, trying to start (98)Address already in use: make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down Unable to open logs |
→ 失敗
/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」で起動、停止ができるようにしています。
ファイルを設置
1 |
cp /usr/local/src/httpd-2.2.18/build/rpm/httpd.init /etc/rc.d/init.d/httpd |
ファイルを編集
1 |
vi /etc/rc.d/init.d/httpd |
Apacheのインストール先に合わせて設定を2か所ほど変更。
編集該当部分
httpd=${HTTPD-/usr/local/apache2/bin/httpd}
CONFFILE=/usr/local/apache2/conf/httpd.conf
編集が終わったら、保存。
スクリプトに実行権限付与
1 |
chmod 755 /etc/rc.d/init.d/httpd |
サービスに登録
1 |
chkconfig --add httpd |
自動起動設定
1 |
chkconfig httpd on |
以上の設定で、
Apache起動
1 2 3 |
service httpd start もしくは /etc/rc.d/init.d/httpd start |
Apache停止
1 |
/usr/local/apache2/bin/httpd -k stop |
これで起動、停止ができます
(参考)Apacheの起動
- service httpd start
- /etc/rc.d/init.d/httpd start
- /usr/local/apache2/bin/apachectl start
(参考)Apacheの停止
- service httpd stop
- /etc/init.d/httpd stop
- /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の起動スクリプト