Hinweise für eigene Programme (in PHP usw.)

Stand: 02.12.2021

Aus der Konzeption des Webserverparks ergeben sich einige Besonderheiten, die beim Programmieren und Installieren eigener Programme zu beachten sind.

Notfallvorsorge

Im Falle größerer Katastrophen wird auf ein leistungsschwächeres Notfallsystem umgeschaltet. Auf diesem werden keine PHP-Skripte oder CGI-Programme ausgeführt. Sofern Sie nichts unternehmen, führt der Versuch eines Aufrufs während des Notbetriebs zu einer Fehlermeldung.

Sie können aber zu jedem PHP-Skript und zu jedem CGI-Programm eine Notfalldatei anlegen, welche angezeigt wird, falls während des Notbetriebs jemand einen Aufruf versucht. Dazu erzeugen Sie zu jeder Datei „xxxxx.php“ eine normale HTML-Datei namens „xxxxx.php-sos.html“ (analog für die Dateiendung „.cgi“). Der Name der HTML-Datei ergibt sich also aus dem Namen des Skripts/Programms durch Anhängen von „-sos.html“.

Sitzungen / Sessions

Da verschiedene WWW-Zugriffe von verschiedenen Backend-Servern verarbeitet werden, muss bei der Verwaltung von Sitzungen darauf geachtet werden, dass die Sitzungsdaten an einer Stelle abgelegt werden, auf die alle Backend-Server zugreifen können.

Beim Einrichten eines Webspaces wird für diesen Zweck das Verzeichnis /www/data/NNN/sessions/ angelegt. Sorgen Sie bitte beim Starten eines Programms dafür, dass alle Sitzungsdateien dort und alle anderen Daten, die von einem Zugriff zum nächsten überdauern sollen, ebenfalls in Unterverzeichnissen von /www/data/NNN/ abgelegt werden und nicht in /tmp/.

Wer die Programmiersprache PHP benutzt, findet die entsprechende Zeile bereits in der zuständigen Datei /www/data/NNN/php.ini eingetragen. Dort können auch weitere Konfigurationseinstellungen eingetragen werden.

Programmiersprachen / Skriptsprachen

PHP

Zur Verfügung stehen folgende selbst kompilierte PHP-Versionen. Diese sind bereits eingebunden als Apache-Handler, siehe Eigene Einstellungen im Webserverpark. Die voreingestellte Version können Sie einfach nutzen, wenn Sie eine andere Version nutzen möchten, müssten Sie eine eigene Einstellung vornehmen. Aktuell verfügbar sind:

PHP 7.4

Verfügbar ab 12/2020
Voreinstellung ab 02/2021 bis 06/2022
Endgültige, unwiderrufliche Abschaltung 12/2022
Eigene Einstellung: AddHandler php74-script php

PHP 8.1

Verfügbar ab 12/2021
Voreinstellung ab 07/2022 bis voraussichtlich 06/2024
Endgültige, unwiderrufliche Abschaltung voraussichtlich 12/2024
Eigene Einstellung: AddHandler php81-script php

Die PHP-Version 7.2 sollte eigentlich langfristig zur Verfügung stehen: CentOS 8 wurde anfangs mit dieser Version ausgeliefert und langfristige Unterstützung war versprochen. Jedoch wurden diese Versprechen nicht gehalten. Daher ist leider alle zwei bis drei Jahre eine Aktualisierung auf die dann aktuelle PHP-Version unvermeidbar.

Leider muss spätestens 2022 die aufwändige Migration aller PHP-Programme von PHP 7.4 auf PHP 8.1 durchgeführt werden. Sie sollten daher bereits jetzt mit der Migration beginnen.

Aus Sicherheitsgründen nicht zur Verfügung steht das Apache-Modul mod_php. Daher stehen vereinzelte PHP-Features nicht zur Verfügung (insbesondere keine persistenten Datenbankverbindungen). Ausnahmen sind nur für extrem frequentierte Webspaces, z. B. LearnWeb, möglich.

Aufgrund der PHP-Einbindung als Apache-Handler finden PHP-Skripte, die in zugangsgeschützten Verzeichnissen liegen, die eingegebene Nutzerkennung in $_SERVER['REDIRECT_REMOTE_USER'] (anstatt wie sonst üblich in: $_SERVER['REMOTE_USER']). (Achtung: Da wir am internationalen Single Sign-On teilnehmen, kann diese Variable auch eine externe Identitätsangabe enthalten: „username“ bezeichnet eine von uns vergebene Nutzerkennung, „username@domain“ oder „username@<url>“ eine Identität, die von einem fremden vertrauenswürdigen Identity Provider bestätigt wurde. Die spezielle Nutzerkennung „(null)“ (inklusive der runden Klammern) gibt an, dass der Nutzer sich zwar ausgewiesen hat, seine Identität aber nicht zur Verfügung steht.)

Perl

Perl und alle in den CentOS-7- und EPEL-Repositories vorhandenen Perl-Module sind bereits installiert und können einfach genutzt werden. Entsprechende Programme müssen aber als CGI-Programme aufgerufenen werden, siehe Eigene Einstellungen im Webserverpark).

