Monit은 서비스가 돌고 있는지 지켜보다가 쓰러지면 되살립니다. 첫 번째 정당한 질문. systemd가 Restart=always 한 줄로 같은 일을 할 수 있는데 왜?
그 답이 설정 전체를 규정합니다. systemd는 프로세스가 끝난 것을 보고 다시 시작합니다. 서비스가 요청에 답하는지는 모릅니다. 프로세스 한도에 부딪힌 PHP-FPM은 systemd가 보기에 멀쩡히 살아 있고, 그동안 사이트는 502를 돌려줍니다. 디스크가 떨어진 MySQL은 프로세스로서 계속 돌면서 쿼리를 하나도 실행하지 않습니다. Monit이 확인하는 것은 프로세스의 존재가 아니라 그 행동입니다. 포트가 답하는가, HTTP 요청이 무엇을 돌려주는가, 메모리를 얼마나 쓰는가.
여기서 규칙이 나옵니다. systemd는 그대로 두고 기능적 확인을 위해 Monit을 더하세요. 죽은 프로세스의 재시작을 중복할 이유는 없습니다.
설정
sudo apt install monit
주요 파일은 /etc/monit/monitrc이고, 당신의 확인은 별도 파일로 /etc/monit/conf.d/에 들어갑니다. 흔한 첫머리:
set daemon 60
set logfile /var/log/monit.log
set mailserver localhost
set alert admin@example.com
1분에 한 번의 확인이 합리적인 균형입니다. 더 잦으면 부하가 늘고 1초의 지연으로 잘못 재시작할 위험이 커집니다.
웹 인터페이스: 지역에서만
Monit에는 내장 웹 페이지가 있고, 대개 처음 찾은 안내서가 보여 주는 대로 — 모든 주소에서 — 켜집니다. 그 결과는 인터넷에서 닿는 서버 서비스 제어판입니다. 올바른 변형:
set httpd port 2812 and
use address localhost
allow localhost
allow admin:'a-long-password'
밖에서의 접근은 SSH 터널을 통합니다.
ssh -L 2812:localhost:2812 user@203.0.113.25
그다음부터 페이지는 당신의 컴퓨터에서 localhost:2812로 열리고, 밖을 향하는 것은 아무것도 없습니다.
의미 있는 확인
웹 서버 — 프로세스의 존재가 아니라 그 응답으로:
check process nginx with pidfile /run/nginx.pid
start program = "/bin/systemctl start nginx"
stop program = "/bin/systemctl stop nginx"
if failed host 127.0.0.1 port 80 protocol http
request "/" status = 200
for 3 cycles then restart
if 3 restarts within 10 cycles then unmonitor
여기서 세 줄이 나머지보다 중요합니다.
protocol http ... status = 200은 이 모든 것을 설정한 이유가 되는 확인입니다. 서버는 포트를 열어 두는 데 그치지 않고 페이지를 돌려줘야 합니다.
for 3 cycles는 한 번의 실패에 반응하지 말라는 뜻입니다. 그것이 없으면 Monit은 부하 중의 느린 응답 하나로 서비스를 재시작하고, 그것은 사태를 더 나쁘게만 만듭니다.
if 3 restarts within 10 cycles then unmonitor는 필수적인 줄입니다. 설정 오류 때문에 서비스가 뜨지 않으면 Monit은 그것을 영원히 재시작하며 부하를 더하고 로그를 채웁니다. 이 줄의 뜻은 이렇습니다. 세 번 실패했으면 멈추고 메시지를 남겨라. 그다음 필요한 것은 사람이고, 자동화는 이미 도울 수 없습니다.
디스크 공간은 자동화 없이 그저 경보로 확인합니다.
check filesystem rootfs with path /
if space usage > 85% then alert
if inode usage > 85% then alert
inode 줄은 따로 필요합니다. 그것들은 공간과 무관하게 떨어지며, 이 줄이 없으면 그 상황은 눈에 띄지 않습니다.
설정 확인
sudo monit -t
sudo systemctl reload monit
sudo monit summary
sudo monit status
monit -t는 적용 전에 문법을 확인합니다. monit summary는 상태의 짧은 표를 주며 — 어떤 문제를 살피든 거기서 시작합니다.
그리고 메일이 나가는지 확인하세요. Monit은 이벤트를 메일로 알리는데, 발송이 설정돼 있지 않으면 알림이 없습니다. 서비스는 재시작되고 당신은 그것을 모릅니다 — 그런데 반복되는 재시작이야말로 주된 신호입니다. 그것들은 로그에서도 볼 수 있습니다: /var/log/monit.log.
Monit이 하지 않는 일
원인을 없애지 않습니다. 재시작은 미루기이고, 서비스가 끊임없이 재시작된다면 어딘가 메모리가 모자라거나 공간이 떨어지고 있거나 애플리케이션이 새는 것입니다. 이 도구의 가치는 재시작이 아니라 카운터에 있습니다. 하루에 세 번의 nginx 재시작은 그러지 않았으면 눈에 띄지 않았을 진단입니다. 사이트는 내내 돌고 있었으니까요.
그러니 볼 것은 현재 상태가 — 그것은 거의 늘 초록입니다 — 아니라 이력입니다. 지난주에 무언가가 스스로 몇 번이나 되살아났는가. 그것이 한 페이지에서 어떤 모습인지는 아래 데모에서.