Server Monitoring with Munin and Monit on Debian 8 (Jessie)

In this article, I will describe how you can monitor your Debian 8 (Jessie) server with Munin and Monit. munin produces nifty little graphics about nearly every aspect of your server (load average, memory usage, CPU usage, MySQL throughput, eth0 traffic, etc.) without much configuration, whereas Monit checks the availability of services like Apache, MySQL, Postfix and takes the appropriate action such as a restart if it finds a service is not behaving as expected. The combination of the two gives you full monitoring: graphics that let you recognize current or upcoming problems (like "We need a bigger server soon, our load average is increasing rapidly."), and a watchdog that ensures the availability of the monitored services.

Although Munin lets you monitor more than one server, we will only discuss the monitoring of the system where it is installed here.

This tutorial was written for Debian 8 (Jessie), but the configuration should apply to other distributions like Ubuntu with little changes as well.

I want to say first that this is not the only way of setting up such a system. There are many ways of achieving this goal, but this is the way I take. I do not issue any guarantee that this will work for you!

 

1 Preliminary Note

Our system's hostname is server1.example.com, and we have a website www.example.com on it with the document root /var/www/www.example.com/web.

Ensure that the system is up to date before you start to install Munin, run:

apt-get update
apt-get upgrade

Apache is used to show the Munin pages, the apache fcgid module is required for the Munin graph zoom feature. Install apache and the fcgid module with apt.

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

Enable the fcgid module in apache.

a2enmod fcgid

2 Install and Configure Munin

To install Munin on Debian Jessie, we do this:

apt-get install munin munin-node munin-plugins-extra 

When the server is running MySQL or MariaDB, then enable the a few extra Munin plugins to monitor MySQL:

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

Next, we must edit the Munin configuration file /etc/munin/munin.conf. Uncomment the dbdir, htmldir, logdir, rundir, and tmpldir lines (the default values are fine). We want Munin to use the name server1.example.com instead of localhost.localdomain in the HTML output, therefore we replace localhost.localdomain with server1.example.com in the simple host tree section. Without the comments, the changed file looks like this:

nano /etc/munin/munin.conf

# Example configuration file for Munin, generated by 'make build'

# The next three variables specifies where the location of the RRD
# databases, the HTML output, logs and the lock/pid files. They all
# must be writable by the user running munin-cron. They are all
# defaulted to the values you see here.
#
dbdir /var/lib/munin
htmldir /var/cache/munin/www
logdir /var/log/munin
rundir /var/run/munin

# Where to look for the HTML templates
#
tmpldir /etc/munin/templates

# Where to look for the static www files
#
#staticdir /etc/munin/static

# temporary cgi files are here. note that it has to be writable by
# the cgi user (usually nobody or httpd).
#
# cgitmpdir /var/lib/munin/cgi-tmp # (Exactly one) directory to include all files from. includedir /etc/munin/munin-conf.d [...] # a simple host tree
[server1.example.com]
address 127.0.0.1
use_node_name yes [...]

We should find the Apache 2.4 configuration file for Munin /etc/munin/apache24.conf - it defines an alias called munin to munin's HTML output directory /var/cache/munin/www which means we can access munin from all websites on this server by using the relative path /munin (e.g. http://www.example.com/munin).

The apache Munin configuration is not enabled by default, this has been changed from DebianWheezy to Jessie. The new config directory is /etc/apache2/conf-enabled instead of /etc/apache2/conf.d which was used in older versions like Wheezy and Squeeze.

Run these commands to enable and load the configuration into apache.

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

Make sure you comment out the line Require local and add Require all granted and Options FollowSymLinks SymLinksIfOwnerMatch instead (otherwise you will only be able to access the Munin output from localhost):

nano /etc/munin/apache24.conf

Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www>
# Require local
Require all granted
Options FollowSymLinks SymLinksIfOwnerMatch
Options None
</Directory>

ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
<Location /munin-cgi/munin-cgi-graph>
# Require local
Require all granted
Options FollowSymLinks SymLinksIfOwnerMatch
<IfModule mod_fcgid.c>
SetHandler fcgid-script
</IfModule>
<IfModule !mod_fcgid.c>
SetHandler cgi-script
</IfModule>
</Location>

