서버 모니터링 · 10 min read · Dec 15, 2025

Debian 10에서 Munin 및 Monit으로 서버 모니터링

이 기사에서는 Debian 10 (Buster) 서버를 Munin 및 Monit으로 모니터링하는 방법을 설명합니다. Munin은 서버의 거의 모든 측면(부하 평균, 메모리 사용량, CPU 사용량, MySQL 처리량, 네트워크 트래픽 등)에 대한 멋진 그래프를 생성하며, 많은 구성 없이 사용할 수 있습니다. Monit은 Apache, MySQL, Postfix와 같은 서비스의 가용성을 확인하고 서비스가 예상대로 작동하지 않을 경우 재시작과 같은 적절한 조치를 취합니다. 두 가지를 결합하면 현재 또는 임박한 문제를 볼 수 있는 그래프(예: “곧 더 큰 서버가 필요합니다. 우리의 부하 평균이 급격히 증가하고 있습니다.”)와 모니터링된 서비스의 가용성을 보장하는 감시 프로그램을 제공합니다.

Munin으로 여러 서버를 모니터링할 수 있지만, 여기서는 설치된 시스템의 모니터링만 논의합니다.

이 가이드는 Debian 10 (Buster)을 위해 작성되었지만, 구성은 Ubuntu와 같은 다른 배포판에도 약간의 변경으로 적용될 수 있습니다.

1 사전 참고

이 튜토리얼의 모든 명령은 루트 사용자로 실행됩니다. SSH로 서버에 루트로 로그인하거나 터미널 창을 엽니다. 루트가 아닌 다른 사용자로 로그인하는 경우, 진행하기 전에 다음 명령을 사용하여 루트 사용자로 전환합니다.

su -

우리 시스템의 호스트 이름은 server1.example.com이며, 문서 루트가 /var/www/www.example.com/web인 웹사이트 www.example.com이 있습니다.

Munin을 설치하기 전에 시스템이 최신 상태인지 확인하려면 다음을 실행합니다:

apt update  
apt upgrade

Apache는 Munin 페이지를 표시하는 데 사용되며, Munin 그래프 확대 기능을 위해 apache fcgid 모듈이 필요합니다. apt를 사용하여 apache와 fcgid 모듈을 설치합니다.

apt install apache2 libcgi-fast-perl libapache2-mod-fcgid

apache에서 fcgid 모듈을 활성화합니다.

a2enmod fcgid

2 Munin 설치 및 구성

Debian에 Munin을 설치하려면 다음을 수행합니다:

apt install munin munin-node munin-plugins-extra

서버가 MySQL 또는 MariaDB를 실행 중인 경우, MySQL을 모니터링하기 위해 몇 가지 추가 Munin 플러그인을 활성화합니다:

cd /etc/munin/plugins  
ln -s /usr/share/munin/plugins/mysql_ mysql_  
ln -s /usr/share/munin/plugins/mysql_bytes mysql_bytes  
ln -s /usr/share/munin/plugins/mysql_innodb mysql_innodb  
ln -s /usr/share/munin/plugins/mysql_isam_space_ mysql_isam_space_  
ln -s /usr/share/munin/plugins/mysql_queries mysql_queries  
ln -s /usr/share/munin/plugins/mysql_slowqueries mysql_slowqueries  
ln -s /usr/share/munin/plugins/mysql_threads mysql_threads

다음으로, Munin 구성 파일 /etc/munin/munin.conf를 편집해야 합니다. dbdir, htmldir, logdir, rundir 및 tmpldir 줄의 주석을 제거합니다(기본값은 괜찮습니다). Munin이 HTML 출력에서 localhost.localdomain 대신 server1.example.com을 사용하도록 하려면, 간단한 호스트 트리 섹션에서 localhost.localdomain을 server1.example.com으로 교체합니다. 주석이 없는 변경된 파일은 다음과 같습니다:

nano /etc/munin/munin.conf
# Munin을 위한 예제 구성 파일, 'make build'에 의해 생성됨  
  
