Apache-2.2

Apache Web 服務重啟是否會關閉現有的 MySQL 連接?

  • March 21, 2017

在 ’too many connections’ 錯誤的情況下,如果我做 a service httpd restart/reload,它會釋放現有的 MySQL 連接嗎?

是否有可能在重新啟動 Apache 時,Apache 關閉數據庫連接但不通知 mysqld。

注意:mysqld 的 wait_timeout = 8 小時。

簡短的回答是肯定的,但不是直接的。無論如何,我會考慮將您的 MySQL 減少wait_timeout到更現實的時間,例如 30 秒。

Apache 是一個網路伺服器,它接受 HTTP 連接請求並將內容返回給客戶端——它不能本地連接到 MySQL 數據庫。

您的連接最可能的來源是生成對這些請求的響應的應用程序,即 PHP、Java、Python 等 - 您已經標記了您的問題,php所以我將在這裡假設 PHP。

現在,還假設您使用 Apache 的 mod_php 而不是 PHP-FPM,那麼 PHP 程序由 Apache 分叉,因此當您重新啟動 Apache 時,這些程序將被殺死並重新生成。如果您正在執行 PHP-FPM,重新啟動 Apache 不會殺死任何 PHP 程序,因為 FPM 作為自己的守護程序執行。

在通過 mod_php 殺死 PHP 程序的情況下,它不會mysql_close()直接呼叫關閉連接,因此連接會保持打開wait_timeout幾秒鐘。

service httpd graceful您可以使用or告訴 Apache 進行“優雅”重啟並允許現有執行緒在終止之前退出apachectl -k graceful

但是,如果您的 PHP 程式碼沒有通過mysql_close()then 關閉連接,那將是您問題的最終根源,並且通過任何方法重新啟動 Apache 都無法解決問題。

restart此外,與vs進行的一個重要區別reload- 前者終止程序,後者只是重新載入配置。如果您真的想終止程序,請使用restart.

引用自:https://serverfault.com/questions/839555