如何調試未載入的網站
所以我有一個使用 nginx/php-fpm/ubuntu 執行的網站
它工作得非常好(而且速度很快)並且幾乎不使用任何記憶體。我的客戶昨天開始了一個廣告活動,有幾次網站沒有載入五到十分鐘。我非常懷疑這是交通超載,因為統計數據顯示到目前為止遊客並不多。
在這些“中斷”期間,我將通過 ssh 連接並執行 htop 以查看資源統計資訊。處理器(全部)大約為 0%,記憶體在 1024mb 中只有 350mb,而且沒有交換。
我非常簡短地查看了訪問日誌,並沒有看到很多內容,儘管我確實注意到有幾個機器人在附近閒逛。我懷疑這是他們的錯,因為那裡沒有很多(順便說一句,“消費”簡單文本日誌文件的好方法是什麼?)
調試這個的所有步驟是什麼?
第一步是隔離故障發生的位置。聽起來您在中斷期間能夠連接到伺服器,因此在我看來不太可能出現一般伺服器故障或伺服器本地網路問題。
如果我的 Web 瀏覽器無法打開該頁面,我要做的第一件事是確定埠 80 是否響應連接嘗試。最簡單的方法是使用
telnet
, 例如(假設您使用的是類似 Unix 的東西):$ telnet your.server.name 80
在您知道正在工作的伺服器上嘗試一下,看看成功的消息是什麼樣的。例如,對於 www.google.com,我得到:
$ telnet www.google.com 80 Trying 74.125.95.103... Connected to www.l.google.com. Escape character is '^]'.
(要在這種狀態下退出 telnet,您需要按 Ctrl-],然後按 Enter,然後按 Ctrl-D。)
您可能會看到的故障包括 DNS 故障:
$ telnet fake.dns.entry 80 telnet: could not resolve fake.dns.entry/80: Name or service not known
在這種情況下,您將通過嘗試連接到 IP 地址來跟進。
另一種失敗的可能性是連接被拒絕或超時:
$ telnet serverfault.com 99 Trying 64.34.119.12... telnet: Unable to connect to remote host: Connection timed out
這通常意味著您和伺服器之間的伺服器或負載平衡器未在正確的埠上偵聽。您可能還會看到:
$ telnet 192.168.0.237 Trying 192.168.0.237... telnet: Unable to connect to remote host: No route to host
這意味著伺服器不存在於您認為存在的地址,或者兩者之間存在網路路由問題。
您應該首先從伺服器所在的網路外部進行測試,最好是在幾個 ISP 斷開連接的地方。然後從本地網路嘗試。然後在本地機器上嘗試它,使用“localhost”代替主機名,假設您的 Web 伺服器設置為偵聽環回連接。
一旦您了解了故障的模式,您就可以開始嘗試找出故障發生的位置。我的直覺是你的 nginx 或 FastCGI 是問題的根源,而不是一些不影響 SSH 流量的間歇性網路問題,但如果不首先解決網路問題,就不可能進一步排除故障。
希望這能給你一些關於下一次開始的想法。祝你好運。
更新
我剛剛注意到您的附帶問題是“使用”日誌文件的最佳方式。如果您正在解決問題,我建議使用
tail
. 在伺服器上打開兩個 ssh 會話,一個tail -f /var/log/nginx/access_log
和另一個tail -f /var/log/nginx/error_log
(或系統上的任何路徑)。如果您需要在事後探勘密集的日誌文件,那麼一個很好的工具是
less
. 只需執行less /var/log/nginx/error_log
,然後按空格向下b
翻頁,向上翻頁,/
開始搜尋,之後n
會找到下一個搜尋結果並N
找到上一個結果,並使用q
退出回到shell。我猜想有更好的工具專門針對特定類型的日誌,但
tail
通常less
可以讓我在對日誌進行故障排除時得到大約 90% 的工具。