# 다음 세 변수는 RRD 데이터베이스, HTML 출력, 로그 및 잠금/pid 파일의 위치를 지정합니다. 모두  
# munin-cron을 실행하는 사용자가 쓸 수 있어야 합니다. 모두  
# 여기에서 볼 수 있는 값으로 기본 설정됩니다.  
#  
dbdir /var/lib/munin  
htmldir /var/cache/munin/www  
logdir /var/log/munin  
rundir /var/run/munin  
  
# HTML 템플릿을 찾을 위치  
#  
tmpldir /etc/munin/templates  
  
# 정적 www 파일을 찾을 위치  
#  
#staticdir /etc/munin/static  
  
# 임시 cgi 파일은 여기 있습니다. cgi 사용자(일반적으로 nobody 또는 httpd)가 쓸 수 있어야 합니다.  
#  
# cgitmpdir /var/lib/munin/cgi-tmp

# (정확히 하나) 모든 파일을 포함할 디렉토리.
includedir /etc/munin/munin-conf.d
[...]  
# 간단한 호스트 트리  
[server1.example.com]  
 address 127.0.0.1  
 use_node_name yes
[...]  

Munin을 위한 Apache 2.4 구성 파일 /etc/munin/apache24.conf를 찾아야 합니다. 이 파일은 Munin의 HTML 출력 디렉토리 /var/cache/munin/www에 대한 별칭인 munin을 정의합니다. 이는 이 서버의 모든 웹사이트에서 상대 경로 /munin을 사용하여 munin에 접근할 수 있음을 의미합니다(예: http://www.example.com/munin).

apache Munin 구성은 기본적으로 활성화되어 있지 않으며, 이는 DebianWheezy에서 Jessie로 변경되었습니다. 새 구성 디렉토리는 이전 버전인 Wheezy 및 Squeeze에서 사용된 /etc/apache2/conf.d 대신 /etc/apache2/conf-enabled입니다.

다음 명령을 실행하여 apache에 구성을 활성화하고 로드합니다.

cd /etc/apache2/conf-enabled/  
ln -s /etc/munin/apache24.conf munin.conf  
service apache2 restart

Require local 줄의 주석을 제거하고 Require all granted 및 Options FollowSymLinks SymLinksIfOwnerMatch를 대신 추가해야 합니다(그렇지 않으면 localhost에서만 Munin 출력을 볼 수 있습니다):

nano /etc/munin/apache24.conf
Alias /munin /var/cache/munin/www  
  
 # Require local  
 Require all granted  
 Options FollowSymLinks SymLinksIfOwnerMatch  
  
  
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph  
  
 # Require local  
 Require all granted  
 Options FollowSymLinks SymLinksIfOwnerMatch  
   
 SetHandler fcgid-script  
   
   
 SetHandler cgi-script  
   

Apache를 재시작합니다:

systemctl restart apache2.service

그런 다음 Munin을 재시작합니다:

systemctl restart munin-node.service

이제 Munin이 첫 번째 출력을 생성할 수 있도록 몇 분 동안 기다린 후, 브라우저에서 http://www.example.com/munin/으로 이동하면 첫 번째 통계를 볼 수 있습니다:

Munin 프로세스 모니터

(이는 munin이 생성하는 많은 그래픽 중 일부에 불과합니다…)

3 Munin 출력 디렉토리 비밀번호 보호 (선택 사항이지만 강력히 권장)

이제 모든 사람이 서버에 대한 모든 작은 통계를 볼 수 있도록 하려면 munin 출력 디렉토리를 비밀번호로 보호하는 것이 좋습니다.

이를 위해 비밀번호 파일 /etc/munin/munin-htpasswd를 생성해야 합니다. admin이라는 사용자 이름으로 로그인하고 싶으므로 다음을 수행합니다:

htpasswd -c /etc/munin/munin-htpasswd admin

admin의 비밀번호를 입력합니다. 그런 다음 /etc/munin/apache24.conf를 다시 엽니다…

nano /etc/munin/apache24.conf

… “Require all granted”의 주석을 제거하고 빨간색으로 표시된 줄을 추가합니다:

Alias /munin /var/cache/munin/www  
  
 # Require local  
 # Require all granted  
 AuthUserFile /etc/munin/munin-htpasswd  
 AuthName "Munin"  
 AuthType Basic  
 Require valid-user  
 Options None  
  
  
ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph  
  
 # Require local  
 # Require all granted  
 AuthUserFile /etc/munin/munin-htpasswd  
 AuthName "Munin"  
 AuthType Basic  
 Require valid-user  
   
 SetHandler fcgid-script  
   
   
 SetHandler cgi-script  
   

그런 다음 Apache를 재시작합니다:

systemctl restart apache2.service

4 Munin에서 추가 모듈 활성화

Munin 명령 “munin-node-configure –suggest”를 사용하여 서버에서 활성화할 수 있는 추가 Munin 모듈에 대한 권장 사항을 받을 수 있습니다. 실행합니다:

munin-node-configure --suggest

출력은 다음과 유사해야 합니다:

추가 Munin 모듈 제안

“used” 열은 모듈이 활성화되어 있는지 여부를 보여주고, “Suggestions” 열은 서버가 이 모듈로 모니터링할 수 있는 서비스를 실행 중인지 보여줍니다. 모듈을 활성화하려면 /etc/munin/plugins에 대한 심볼릭 링크를 생성합니다.

여기서는 apache_* 모듈을 활성화하겠습니다:

cd /etc/munin/plugins  
ln -s /usr/share/munin/plugins/apache_accesses  
ln -s /usr/share/munin/plugins/apache_processes  
ln -s /usr/share/munin/plugins/apache_volume

새 구성을 로드하기 위해 Munin을 재시작합니다.

systemctl restart munin-node.service

5 Monit 설치 및 구성

Monit은 Debian Buster 백포트 저장소에서 사용할 수 있습니다. 이 저장소는 기본적으로 활성화되어 있지 않으므로 먼저 추가해야 합니다. 다음 명령을 실행합니다:

echo 'deb http://ftp.de.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/buster-backports.list

그런 다음 패키지 목록을 업데이트합니다:

apt update

Monit을 설치하려면 다음을 수행합니다:

apt install monit

이제 /etc/monit/monitrc를 편집해야 합니다. 기본 /etc/monit/monitrc에는 많은 예제가 있으며, http://mmonit.com/monit/documentation/에서 더 많은 구성 예제를 찾을 수 있습니다. 그러나 제 경우에는 proftpd, sshd, mysql, apache 및 postfix를 모니터링하고 싶으며, Monit 웹 인터페이스를 포트 2812에서 활성화하고 싶고, https 웹 인터페이스를 원하며, admin 사용자 이름과 howtoforge 비밀번호로 웹 인터페이스에 로그인하고 싶고, Monit이 root@localhost로 이메일 알림을 보내도록 하고 싶습니다. 따라서 제 파일은 다음과 같습니다(다른 데몬에 대한 예제를 추가하여 파일을 필요에 맞게 조정할 수 있습니다):

cp /etc/monit/monitrc /etc/monit/monitrc_orig  
cat /dev/null > /etc/monit/monitrc  
nano /etc/monit/monitrc
set daemon 60  
set logfile syslog facility log_daemon  
set mailserver localhost  
set mail-format { from: [email protected] }  
set alert root@localhost  
set httpd port 2812 and  
 SSL ENABLE  
 PEMFILE /var/certs/monit.pem  
 allow admin:howtoforge  
  
check process sshd with pidfile /var/run/sshd.pid  
 start program "/usr/sbin/service ssh start"  
 stop program "/usr/sbin/service ssh stop"  
 if failed port 22 protocol ssh then restart  
 if 5 restarts within 5 cycles then timeout  
  
check process apache with pidfile /var/run/apache2/apache2.pid  
 group www  
 start program = "/usr/sbin/service apache2 start"  
 stop program = "/usr/sbin/service apache2 stop"  
 if failed host localhost port 80 protocol http  
 and request "/monit/token" then restart  
 if cpu is greater than 60% for 2 cycles then alert  
 if cpu > 80% for 5 cycles then restart  
 if totalmem > 500 MB for 5 cycles then restart  
 if children > 250 then restart  
 if loadavg(5min) greater than 10 for 8 cycles then stop  
 if 3 restarts within 5 cycles then timeout  
   
# ---------------------------------------------------------------------------------------------  
# NOTE: example.pid를 서버의 pid 이름으로 바꾸십시오. 이름은 호스트 이름에 따라 다릅니다.  
# ---------------------------------------------------------------------------------------------  
#check process mysql with pidfile /var/lib/mysql/example.pid  
# group database  
# start program = "/usr/sbin/service mysql start"  
# stop program = "/usr/sbin/service mysql stop"  
# if failed host 127.0.0.1 port 3306 then restart  
# if 5 restarts within 5 cycles then timeout  
  
#check process proftpd with pidfile /var/run/proftpd.pid  
# start program = "/usr/sbin/service proftpd start"  
# stop program = "/usr/sbin/service proftpd stop"  
# if failed port 21 protocol ftp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process postfix with pidfile /var/spool/postfix/pid/master.pid  
# group mail  
# start program = "/usr/sbin/service postfix start"  
# stop program = "/usr/sbin/service postfix stop"  
# if failed port 25 protocol smtp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process nginx with pidfile /var/run/nginx.pid  
# start program = "/usr/sbin/service nginx start"  
# stop program = "/usr/sbin/service nginx stop"  
# if failed host 127.0.0.1 port 80 then restart  
#  
#check process memcached with pidfile /var/run/memcached.pid  
# start program = "/usr/sbin/service memcached start"  
# stop program = "/usr/sbin/service memcached stop"  
# if failed host 127.0.0.1 port 11211 then restart  
#  
#check process pureftpd with pidfile /var/run/pure-ftpd/pure-ftpd.pid  
# start program = "/usr/sbin/service pure-ftpd-mysql start"  
# stop program = "/usr/sbin/service pure-ftpd-mysql stop"  
# if failed port 21 protocol ftp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process named with pidfile /var/run/named/named.pid  
# start program = "/usr/sbin/service bind9 start"  
# stop program = "/usr/sbin/service bind9 stop"  
# if failed host 127.0.0.1 port 53 type tcp protocol dns then restart  
# if failed host 127.0.0.1 port 53 type udp protocol dns then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process ntpd with pidfile /var/run/ntpd.pid  
# start program = "/usr/sbin/service ntp start"  
# stop program = "/usr/sbin/service ntp stop"  
# if failed host 127.0.0.1 port 123 type udp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process mailman with pidfile /var/run/mailman/mailman.pid  
# group mail  
# start program = "/usr/sbin/service mailman start"  
# stop program = "/usr/sbin/service mailman stop"  
#  
#check process amavisd with pidfile /var/run/amavis/amavisd.pid  
# group mail  
# start program = "/usr/sbin/service amavis start"  
# stop program = "/usr/sbin/service amavis stop"  
# if failed port 10024 protocol smtp then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-imap with pidfile /var/run/courier/imapd.pid  
# group mail  
# start program = "/usr/sbin/service courier-imap start"  
# stop program = "/usr/sbin/service courier-imap stop"  
# if failed host localhost port 143 type tcp protocol imap then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-imap-ssl with pidfile /var/run/courier/imapd-ssl.pid  
# group mail  
# start program = "/usr/sbin/service courier-imap-ssl start"  
# stop program = "/usr/sbin/service courier-imap-ssl stop"  
# if failed host localhost port 993 type tcpssl sslauto protocol imap then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-pop3 with pidfile /var/run/courier/pop3d.pid  
# group mail  
# start program = "/usr/sbin/service courier-pop start"  
# stop program = "/usr/sbin/service courier-pop stop"  
# if failed host localhost port 110 type tcp protocol pop then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process courier-pop3-ssl with pidfile /var/run/courier/pop3d-ssl.pid  
# group mail  
# start program = "/usr/sbin/service courier-pop-ssl start"  
# stop program = "/usr/sbin/service courier-pop-ssl stop"  
# if failed host localhost port 995 type tcpssl sslauto protocol pop then restart  
# if 5 restarts within 5 cycles then timeout  
#  
#check process dovecot with pidfile /var/run/dovecot/master.pid  
# group mail  
# start program = "/usr/sbin/service dovecot start"  
# stop program = "/usr/sbin/service dovecot stop"  
# if failed host localhost port 993 type tcpssl sslauto protocol imap then restart  
# if 5 restarts within 5 cycles then timeout

구성 파일은 상당히 자명합니다. 옵션에 대해 확실하지 않은 경우 Monit 문서를 참조하십시오: http://mmonit.com/monit/documentation/monit.html

Monit 구성의 apache 부분에서 다음을 찾을 수 있습니다:

   if failed host localhost port 80 protocol http
      and request "/monit/token" then restart

이는 Monit이 localhost의 포트 80에 연결을 시도하고 /monit/token 파일에 접근하려고 시도함을 의미합니다. 이는 우리의 웹사이트 문서 루트가 /var/www/html이기 때문에 /var/www/html/monit/token입니다. Monit이 성공하지 못하면 Apache가 실행되고 있지 않음을 의미하며, Monit은 이를 재시작할 것입니다. 이제 /var/www/html/monit/token 파일을 생성하고 그 안에 임의의 문자열을 작성해야 합니다:

mkdir /var/www/html/monit  
echo "hello" > /var/www/html/monit/token

다음으로 SSL 암호화된 Monit 웹 인터페이스에 필요한 pem 인증서(/var/certs/monit.pem)를 생성합니다:

mkdir /var/certs  
cd /var/certs

인증서를 생성하기 위해 OpenSSL 구성 파일이 필요합니다. 다음과 같이 보일 수 있습니다:

nano /var/certs/monit.cnf
# RSA 인증서 생성 - 서버

[ req ]
default_bits = 2048
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type

[ req_dn ]
countryName = 국가 이름 (2자리 코드)
countryName_default = MO

stateOrProvinceName             = 주 또는 지방 이름 (전체 이름)
stateOrProvinceName_default     = 모니터리아

localityName                    = 지역 이름 (예: 도시)
localityName_default            = 모니타운

organizationName                = 조직 이름 (예: 회사)
organizationName_default        = 모니트 주식회사

organizationalUnitName          = 조직 단위 이름 (예: 섹션)
organizationalUnitName_default  = 모니터링 기술 부서

commonName                      = 공통 이름 (서버의 FQDN)
commonName_default              = server.monit.mo

emailAddress                    = 이메일 주소
emailAddress_default            = [email protected]

[ cert_type ]
nsCertType = server

이제 다음과 같이 인증서를 생성합니다:

openssl req -new -x509 -days 365 -nodes -config ./monit.cnf -out /var/certs/monit.pem -keyout /var/certs/monit.pem
openssl dhparam 2048 >> /var/certs/monit.pem
openssl x509 -subject -dates -fingerprint -noout -in /var/certs/monit.pem
chmod 600 /var/certs/monit.pem

마지막으로 Monit을 시작할 수 있습니다:

service monit restart

이제 브라우저를 https://www.example.com:2812/로 이동시키고(포트 2812가 방화벽에 의해 차단되지 않았는지 확인), admin과 howtoforge로 로그인하면 Monit 웹 인터페이스를 볼 수 있습니다. 다음과 같아야 합니다:

Debian의 Monit 서비스 관리자

(메인 화면)

SSH 프로세스 상태

Apache 프로세스 상태

(SSHd 상태 페이지)

/etc/monit/monitrc의 구성에 따라 monit는 서비스가 실패하면 서비스를 재시작하고 서비스의 프로세스 ID가 변경되면 알림 이메일을 보냅니다.

쉘에서 Monit 상태를 확인하려면 “monit status” 명령을 실행합니다:

monit status

이 명령은 모니터링되는 모든 서비스의 상태를 보여줍니다.

명령줄에서의 Monit 상태

6 링크

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.