Dec9th's Opslog

Monit 설치/설정

Tested all on Amazon linux2

Overview

Process 관리를 위해 Watchdog 개념으로 Process를 자동으로 살려주는 기능을 가진 Monit에 대한 설치 및 설정 가이드입니다. 예를 들면 cpp binary 로 Daemon Service간 process crash 발생 시 빠르게 기동만 되면 서비스 재개가 가능한 경우 Monit이 굉장히 유용합니다. 그 외 주요 기능으로는 CPU, Memory 등 각종 Resource와, 원격 Ping, Port에 대한 알림도 가능합니다. Trigger로 사용하는 것이 아닌 성능 혹은 장애 알람용도로 사용하기엔 Tick Stack, Sensu, nagios 등 좋은 솔루션이 많기에 프로세스 용도로만 사용하는 것이 제일 Best 해 보입니다.

사전 조건

null

Installation

설치

https://mmonit.com/monit/#download 방문 후 시스템에 맞는 바이너리를 다운로드하고 압축해제 합니다.

wget https://mmonit.com/monit/dist/binary/5.25.1/monit-5.25.1-linux-x64.tar.gz
tar zxvf monit-5.25.1-linux-x64.tar.gz

이후 본 파일을 사용하기 편하도록 각자 위치로 보냅니다. 실제 $monit_base/bin/monit -c $monit_base/conf/monitrc 와 같이 실행 시 잘됩니다. 그러나 늘 $monit_base를 입력해야 하는 부담이 있기에 monit official 에서 제공하는 systemd 스크립트와 같이 /usr/local/bin/ 에 위치시키고, conf의 경우 기본적으로 읽어들이는 /etc 하단에 위치 시킵니다. 그리고 관리를 좀 더 편하게 하기 위해 monitrc 파일을 전혀 건드리지 않고 /etc/monit.d/ 내 구성 파일을 모듈 별로 적용하기 위해 include 전용 디렉토리를 생성해보겠습니다.

cp -fp monit-5.25.1/bin/monit /usr/local/bin/
cp -fp monit-5.25.1/conf/monitrc /etc/
cp -fp monit-5.25.1/man/man1/monit.1 /usr/share/man/man1/
mkdir  /etc/monit.d/

systemd

사실 이 것으로 monit을 사용해 볼 수 있습니다. 그러나 조금 더 운영환경에 맞게 systemd에 등록해서 사용해보겠습니다.

Add “/lib/systemd/system/monit.service”

# This file is systemd template for monit service. To
 # register monit with systemd, place the monit.service file
 # to the /lib/systemd/system/ directory and then start it
 # using systemctl (see bellow).
 #
 # Enable monit to start on boot: 
 #         systemctl enable monit.service
 #
 # Start monit immediately: 
 #         systemctl start monit.service
 #
 # Stop monit:
 #         systemctl stop monit.service
 #
 # Status:
 #         systemctl status monit.service

 [Unit]
 Description=Pro-active monitoring utility for unix systems
 After=network.target
 Documentation=man:monit(1) https://mmonit.com/wiki/Monit/HowTo 

 [Service]
 Type=simple
 KillMode=process
 ExecStart=/usr/local/bin/monit -I
 ExecStop=/usr/local/bin/monit quit
 ExecReload=/usr/local/bin/monit reload
 Restart = on-abnormal
 StandardOutput=null

 [Install]
 WantedBy=multi-user.target

아래와 같이 기호에 맞게 enable 적용하시면 됩니다.

systemctl enable monit.service
systemctl start monit.service

Slack 전송 스크립트

Slack 메시지 발송을 위한 스크립트로 필요 없으면 스킵 하셔도 됩니다. 어디든 위치해도 상관없으며 alert 용도로 실행하고자 생성합니다.

#!/usr/bin/ruby

require 'net/https'
require 'json'

uri = URI.parse("https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZZZZZZZZZZZZZZZ")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri, {'Content-Type' => 'application/json'})
request.body = {
    "channel"  => "#general",
    "username" => "mmonit",
    "text"     => "[#{ENV['MONIT_HOST']}] #{ENV['MONIT_SERVICE']} - #{ENV['MONIT_DESCRIPTION']}"
}.to_json
response = http.request(request)
puts response.body

위 스크립트 중 XXX/YYY/ZZZ 부분은 본인 incoming-webhook 정보 삽입하셔야 합니다.

본 스크립트는 Ruby가 설치되어야 동작하며 아래와 같이 실행권한 적용하고 잘 실행되는지 확인합시다.

yum -y install ruby
chmod 755 /app/slack.rb
/app/slack.rb

ok 출력 및 slack에 메세지가 출력되면 정상처리 된 것 입니다.

configure

실제 config를 작성하기 전에 아래와 같이 /etc/monit.d/ 내 설정들을 포함할 수 있도록 include 측에 주석을 풀던지 혹은 아래와 같이 추가합니다.

echo  "include /etc/monit.d/*" | tee -a /etc/monitrc

그리고 이제 설정을 한번 해보겠습니다. pid 파일을 별도 생성하지 않는 Network Service를 한다고 가정하고 port monitoring을 통해 Process를 재시작하는 설정입니다.

Add “/etc/monit.d/myapp.conf”

check host myapp with address 127.0.0.1 
  start program = "/bin/systemctl start memcached"
  stop program  = "/bin/systemctl stop memcached"
  if failed port 11211 then exec /app/slack.rb    #1
  if failed port 11211 for 2 cycles then restart  #2

Reference