Apache Web 服務重啟是否會關閉現有的 MySQL 連接?
在 ’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
.