服務器異常排查步驟
問題說明
朋友是兼職程序員,接手了一個科普網站的項目,在上線的時候遇到了80端口應用啓動一定時間(兩小時)後不能正常訪問的現象,啓動時一切正常。
由於客戶的服務器不能直接訪問,無法直接排查問題,所以寫了個簡單的步驟給朋友參考。寫完之後發現這個排查思路其實是挺普遍的排查思路,遇到應用和服務器問題時都可以參考這個步驟逐個環節去排查問題,當然,如果問題相對複雜,可能還是需要上手查看更多的內容才能確認,但是排查相對簡單的問題或者給萌新一個解決問題的思路,這個步驟還是有一點參考價值的,所以記錄一下。
前置
使用命令啓動服務,確保應用日誌可以正常打印
當異常發生時
使用命令tail -f log.file
(日誌開啓滾動顯示模式,,命令行不斷顯示最新產生的日誌
按住enter,直到當前屏幕清空(區分最新的日誌
在瀏覽器訪問網頁,查看此時是否有後臺日志(需要了解的問題1),觀察前端瀏覽器給出的反應(需要了解的問題2,404、500、無響應)
根據問題1
如果後臺沒有日誌,在另一個命令行頁面執行命令查看端口是否執行: ./run.sh status
(正在運行:dzdckp-latest.jar running,Pid is XXXXX
,已經停止:dzdckp-latest.jar not running
(需要了解的問題3)
根據問題2
如果瀏覽器顯示無響應,那麼推測網絡中斷或者後臺服務異常,如果顯示404、500或者其他狀態碼,證明當前應用正常,但是無法跳轉到正確的頁面,記錄問題2的情況
根據問題3
如果應用正在運行,觀察日誌是否有日誌輸出,如果有(情況1),根據輸出的內容判斷;如果沒有,判斷網絡中斷,導致請求不能被正常解析(情況2)
如果應用沒有運行,推測服務異常關閉,可能由於應用自身的問題或者服務器上的配置導致當前應用的異常(情況3)
情況1
應用正在運行而無法接受外部訪問,首先嚐試確認是否爲網絡異常。從當前服務器嘗試訪問當前應用端口:
- ping xx.xx.x.x (將瀏覽器的地址貼過來),如果有數據,證明當前服務器網絡可訪問
- telnet xx.xx.xx.xx 80 如果正常,證明當前端口正常開放
- curl xx.xx.xx.xx:80 如果輸出的是網頁信息,證明服務正常
從另一臺服務器重複上述操作,再次確認外部網絡-當前服務器的網絡情況
情況2
嘗試確認是否當前服務器和服務器端口到外部網絡的通信中斷
- curl www.baidu.com 成功證明當前服務器的網絡通信正常
如果情況1和情況2的驗證情況都正常,則證明當前服務器的網絡沒有發生異常
情況3
應用異常關閉,首先查看關閉前有無錯誤日誌
- 日誌文件可以下載下來發給我
如果以上都沒有發現問題,繼續嘗試方向爲:
- 修改啓動命令增加JVM參數和JVM日誌打印,捕捉系統崩潰時的JVM情況
- 增加定時任務腳本檢測任務的運行情況,每5秒左右執行一次,如果發現關閉則立刻重啓,或者每小時定時重啓任務(可以臨時解決問題,但是重啓可能會導致需要重新登陸的問題)
- 對服務器配置的詳細排查,應用情況、定時任務情況,網絡端口配置等