Restart Apache:

service apache2 restart

Then restart Munin:

service munin-node restart

Now wait a few minutes so that Munin can produce its first output, and then go to http://www.example.com/munin/ in your browser, and you see the first statistics:

Munin graphs

(This is just a small excerpt of the many graphics that munin produces...)

 

Now it is a good idea to password-protect the munin output directory unless you want everybody to be able to see every little statistic about your server.

To do this, we must create the password file /etc/munin/munin-htpasswd. We want to login with the username admin, so we do this:

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

Enter a password for admin. Then open /etc/munin/apache24.conf again...

nano /etc/munin/apache24.conf

... comment out "Require all granted and add the lines that I marked in red:

Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www>
# Require local
# Require all granted
AuthUserFile /etc/munin/munin-htpasswd
AuthName "Munin"
AuthType Basic
Require valid-user
Options None
</Directory>

ScriptAlias /munin-cgi/munin-cgi-graph /usr/lib/munin/cgi/munin-cgi-graph
<Location /munin-cgi/munin-cgi-graph>
# Require local
# Require all granted
AuthUserFile /etc/munin/munin-htpasswd
AuthName "Munin"
AuthType Basic
Require valid-user
<IfModule mod_fcgid.c>
SetHandler fcgid-script
</IfModule>
<IfModule !mod_fcgid.c>
SetHandler cgi-script
</IfModule>
</Location>

Then restart Apache:

service apache2 restart

4 Enable additional modules in Munin

The Munin command "munin-node-configure --suggest" can be used to get recommendations for additional Munin modules that can be enabled on the server. Run:

munin-node-configure --suggest

The output should be similar to this:

Munin node configure status.

The column "used" shows if a module is enabled, the column "Suggestions" shows if the server runs a service that can be monitored by this module. Create a symlink for the module in /etc/munin/plugins to enable it.

Here I will enable the apache_* modules for example:

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

Restart Munin to load the new configuration.

service munin-node restart

Share this page:

7 Comment(s)

Add comment

Comments

From: ganewbie

Could you apply the above mentioned procedure on a server that is running already ISPconfig3?

From: ganewbie

I will answer my own question, I had a setup in the sand bax, I have tried the above procedure and it works excellent.

You even have short cuts in ISPconfig3 already and after updating the links, the work pefect.

Thanks Till,

From: Spam

The default munin server config doesn't scale due to graph generation happening every 10 min rather than on-demand.  I've tried to switch over to on-demand graphs for the 25 systems here, but failed.  A little guidance would be helpful, please.

From: Jérôme

Great post.

I first followed your instructions from this post:

https://www.howtoforge.com/tutorial/perfect-server-debian-8-jessie-apache-bind-dovecot-ispconfig-3/

 

Now, I would like to add Munin and Monit in my ISPConfig but I don't want to access it from www.domaine.tld/...

As I have more than 30 websites of the server, this is not suitable.

 

What have to be changed in these 2 pages to configure munin and monit on my ISPConfig?

 

Regards

From: clalove

thank you for sharing , I upgrade from wheezy to jessie , I made all the changes withapache24.conf to link to  /etc/apache2/conf-enabled/munin.confand I kept the main directory: /var/www/html/munin

everthing is working but not the graph in show me the page with all the info but with the broken image (screenshot below)

From: zaphod beeblebrox

I tried this on Ubuntu 15.04 after following the ispconfig 3 how to for apache. I got as far as

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

in step 2, but unfortunately apache2 would not restart so I reinstalled ispconfig 3 from afresh again. :( Any chance of Ubuntu specific instructions for us dummies?

From: Jippe

Great tutorial..

one thing you might add. monitoring MySQL was not working as it was complaining on: [Missing dependency Cache::Cache]

solved by it by installing:

apt install libcache-cache-perl