1. 程式人生 > >shell 練習(08)——Nginx 502 錯誤檢查處理

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 重啟一次,必然會影響服務的穩定性。