사례 2. Nginx 서버 상태 코드 에 502 가 있 는 지 모니터링

Nginx + php - fpm + MySQL 의 사 이 트 는 많은 원인 으로 인해 502 문제 가 발생 하 는데 가장 흔히 볼 수 있 는 것 은 php - fpm 자원 소모 로 인 한 것 이다.본 사례 가 감시 하고 자 하 는 이 서버 는 바로 이 상황 이다. 평소에 좋 았 지만 사이트 방문 이 많 으 면 502 의 상태 코드 가 나 올 것 이다.502 문제 가 발생 했 을 때 phop - fpm 자원 이 소 진 된 원인 을 제때에 분석 해 야 하기 때문에 모니터링 스 크 립 트 를 만들어 야 합 니 다. 502 상태 코드 가 있 으 면 바로 경고 하여 알려 주 십시오.
요 구 는 다음 과 같 습 니 다.
1) 1 분 에 한 번 스 크 립 트 실행
2) 502 상 태 를 모니터링 하면 사이트 의 방문 로 그 를 분석 할 수 있 고 curl 도구 로 http 요청 을 하여 상태 코드 를 얻 을 수 있 습 니 다. 방문 로 그 를 분석 하 는 것 을 권장 합 니 다. 방문 로그 경로 가/data/logs/access. log 라면 로그 세 션 은 다음 과 같 습 니 다.
54.36.149.38 - [16/Sep/2018:18:21:10 +0800] www.lishiming.net "thread-5360-1-1.html" 301 "GET /thread-5360-1-1.html HTTP/1.1"-" "Mozilla/5.0(compatible;AhrefsBot/5.2; +http://ahrefs.com/robot/)"

3) 1 분 에 502 번, 50 번 넘 으 면 경고
4) 경고 메 일 알림, 메 일 은[email protected]
지식 포인트 1: 퀘 스 트 계획 cron
이 사례 는 1 분 에 한 번 스 크 립 트 를 실행 해 야 하기 때문에 cron 을 사용 해 야 합 니 다.명령 실행:
crontab -e
* * * * * /bin/bash /usr/local/sbin/mon_502.sh

예시 1:
매주 1, 3, 5 새벽 4 시 20 분 에 스 크 립 트 를 실행 합 니 다.
/usr/local/sbin/123.sh
20 4 * * 1,3,5 /bin/bash /usr/local/sbin/123.sh

예시 2:
3 일 간격 으로 파일 비우 기
/data/log/tmp.log
* * */3 * * true>/data/log/tmp.log

예시 3:
매일 9 시 부터 12 시 까지 14 시 부터 16 시 까지 스 크 립 트 를 실행 합 니 다.
/usr/local/sbin/xxx.sh 
0 9-12,14-16 * * * /bin/bash /usr/local/sbin/xxx.sh

지식 포인트 2: 필터 키워드
셸 스 크 립 트 에서 어떤 키 워드 를 걸 러 내 려 면 grep 명령 을 사용 합 니 다. 예 를 들 어 로그 에 502 가 포 함 된 로 그 를 걸 러 내야 합 니 다. 명령 은:
grep '502' /data/log/access.log

1) 영문 으로 시작 하 는 줄 을 걸 러 냅 니 다.
grep '^[a-zA-Z]' 1.txt

2) 모든 빈 줄 제거:
grep -v '^$' 1.txt

3) 최소 두 개의 연속 숫자 가 있 는 줄 을 걸 러 냅 니 다.
grep -E '[0-9][0-9]+' 1.txt 
   
grep -E '[0-9]{2,$}' 1.txt

4) aming 이나 Liux 가 함 유 된 몇 줄 을 걸 러 냅 니 다.
grep -Ec 'aming|linux' 1.txt

다시 본 사례 의 수 요 를 보면 1 분 에 한 번 검 측 하기 때문에 필터 의 키 워드 는 지난 1 분 의 시간 입 니 다. 로 그 를 분석 하면 지난 1 분 에 사용 할 수 있 는 것 을 발견 할 수 있 습 니 다.
date -d "-1 min" +%d/%m/%Y:%H:%M:[0-5][0-9]

이 키 워드 는 표시 한다.[0 - 5] [0 - 9] 는 59 초 에 대한 매 칭 이다.
지식 포인트 3: 셸 의 변수
비교 대상 이 숫자 가 아니 라 문자열 일 때 이렇게 사용 할 수 있 습 니 다.
if [$str == "aminglinux"]

변수 str 의 값 이 aminglinux 일 때.
지식 포인트 4: 명령 행 아래 메 일 보 내기
Python 에서 메 일 을 보 내 는 스 크 립 트 로 제3자 메 일 을 호출 합 니 다. 163 메 일 을 사용 합 니 다.휴대 전 화 는 클 라 이언 트 를 설치 할 수 있 기 때문에 알림 문 제 는 걱정 하지 않 아 도 된다.메 일 을 받 는 사람 은 자신 일 수도 있 고, 자신 에 게 메 일 을 보 내 는 것 도 스 팸 메 일의 고민 이 없 을 것 이다.
메 일 을 보 낸 Python 스 크 립 트:
mail.py
#!/bin/bash
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
import sys
mail_host = 'smtp.163.com'
mail_user = '[email protected]'
mail_pass = 'your_mail_password'
mail_postfix = '163.com'
def send_mail(to_list,subject,content):
     me = "zabbix    "+""
     msg = MIMEText(content, 'plain', 'utf-8')
     msg['subject'] = subject
     msg[from] = me
     msg['to'] = to_list
     try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me,to_list,msg.as_string())
        s.close()
        return True
     expect Exception,e:
        print str(e)
        return False
if _name_ == "_main_":
     send_mail(sys.argv[1],sys.argv[2],sys.argv[3])

설명:
이 스 크 립 트 는 제3자 메 일 계 정 에 사 용 됩 니 다. 정확 한 mail 을 작성 해 야 합 니 다.host,mail_user 와 mailpass.스 크 립 트 이름 은 mail. py 이 고 메 일 을 보 내 는 명령 은:
python mail.py [email protected] "    " "    "

이 사례 는 스 크 립 트 를 참고 합 니 다.
vim/usr/local/sbin/mon_502.sh
#!/bin/bash
##          502  
##  :
##  :
##  :v0.1

#[0-5][0-9]  59      ,                。
t=`date -d "-1 min" +%d/%m/%Y:%H:%M:[0-5][0-9]`
log="/data/logs/access.log"
#  mail.py   ,   /usr/local/sbin/ 
mail_script="/usr/local/sbin/mail.py"
[email protected]

n=`grep $t $log|grep -c "502"`
if [ $n -gt 50 ]
then
    python $mail_script $mail_user "   502" "       $n "
fi

퀘 스 트 증가 계획:
* * * * * /bin/bash /usr/local/sbin/mon_502.sh 2>/tmp/mon_502.err

설명:
이 cron 맨 뒤에 오류 로그 출력 을 정의 해 야 합 니 다. 스 크 립 트 실행 중 오류 가 발생 하면/tmp/mon 에 도착 할 수 있 습 니 다.502. err 파일 에서 오류 정 보 를 봅 니 다.

좋은 웹페이지 즐겨찾기