Wenn Sie weitere Module in Ihrem Webspace installieren möchten, verwenden Sie dazu bitte das Verzeichnis /www/data/NNN/perl5lib/:

mkdir /www/data/NNN/perl5lib
cd
wget .../XXX-YYY-0.0.0.tar.gz
tar zxf XXX-YYY-0.0.0.tar.gz
cd XXX-YYY-0.0.0
perl Makefile.PL PREFIX=/www/data/NNN/perl5lib/XXX-YYY-0.0.0
make
make test
make install
/www/bin/repairwebspace NNN

Da der Webserver die Umgebungsvaraiable PERL5LIB=/www/data/NNN/perl5lib setzt, werden die so erzeugten Module problemlos gefunden.

Aus Sicherheitsgründen nicht zur Verfügung steht das Apache-Modul mod_perl. Daher stehen vereinzelte Perl-Features nicht zur Verfügung (insbesondere keine persistenten Datenbankverbindungen).

Andere

Alle weiteren zum Lieferumfang von CentOS 7 gehörenden Sprachen können ebenfalls genutzt werden. Entsprechende Programme müssen aber als CGI-Programme aufgerufenen werden, siehe Eigene Einstellungen im Webserverpark.

Weitere Software

In gewissem Rahmen kann systemseitig vom Ihnen gewünschte Software nachinstalliert werden, vorzugsweise aus den CentOS-7- und EPEL-Repositories. Bitte nehmen Sie bei Bedarf frühzeitig Kontakt mit uns auf, damit wir gemeinsam die beste Lösung für Ihre Problemstellung finden können.

Versand von E-Mails

E-Mails können ganz normal mit den Werkzeugen der verwendeten Skriptsprache verschickt werden. Jedoch sollten Sie darauf achten, dass als Absender eine sinnvolle Adresse eingetragen wird, damit eventuelle Fehlermeldungen bei Ihnen landen und nicht die Systemverwalter belästigen:

Wer die PHP-Funktion mail() benutzt, sollte bitte als fünftes Argument (additional parameters) die Angabe „-f absender“ angeben, etwa so:

$ok=mail($to,$subj,$message,'','-f username@uni-muenster.de');

Wer direkt die Systemfunktion /usr/sbin/sendmail benutzt, sollte dabei ebenfalls die Option „-f Absender“ angeben.

Regelmäßig ablaufende Programme (Cron-Jobs)

Das Installieren von Cron-Jobs ist auf dem Webserverpark nicht möglich. Sie können jedoch in Ihrem Hauptverzeichnis ein Verzeichnis /www/data/NNN/cron und darin eine Datei /www/data/NNN/cron/daily ablegen und mit dem Befehl „chmod +x /www/data/NNN/cron/daily“  ausführbar machen. Diese Datei wird dann täglich einmal in der Nacht irgendwann zwischen 3 Uhr und 5 Uhr aufgerufen.

Falls es unbedingt nötig ist, können Sie im gleichen Verzeichnis auch Skripte namens /www/data/NNN/cron/xxx.loop ablegen (xxx passend ersetzen). Das System schaut alle fünf Minuten nach diesen Skripten: Falls ein Skript gerade nicht läuft und seit dem Ende des vorherigen Laufs mindestens fünf Minuten vergangen sind, wird es neu gestartet. Für diese Skripte gilt ein CPU-Zeit-Limit von nur gut einer Minute. Normalerweise läuft so ein Skript also alle 10 Minuten. Um ein Skript stündlich auszuführen, ergänzen Sie ein „sleep 3000“ (= eine Stunde minus 10 Minuten).

MySQL-Datenbanken

Auf Wunsch kann einem Infoanbieter eine MySQL- (genauer: MariaDB-) Datenbank zur Verfügung gestellt werden. Der Zugriff auf diese Datenbank erfordert TLS-Verschlüsselung, damit das Datenbankpasswort nicht im Klartext durch das Netz geschickt wird. In PHP könnte das so aussehen:

$dbhost='mysql.uni-muenster.de';
$dbport=3306;
$dbuser='.....';
$dbpass=chop(file_get_contents('.....')); # Passwort aus Datei
$dbname='.....;

$conn=mysqli_init();
mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 5);
mysqli_ssl_set($conn, null, null,
  '/www/data/sys/pem/all-rootca.pem', # Wurzelzertifikate
  null, null
);
if(!mysqli_real_connect($conn,
  $dbhost,$dbuser,$dbpass,$dbname,$dbport,null,
  MYSQLI_CLIENT_SSL)
){ ... Fehlerbehandlung ... }

oder so mit PDO:

$dbhost='mysql.uni-muenster.de';
$dbport=3306;
$dbuser='.....';
$dbpass=chop(file_get_contents('.....')); # Passwort aus Datei
$dbname='.....;

try{
  $pdo=new PDO("mysql:host=$dbhost;port=$dbport;dbname=$dbname",
    $dbuser,$dbpass,[
      PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
      PDO::MYSQL_ATTR_SSL_CA=>'/www/data/sys/pem/all-rootca.pem',
    ]
  );
  .....
}catch(PDOException $e){ ... Fehlerbehandlung ... }