shell 練習(08)——Nginx 502 錯誤檢查處理
1. 題目
伺服器上跑的是 LNMP 環境,近期總是有502現象。502為網站訪問的狀態碼,200正常,502錯誤是Nginx最普遍常見的錯誤狀態碼。由於502錯誤碼只是暫時的,並且只要重啟 php-fpm 服務則502消失,但不重啟的話,則會一直持續很長一段時間。所以,有必要寫一個監控指令碼,監控訪問日誌的狀態碼,一旦發生502,則自動重啟一下 php-fpm 服務。
設定:
1) Nginx 的 access_log 在 /data/logs/nginx/access.log
2) 指令碼死迴圈,每10秒檢測一次(假設每10秒中的日誌條數為300左右)
3) 重啟 php-fpm 的方法是 /etc/init.d/php-fpm restart
2. 題目分析
1) 判斷是否出現502的狀態碼,有兩種辦法。第一種是通過 curl 訪問網站,但是這種方法只能獲取某一時刻的狀態碼,不能代表一個時段的狀態碼,所以並不合適。第二種方法是通過分析統計 Nginx 的日誌。
2) 因為指令碼要10s 檢測一次,所以需要將10s 內產生的日誌過濾出來,然後再統計502狀態碼出現的次數。題目中假設10s 內大概有300條日誌,如果有10%的問題,就已經很嚴重了,所以我們暫定設定報警值為 10.
3. 指令碼
#!/bin/bash log=/data/logs/nginx/access.log N=10 while true: do tail -n 300 $log > /tmp/log N_502=`grep -c '502" ' /tmp/log` if [ $N_502 -ge $N ];then /etc/init.d/php-fpm restart sleep 60 fi sleep 10 done
4. 解釋
1) 指令碼開始,首先設定一個報警閥值 N=10。
2) while 死迴圈,每隔10s 檢測一次。
3) 每次過濾300條日誌,用覆蓋的方式寫入 /tmp/log 檔案,保證每次都是新的日誌。
4) 用 grep 統計502出現的次數,在指令碼中要注意過濾的字串是 '502" ',不僅有雙引號,後面還有一個空格,這樣是為了匹配得更精準。
5) 當統計的 502 錯誤碼出現次數超過 N 時,則需要重啟 php-fpm。重啟之後,指令碼休眠60s,以免指令碼有嚴重的 bug,每10s 重啟一次,必然會影響服務的穩定性。