web-dev-qa-db-ja.com

Apache Webサービスは再起動して既存のMySQL接続を閉じますか?

'接続数が多すぎる'エラーの場合、service httpd restart/reload、既存のMySQL接続を解放しますか?

Apacheを再起動するときに、ApacheがDB接続を閉じても、mysqldに通知しない可能性はありますか。

注:mysqldのwait_timeout = 8時間です。

1
starchx

簡単な答えは「はい」ですが、直接ではありません。いずれにせよ、MySQLwait_timeoutを30秒などのより現実的なものに短縮することを検討します。

ApacheはWebサーバーであり、HTTP接続要求を受け入れ、コンテンツをクライアントに返します。MySQLデータベースにネイティブに接続することはできません。

接続の最も可能性の高いソースは、これらのリクエストへの応答を生成するアプリケーション、つまりPHP、Java、Pythonなどです。質問にphpのタグを付けたので、PHPここに。

ここで、PHP-FPMではなくApacheのmod_phpを使用すると仮定すると、PHPプロセスはApacheによってフォークされるため、Apacheを再起動すると、これらのプロセスは強制終了され、再生成されます。PHPを実行している場合-FPM、Apacheを再起動しても、FPMは独自のデーモンとして実行されるため、PHPプロセスは強制終了されません。

PHPプロセスがmod_phpを介して強制終了された場合、接続を直接閉じるためにmysql_close()を呼び出さないため、接続はwait_timeout秒間開いたままになります。

service httpd gracefulまたはapachectl -k gracefulを使用して、Apacheに「正常な」再起動を実行し、終了前に既存のスレッドを終了できるようにすることができます。

ただし、PHPコードがmysql_close()を介して接続を閉じていない場合、それが問題の最終的な原因となり、任意の方法でApacheを再起動しても問題は解決しません。

また、restartreloadの重要な違いは、前者はプロセスを終了し、後者は単に構成を再読み込みすることです。本当にプロセスを終了したい場合は、restartを使用してください。

3
Craig Watson