Einfach Anwendung mit Mariadb, Apache und PHP

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Einleitung

Minimales Monitoring-Tool für Debian 13 (Trixie). Prüft IP-Adressen via ICMP (Ping) und speichert die Hosts in einer MariaDB-Datenbank.

System-Setup

Apache & PHP
Installation der Web-Umgebung und des Datenbank-Treibers.
  • sudo apt update && sudo apt install apache2 php php-mysqli libapache2-mod-php -y
Datenbank (MariaDB)
Installation und Absicherung des Datenbank-Servers.
  • sudo apt install mariadb-server -y
  • sudo mysql_secure_installation
PHP-Berechtigungen
Die Funktion exec() darf nicht in der disable_functions der /etc/php/8.3/apache2/php.ini stehen.
  • sudo systemctl restart apache2

Datenbank-Schema

Lege die Struktur in der MariaDB-Konsole an:

CREATE DATABASE monitoring;
USE monitoring;

CREATE TABLE hosts (
  id INT AUTO_INCREMENT PRIMARY KEY,
  hostname VARCHAR(255),
  ip_address VARCHAR(45),
  last_check TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Programmierung (index.php)

Erstelle die Datei unter /var/www/html/index.php.

Hinweis für Debian 13: Der www-data User benötigt oft explizite Rechte für Raw Sockets, um zu pingen:

  • sudo setcap cap_net_raw+p /usr/bin/ping
<?php
$db = new mysqli("localhost", "root", "DEIN_PASSWORT", "monitoring");

echo '<meta http-equiv="refresh" content="30">';
echo "<h1>System Monitor</h1>";

function pingHost($ip) {
    // Absoluter Pfad ist unter Debian 13 sicherer
    exec("/usr/bin/ping -c 1 -W 1 " . escapeshellarg($ip), $output, $result);
    return ($result === 0);
}

$res = $db->query("SELECT * FROM hosts");

echo "<table border='1'><tr><th>Host</th><th>IP</th><th>Status</th></tr>";
while($row = $res->fetch_assoc()) {
    $is_online = pingHost($row['ip_address']);
    $status = $is_online ? "<b style='color:green'>ONLINE</b>" : "<b style='color:red'>OFFLINE</b>";
    
    echo "<tr><td>{$row['hostname']}</td><td>{$row['ip_address']}</td><td>$status</td></tr>";
}
echo "</table>";
?>

Sicherheit & Performance

  • Validierung: IPs immer mit filter_var($ip, FILTER_VALIDATE_IP) prüfen.
  • Skalierung: Bei mehr als 10 Hosts sollte der Ping per Cronjob in die Datenbank schreiben, statt beim Laden der Seite zu pingen.