Einfach Anwendung mit Mariadb, Apache und PHP: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „__TOC__ == Einleitung == Dieses Tutorial beschreibt die Einrichtung eines minimalen Monitoring-Tools auf Basis von '''PHP''', '''MySQL''' und '''Apache2'''. D…“)
 
 
Zeile 2: Zeile 2:
  
 
== Einleitung ==
 
== Einleitung ==
Dieses Tutorial beschreibt die Einrichtung eines minimalen Monitoring-Tools auf Basis von '''PHP''', '''MySQL''' und '''Apache2'''. Das Ziel ist es, eine Liste von IP-Adressen in einer Datenbank zu verwalten und deren Erreichbarkeit (Ping) automatisch im Browser anzuzeigen.
+
Minimales Monitoring-Tool für Debian 13 (Trixie). Prüft IP-Adressen via ICMP (Ping) und speichert die Hosts in einer MariaDB-Datenbank.
  
== Voraussetzungen ==
+
== System-Setup ==
* Ein installierter Apache2 Webserver.
 
* PHP (inkl. installierter `mysqli` Erweiterung).
 
* MySQL/MariaDB Datenbank.
 
* Berechtigung zur Ausführung von `exec()` in der `php.ini` (wichtig für den Ping-Befehl).
 
  
== Datenbankstruktur ==
+
; Apache & PHP
Zuerst muss eine Datenbank (z.B. `monitoring`) und die entsprechende Tabelle angelegt werden.
+
: Installation der Web-Umgebung und des Datenbank-Treibers.
 +
* <code>sudo apt update && sudo apt install apache2 php php-mysqli libapache2-mod-php -y</code>
 +
 
 +
; Datenbank (MariaDB)
 +
: Installation und Absicherung des Datenbank-Servers.
 +
* <code>sudo apt install mariadb-server -y</code>
 +
* <code>sudo mysql_secure_installation</code>
 +
 
 +
; PHP-Berechtigungen
 +
: Die Funktion <code>exec()</code> darf nicht in der <code>disable_functions</code> der <code>/etc/php/8.3/apache2/php.ini</code> stehen.
 +
* <code>sudo systemctl restart apache2</code>
 +
 
 +
== Datenbank-Schema ==
 +
Lege die Struktur in der MariaDB-Konsole an:
  
 
<syntaxhighlight lang="sql">
 
<syntaxhighlight lang="sql">
CREATE TABLE IF NOT EXISTS `hosts` (
+
CREATE DATABASE monitoring;
   `id` INT AUTO_INCREMENT PRIMARY KEY,
+
USE monitoring;
   `hostname` VARCHAR(255) NOT NULL,
+
 
   `ip_address` VARCHAR(45) NOT NULL,
+
CREATE TABLE hosts (
   `last_check` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+
   id INT AUTO_INCREMENT PRIMARY KEY,
 +
   hostname VARCHAR(255),
 +
   ip_address VARCHAR(45),
 +
   last_check TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
 
);
 
);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Die Umsetzung (PHP) ==
+
== Programmierung (index.php) ==
Die Datei `index.php` übernimmt zwei Aufgaben: Das Auslesen der IPs aus der Datenbank und das Prüfen der Erreichbarkeit mittels ICMP Echo Request.
+
Erstelle die Datei unter <code>/var/www/html/index.php</code>.  
  
=== Der Ping-Mechanismus ===
+
<blockquote>
Hierbei wird die PHP-Funktion `exec()` genutzt. Um die Seite aktuell zu halten, nutzen wir einen einfachen HTML-Meta-Refresh.
+
'''Hinweis für Debian 13:''' Der www-data User benötigt oft explizite Rechte für Raw Sockets, um zu pingen:
 +
* <code>sudo setcap cap_net_raw+p /usr/bin/ping</code>
 +
</blockquote>
  
 
<syntaxhighlight lang="php">
 
<syntaxhighlight lang="php">
 
<?php
 
<?php
// Datenbankverbindung
+
$db = new mysqli("localhost", "root", "DEIN_PASSWORT", "monitoring");
$db = new mysqli("localhost", "user", "passwort", "monitoring");
 
  
// Automatische Aktualisierung alle 30 Sekunden
 
 
echo '<meta http-equiv="refresh" content="30">';
 
echo '<meta http-equiv="refresh" content="30">';
 +
echo "<h1>System Monitor</h1>";
  
function checkStatus($ip) {
+
function pingHost($ip) {
     // -c 1 = 1 Paket, -W 1 = 1 Sekunde Timeout
+
     // Absoluter Pfad ist unter Debian 13 sicherer
     exec("ping -c 1 -W 1 " . escapeshellarg($ip), $output, $result);
+
     exec("/usr/bin/ping -c 1 -W 1 " . escapeshellarg($ip), $output, $result);
     return ($result === 0) ? "ONLINE" : "OFFLINE";
+
     return ($result === 0);
 
}
 
}
  
$query = $db->query("SELECT * FROM hosts");
+
$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>";
 
?>
 
?>
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Anzeige-Tabelle ==
+
== Sicherheit & Performance ==
Die Ergebnisse werden in einer einfachen HTML-Tabelle dargestellt:
+
* '''Validierung:''' IPs immer mit <code>filter_var($ip, FILTER_VALIDATE_IP)</code> prüfen.
 
+
* '''Skalierung:''' Bei mehr als 10 Hosts sollte der Ping per '''Cronjob''' in die Datenbank schreiben, statt beim Laden der Seite zu pingen.
{| class="wikitable"
 
! Hostname !! IP-Adresse !! Status !! Letzter Check
 
|-
 
| Server A || 192.168.1.1 || {{Color|green|ONLINE}} || 12:00:01
 
|-
 
| Server B || 10.0.0.5 || {{Color|red|OFFLINE}} || 12:00:01
 
|}
 
 
 
== Sicherheitshinweise ==
 
* '''Command Injection:''' Nutze niemals Benutzereingaben direkt im `exec()` Befehl. Verwende immer `escapeshellarg()`.
 
* '''Performance:''' Bei vielen IP-Adressen (über 20) wird die Seite langsam, da PHP die Pings nacheinander abarbeitet. In diesem Fall sollte auf ein Hintergrund-Skript (Cronjob) ausgewichen werden.
 
 
 
== Siehe auch ==
 
* [[PHP/MySQL Grundlagen]]
 
* [[Netzwerkdiagnose Tools]]
 
  
[[Kategorie:Tutorials]]
+
[[Kategorie:Admin-Dokumentation]]
[[Kategorie:Programmierung]]
+
[[Kategorie:Debian 13]]

Aktuelle Version vom 16. März 2026, 16:31 Uhr

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.