Apache-2.4

如何從 apache 調試超時錯誤?

  • October 26, 2015

我不確定這個問題是屬於 ServerFault 還是 StackOverflow,但由於我猜測我需要在伺服器端調試這個問題,所以我將使用 ServerFault。

問題

我們正在為我們的一些客戶執行一個共享的虛擬主機伺服器。一切都執行順利,除了一個客戶他們的網站。每周大約 2 到 3 天,我們的監視器檢測到短暫的停機時間,因為 apache 沒有在 30 秒內提供頁面,而是在 60 到 120 秒之間。我用自己的桌面檢查了一次確認:網站一直載入 80 秒,然後突然載入。沒有增加負載,沒有比正常更多的請求,並且伺服器上的其他網站完美載入。

我們之前遇到了一個特定外掛的問題:這個外掛與作者的伺服器聯繫以確認許可證密鑰。當此伺服器無法訪問時,Wordpress 無法繼續載入並且出現與現在相同的症狀。我們注意到這一點是因為有一天他們的伺服器停機了幾個小時,我們有時間一個一個地禁用和啟用所有外掛。根據外掛作者的說法,現在問題已經解決了。

我有強烈的感覺,我們又在看同樣的問題,也許是同一個外掛,也許不是。但是由於停機時間很短(通常不超過 2 分鐘),我不知道如何調試這個超時錯誤。

我想過的事情

通常我會一一禁用外掛,但在我連接到數據庫以禁用外掛之前,網站又重新啟動了。由於停機時間沒有規律,我無法等待它發生時。Apache 日誌沒有顯示任何錯誤:我只能看到來自使用者的請求,並且看到有一段時間沒有提供文件。

我的第二個想法是在 apache 程序上執行堆棧跟踪。我很確定這會揭示 Apache 在哪裡等待了這麼久。但是由於伺服器每分鐘收到超過 30 個請求,日誌文件會在幾個小時內變得非常大,這將使我們無法找到正確的請求。

相關伺服器規格

CentOS Linux release 7.0.1406 (Core)
Kernel 3.10.0-123.el7.x86_64

Apache/2.4.12 with mod_ruid2
PHP 5.4.38 (cli)
mysql Ver 15.1 Distrib 5.5.41-MariaDB, for Linux (x86_64) using readline 5.1

All compiled by DirectAdmin 1.48.3

想法?

誰能想到調試這個非常具體的問題的好方法?任何幫助是極大的讚賞!

編輯:

  • 慢查詢日誌在慢請求期間不報告任何慢查詢。

正如我所提到的,我們懷疑其中一個外掛是手頭問題的原因。早些時候,當他們的許可證伺服器關閉時,我們的網站也關閉了。他們表示這個問題已通過他們的最後一次更新修復,但由於我們有這麼多停機時間,我對此表示懷疑。

我們最終通過以下方式對其進行了調試:

  • 我們做了一個正常請求的 strace,看看頁面是如何載入的。
  • 如果這個外掛是問題所在,它可能會通過 TCP 埠 80 與許可證伺服器聯繫。我們以前沒有想到這一點,但這對我們有用:我們在 IP-tables 中阻止了這個埠以模擬時間-out 在許可證伺服器上*(確保在 IP 表中將 127.0.0.1 列入白名單,這樣它就不會被永久阻止)*。
  • 我們再次 strace 並載入了頁面:這一次,它沒有載入並卡住了。幾秒鐘後,我們關閉了 strace,並查看了文件。

strace 的最後一行是文件的載入:/wp-content/plugins/

$$ plugin-name $$/$$ file-of-plugin $$.php。Apache 無法通過這個外掛,直到我們再次解除對 80 埠的封鎖。 我們刪除了外掛,從那時起就沒有遇到任何停機時間。這是一個非常罕見的問題,但如果其他人遇到同樣的問題,我希望我的回答會有所幫助。

感謝所有的評論和回答。我們非常感謝它,它確實幫助我們思考解決方案。

如果 Apache 仍然可以訪問,我將首先獲取擴展狀態頁面以查看目前正在處理哪些請求。如果有一個長時間執行的請求,你甚至可以 strace 它,pid 應該在狀態中可見(因為你有 mod_ruid2 我猜你執行 mod_php 和 prefork MPM,所以一個程序一次只能服務一個請求)。

也許重新配置 Customlog,並記錄服務請求所花費的時間,以便稍後您可以辨識緩慢的請求。

一旦你有緩慢的請求,看看是否可以重現。如果是,那麼它更容易調試,您甚至可以為 PHP 分析/調試添加 xdebug。

另請查看掛起時正在執行的 MySQL 查詢,可能是 MySQL 慢查詢/鎖定問題。

正如您所說,也可能是網路 API 問題。

當你用盡所有選項時,也許只是與老闆交談,然後踢使用者。根據伺服器上有多少其他站點,伺服器執行狀況可能比站點本身更重要。

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