CentOS7 – PHP auf 7.2 updaten

CentOS 7 hat ja ein mitlerweile steinaltes PHP 5.4 on board. Sicherheitsupdates dafür sind Fehlanzeige, Support ebenso. Was liegt also näher, als auf PHP 7.2 updzudaten? Voraussetzung ist natürlich, das man vorher geprüft hat, das damit alle Webanwendungen die man verwendet, funktionieren.

Schritt 1: Zunächst müssen wir die Yum-Utils und das Epel-Repository installieren.

yum install epel-release yum-utils -y

Schritt 2: Remipo herunteraden und installieren

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Schritt 3: Das PHP 7.2 Repository aktivieren. Gültige Parameter wären auch remi-php70 oder remi-php71 je nach gewünschter Version.

yum-config-manager --enable remi-php72

Schritt 4: PHP installieren.

yum install php php-common php-opcache php-mcrypt php-cli php-gd php-curl php-mysql -y

Um alle PHP-Module anzuzeigen, hilft dieser Befehl weiter:

yum search php | more

Schritt 5: Installation prüfen. Zunächst sollte man an der Shell einfach php -v eintippen. Hier muss nun die PHP-Version 7.2 (oder die man gerade installiert hat) zurückgegeben werden. Nun sollte man noch ins Webserver-Verzeichnis eine PHP-Datei ablegen und diese dann im Browser aufrufen – auch hier muss die aktuelle Versionsnummer angezeigt werden. Inhalt:

<?php
phpinfo();
?>

ownCloud / nextCloud – Dateien als Ordner in Documents am iPad

Seit langem nutze ich die App „Documents“ von Readdle. Seit dem letzten ownCloud-Update auf onwCloud 10.x werden hier Dateien als Ordner angezeigt. Andere WebDAV-Clients funktionieren soweit ich das beurteilen konnte.

Ich habe dann länger nach der Ursache geforscht. Unter anderem habe ich das ganze auch mit einer aktuellen nextCloud-Installation getestet, mit dem gleichen Ergebnis. Mit einer alten ownCloud 9 hingegen hat alles richtig funktioniert. Nach längerer Recherche fand ich dann die Lösung in diesem GitHub-Issue.

Zusammengefasst:

Im ownCloud-Verzeichnis gibt es die Datei /lib/composer/sabre/dav/lib/DAV/Server.php

In dieser sucht man nach @param PropFind und löscht den darunter folgenden Block raus und fügt den hier ein. Und schon funktioniert es wieder mit Readdle Documents und ownCloud 10.

 * Small helper to support PROPFIND with DEPTH_INFINITY.
 *
 *
 * @param PropFind $propFind
 * @param array $yieldFirst
 * @return \Iterator
 */
private function generatePathNodes(PropFind $propFind, array $yieldFirst = null) {
    if ($yieldFirst !== null) {
        yield $yieldFirst;
    }
    $newDepth = $propFind->getDepth();
    $path = $propFind->getPath();

    if ($newDepth !== self::DEPTH_INFINITY) {
        $newDepth--;
    }

//FIX in order to create new PropFind objects and not clone them
$propertyNames = $propFind->getRequestedProperties();
$propFindType = $propertyNames ? PropFind::NORMAL : PropFind::ALLPROPS;

    foreach ($this->tree->getChildren($path) as $childNode) {
     //FIX : no cloning, creating new PropFind objects
        //$subPropFind = clone $propFind;
        //$subPropFind->setDepth($newDepth);
        if ($path !== '') {
            $subPath = $path . '/' . $childNode->getName();
        } else {
            $subPath = $childNode->getName();
        }
        //$subPropFind->setPath($subPath);

     //FIX : create a new PropFind object with the right parameters
     $subPropFind = new PropFind($subPath, $propertyNames, $newDepth, $propFindType);

        yield [
            $subPropFind,
            $childNode
        ];

        if (($newDepth === self::DEPTH_INFINITY || $newDepth >= 1) && $childNode instanceof ICollection) {
            foreach ($this->generatePathNodes($subPropFind) as $subItem) {
                yield $subItem;
            }
        }

    }
}

Webserver-Administration mit VirtualMin – Plesk ist tot…

Bisher (siehe alte Blog-Einträge) war ich ein zufriedener Nutzer der kommerziellen Server-Administrationsoberfläche Plesk. Leider hat der Softwarehersteller seine Lizenzpolitik zum Jahresende 2017 so geändert, so das ich jetzt mehr Geld für die Administrationsoberfläche als für den vServer gezahlt hätte. Das war nicht mehr tragbar und so sah ich mich nach einer zukunftsfähigen Lösung um, die meine Anforderungen abdeckte. Diese wären:

  • Einfach Administration von Domains und Subdomains
  • Einfach Administration vom Mailadressen, Mailpostfächern und mySQL-Datenbanken
  • Grafische Oberfläche die verständlich und leicht zu installieren ist
  • Unterstützung von Let’s Encrypt SSL-Zertifikaten für Webserver, Mailserver und FTP-Server
  • Automatisierung von Backups auf einen externen Server, wenn möglich Übertragung per SSH

Ich habe einiges ausprobiert und bin dann letztlich bei VirtualMin gelandet, einer Erweiterung zu Webmin. Meine Anforderungen erfüllt es gut und die Installation verlief dank der ausführlichen Anleitung auf der Webmin-Homepage recht gut. Es stellte sich heraus, das man VirtualMin am besten mit dem Installationsskript auf einem Server installiert, auf dem ein minimal konfiguriertes Linux, am besten ohne Apache und mySQL läuft. Während das Installationsskript läuft, werden alle Komponenten wie mySQL, Apache, Mail- und FTP-Server nachinstalliert.

Ausführliche Infos und die Installationsanleitung findet man auf der Webseite von VirtualMin.

Die Navigation der Anwendung sieht dann so aus:

Alles in allem funktioniert das ganze sehr problemlos und nach kurzer Eingewöhnungszeit kann ich mitlerweile damit alles tun, was ich in Plesk erledigt habe. Nur halt endlich in einer OpenSource-Software, die keine irren Beträge kostet und von einer willkürlichen Preispolitik eines Herstellers abhängig ist.

Ach ja: ein Update von Plesk auf VirtualMin geht nicht, genauso wenig wie das zu einem anderen Panel hin ginge. Die Software macht hierfür zu viele Änderungen im System und jedes Administrationspanel speichert seine Daten an unterschiedlichen Orten und hat auch so einige Besonderheiten, die einen einfachen Umstieg schwierig machen. Aber mit einer Parallelbereitstellung von 2 Servern und schrittweisen Umzug war das alles kein großes Problem.

Linux – Dateien anzeigen, die in den letzten X Tagen erstellt oder geändert wurden

Unter Linux ist es relativ leicht, alle Dateien rekursiv unterhalb des aktuellen Verzeichnisses anzeigen zu lassen, die in den letzten X Tagen geändert wurden:

find ./ -mtime -3

Dieser Befehl gibt alles Dateien aus, die in den letzten 3 Tagen geändert oder erstellt wurden.

Andersherum geht es natürlich auch – wenn man statt -3 z.B. +3 angibt, werden alle Dateien ausgegeben, die älter als 3 Tage sind.

Plesk Onyx Server – Upgrade von mySQL auf MariaDB 10.1

Nachdem ich einen neuen Server mit CentOS 7 aufgesetzt habe und darauf Plesk Onyx als Administrationsoberfläche installiert habe, musste ich feststellen, das darauf mySQL Server 5.5 lief. Da ich einige bestehende Datenbanken übernehmen musste, brauchte ich da was neueres.

Wie so oft im Internet fand ich viele falsche Anleitungen, wie man das macht. Hier nun die zusammengefasste und richtige Fassung:

Zunächst muss man die Version 10.1 von MariaDB installieren. 10.2 wird von Plesk noch nicht voll unterstützt. Was auch immer das bedeutet – ich wollte es nicht ausprobieren. Die Anleitung gibt es bei Plesk.

Theoretisch ist damit das Update auch schon erledigt. Aber ganz vollständig ist die Anleitung leider noch nicht, da die Datenbankstruktur selbst hiermit noch nicht upgedated wurde, was man an Einträgen im Log sieht.

Abschließend muss man noch mit dem Befehl

MYSQL_PWD=`cat /etc/psa/.psa.shadow` mysql_upgrade -uadmin

die Datenbankstruktur aktualisieren – und schon funktioniert alles mit MariaDB 10.1.

Nachdem ich dann aber den Watchdog wieder aktiviert habe und den Server neu startete, stellte ich fest, das der Watchdog mit der MariaDB nicht umzugehen wusste. Ich habe da dann noch vom Watchdog eine Mail bekommen, das die Überwachung von MySQL deaktiviert wurde.

Die Lösung: in den Einstellungen vom MySQL-Dienst im Watchdog musste ich die Befehle für das Starten und Beenden des Services anpassen, wie im folgenden Screenshot. Und damit wurde dann auch MariaDB wieder überwacht.

Aus PO Dateien die MO-Dateien erstellen

Für ein WordPress-Projekt musste ich deutschsprachige Übersetzungsdateien herunterladen, die als PO-Dateien vom Hersteller geliefert wurden. Das entsprechende WordPress-Plugin benötigte an der Stelle aber eine PO-Datei.

Die Linux-Kommandozeile half hier mal wieder weiter – und zwar der Befehl

msgfmt -o de.mo de.po

Bei meinem Debian war der Befehl von Haus aus verfügbar, d.h. ich musste nichts nachinstallieren. Auf einem anderen Rechner fehlte es hingegen. Mit apt-get install gettext kann man das aber problemlos nachinstallieren.

Und mir blieb der Weg zu komischen Web-Translator-Diensten die auch PO in MO wandeln können sollen erspart.

Lubuntu & ownCloud – doppelte Passworteingabe verhindern

Unter Lubuntu habe ich den ownCloud-Client installiert. Leider fragt mich der Rechner nun nach jeder Anmeldung nach dem Passwort für den Schlüsselbund. Unter Ubuntu selbst hingegen kommt diese Abfrage nicht.

Das ganze kann man recht einfach abstellen. Zunächst installiert man mit  sudo apt-get install libpam-gnome-keyring  das passende Paket. Nach einer Ab- und Anmeldung sieht der Dialog von eben so aus:

Neu ist nun die Option „Diesen Schlüsselbund beim Anmelden automatisch entsperren“. Diese aktiviert man, und schon kommt diese Meldung nicht mehr!

Detailiert ist das ganze im Ubuntu-Wiki beschrieben.

 

TeamSpeak 3 Server auf Linux vServer installieren

Genau wie am Client ist auch am Server die Windows-Ära bei mir jetzt langsam komplett vorüber. Es gibt noch genau 2 Anwendungen, die bisher unter Windows liefen: Teamspeak Server und mein Jabber-Server. Beide werde ich nun auf meinen Linux vServer installieren. Den Anfang macht TeamSpeak, den ich im folgenden auf einem Linux-Server installiere.

Grundsätzlich sollte man für alle Dienste die man auf einem Linux-Server installiert aus sicherheitsgründen immer einen eigenen User nehmen. Auf gar keinen Fall darf man sowas als root installieren. Also legen wir einen Userverzeichnis und einen User an mit:

root@srv:~# mkdir /home/ts3
root@srv:~# useradd -g users ts3 -d /home/ts3/

Nun vergeben wir dem User noch ein Passwort:

root@srv:~# passwd ts3
 Enter new password:
 Retype new password:
 passwd: password updated successfully

Und zu guter letzt muss nun der Benutzer noch Eigentümer seines Home-Verzeichnisses werden.

root@srv:~# chown ts3 /home/ts3/

Nun loggen wir uns am besten per ssh mit den Benutzerdaten unseres ts3-Users auf dem Server ein. Auf der Seite http://www.teamspeak.com/en/downloads#server findet sich der Download-Link der aktuellen Server-Sersion. Mit dem Kopieren-Icon kann man sich den Link zur aktuellsten Version in die Zwischenablage kopieren. Am Server muss man dann nur noch wget <kopierte Adresse> einfügen.

Mit

tar xfvj teamspeak3-server....tar.bz2

wird dann das Archiv entpackt. Nun wechseln wir mit cd in das Verzeichnis, das gerade durch das Entpacken angelegt wurde und starten den Server mit ./ts3server_minimal_runscript.sh

Wenn alles richtig läuft, müsste nun sowas hier kommen:

------------------------------------------------------------------
 I M P O R T A N T
------------------------------------------------------------------
 Server Query Admin Account created
 loginname= "serveradmin", password= "XXXX"
------------------------------------------------------------------

 I M P O R T A N T
------------------------------------------------------------------
 ServerAdmin privilege key created, please use it to gain
 serveradmin rights for your virtualserver. please
 also check the doc/privilegekey_guide.txt for details.

token=XXXXX
------------------------------------------------------------------

Die angezeigten Informationen sollte man nun am besten in einer Datei abspeichern, da wir diese später nochmal brauchen. Das Minimal-Runscript ist nicht für den dauerhaften Betrieb geeignet! Es läuft nur so lange, wie die SSH-Sitzung aktiv ist. Wird diese geschlossen, wird auch der Server beendet. Das ist natürlich nicht sinnvoll. Mit Strg + C beenden wir nun erstmal den TS3-Server.

Nun starten wir den Server erstmal „normal“:

-bash-4.2$ ./ts3server_startscript.sh start
Starting the TeamSpeak 3 server
TeamSpeak 3 server started, for details please view the log file

Und jetzt ist es auch an der Zeit, das wir uns erstmal den für unser Betriebssystem passenden TeamSpeak-Client von der Seite herunterladen:

http://www.teamspeak.com/en/downloads

Im TeamSpeak-Client verbinden wir uns mit „Verbindungen / Verbinden“ mit unserem Server. Entweder direkt auf die IP-Adresse, oder über einen schon gesetzten DNS-Eintrag, wie in meinem Beispiel.

Der erste der sich am Server einloggt wird nun gleich nach dem Server-Token gefragt, um Admin-Rechte zu bekommen. Hier trägt man das Token aus der Textdatei ein.

Wenn nun alles geklappt hat, sollte das ganze so aussehen.

Jetzt läuft zwar der Server, aber wir haben ein Problem: nach einem Server-Boot startet er nicht automatisch. Dies müssen wir nun noch anpassen. Nun loggen wir uns wieder als root am Server per ssh ein. Mit nano /etc/init.d/teamspeak3  erstellen wir nun eine Datei mit folgendem Inhalt:

#!/bin/sh
### BEGIN INIT INFO
# Provides: teamspeak3
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Teamspeak 3 Server
### END INIT INFO


# INIT Script by www.SysADMINsLife.com
######################################
# Customize values for your needs: "User"; "DIR"

USER="ts3"
DIR="/home/ts3/teamspeak3-server_linux_amd64"
 
###### Teamspeak 3 server start/stop script ######
 
case "$1" in
start)
su $USER -c "${DIR}/ts3server_startscript.sh start"
;;
stop)
su $USER -c "${DIR}/ts3server_startscript.sh stop"
;;
restart)
su $USER -c "${DIR}/ts3server_startscript.sh restart"
;;
status)
su $USER -c "${DIR}/ts3server_startscript.sh status"
;;
*)
echo "Usage: {start|stop|restart|status}" >&2
exit 1
;;
esac
exit 0

Die beiden Variablen USER und DIR sind ggf. noch anzupassen. Und mit chmod 755 /etc/init.d/teamspeak3 machen wir das Startskript nun noch ausführbar.

Unter Debian & Co. aktiviert nun dieser Befehl den Autostart:

update-rc.d teamspeak3 defaults

Wenn man hingegen Redhat oder CentOS (wie ich hier) verwendet, dann hilft das hier weiter:

Dienst hinzufügen:

chkconfig --add teamspeak3

Anzeigen lassen:

chkconfig --list teamspeak3

Autostart aktivieren:

chkconfig teamspeak3 on

Nun ist es hilfreich, den Server mal zu booten, um zu testen ob das mit dem Autostart auch klappt.

 

Internet-Terminal mit Lubuntu einrichten

Auf einem Rechner, der in einem frei zugänglichen Bereich steht, war bisher als „Internet-Terminal“ ein Windows 10 installiert, welches nach jedem Update Probleme machte. Dieses durfte ich nun auf Lubuntu updaten.

Vorgaben waren:

  • Firefox als Browser soll automatisch starten
  • Bildschirmschoner soll erscheinen, Energiesparmodus muss aus sein
  • Automatische Anmeldung als Gast-Benutzer, somit Wiederherstellung aller Einstellungen nach Neustart
  • Administrierbarkeit per SSH
  • keine großen Probleme mit Updates

Zunächst habe ich als Linux-Distribution Lubuntu gewählt, einfach weil es einen sehr schlichten Desktop mitbringt, einfach anzupassen ist und nicht so viel unnötigen Ballast mitschleppt. Während der Installation habe ich mir einen Admin-Bediener angelegt, der später für SSH-Zugriffe und zum lokalen Administrieren benötigt wird. Den Autologin habe ich an der Stelle auf „Nein“ stehen, da später ja mit einem Gast-Bediener gearbeitet werden soll.

Nach der Installation habe ich zunächst einmal auf der grafischen Oberfläche die Spracheinstellungen geöffnet, damit Lubuntu fehlende Sprachpakete nachinstalliert. Ansonsten ist z.B. Firefox in Englisch.

Danach folgen diese Befehle:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mc ssh net-tools
sudo apt-get remove light-locker apparmor

Die ersten beiden bringen erstmal das Linux und die Paketquellen auf den aktuellen Stand. Mit dem dritten installiere ich MidnightCommander (brauche ich immer), den SSH-Server und die net-tools, damit Befehle wie z.B. ifconfig funktionieren. Der letzte Befehl entfernt apparmor, weil der leider mit dem Gast-Bediener kollidiert und den Bidschirmschoner light-locker.

Wenn man light-locker deinstalliert, wird automatisch XScreensaver installiert, was wir dann im folgenden auch brauchen. Apparmor hat das Problem, das wenn der Gastbediener angemeldet wird, immer die Meldung „No session for pid XXX“ erscheint. Vermutlich kann man das auch hinbekommen, indem man den Apparmor richtig konfiguriert, aber das habe ich an der Stelle nicht gemacht.

Nun legen wir eine Datei /etc/lightdm/lightdm.conf mit folgendem Inhalt an:

[SeatDefaults]

autologin-guest=true

Hiermit wird automatisch der Gast-User beim Rechnerstart angemeldet. Wir bleiben noch als Admin angemeldet und konfigurieren nun den Firefox (z.B. Startseite), den Bildschirmschoner und die Energiespareinstellungen von xfce. Die Startkonfiguration die jedesmal nach der Anmeldung für den Gast-Benutzer verwendet wird, wird aus /etc/guest-session/skel/ in ein temporäres Profilverzeichnis kopiert. In das /etc/guest-session/skel/ müssen wir nun auch unsere „Wunschkonfiguration“ vom aktuellen Bediener reinkopieren. In meinem Beispiel wären das:

.xscreensaver -> Konfiguration vom Bildschirmschoner
.mozilla (Ordner) -> Konfiguration vom Firefox Browser
Schreibtisch (Ordner) -> Desktop-Icons
.config/xfce4/xfce-perchannel-xml/xfce4-power-manager.xml -> Energiespareinstellungen – hier habe ich eingestellt das der Rechner nicht in den Energiesparmodus geht.

Dann habe ich im Verzeichnis /etc/guest-session/skel/.config noch einen Ordner autostart angelegt und dort die Datei „firefox.desktop“ vom Schreibtisch reinkopiert, damit der Firefox automatisch gestartet wird. Außerdem habe ich im gleichen Ordner noch eine Datei „xscreensaver.desktop“ mit folgendem Inhalt angelegt:

[Desktop Entry]
Version=1.0
Name=XScreensaver
Comment=Bildschirmschoner
GenericName=Bildschirmschoner
Exec=xscreensaver -nosplash
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=xscreensaver

Hiermit wird dann der Dienst vom XScreensaver nach der Anmeldung gestartet, sonst funktioniert der Bildschirmschoner nicht.

Nun ist Zeit für einen Neustart und schon ist unser Internet-Rechner fertig…

Und ja – mir ist bewusst, das es dann noch einiges an der Konfig zu tun gibt, wenn man es benötigt. Zum Beispiel nicht benötigte Anwendungen ausblenden oder das Startmenü und den Desktop soweit eindampfen, das nur das was tatsächlich benötigt wird angezeigt wird. Für meinen Einsatzzweck hat es aber so gereicht.

 

 

 

nginx/Plesk – Caching für statische Inhalte einschalten

Im letzten Beitrag habe ich erklärt, wie man die GZip-Komprimierung im nginx unter Plesk aktiviert. Google PageSpeed Insights hat außerdem noch bemängelt, das mein Server keine Cache-Informationen mitschickt. Diese Information ist für statische Inhalte wie JPG oder JS-Dateien sinnvoll, da hiermit dem Browser gesagt wird, wie lang er die aus dem lokalen Plattencache nutzen soll, anstatt sie erneut vom Server zu laden.

Leider kann man diese Option nicht auf Serverebene einstellen, sondern muss das pro Domain / Subdomain durchführen. Und zwar unter „Einstellungen für Apache & nginx“.

Dort trägt man den obenstehenden Text unter „Zusätzlich nginx-Anweisungen“ ein. Hier nochmal der Text als „Kopiervorlage“.

location ~* \.(?:ico|css|js|jpg|gif|jpeg|png|svg|woff)$ {
   expires 7d;
   add_header Pragma public;
   add_header Cache-Control "public";
}

Den Wert von 7d kann man bei Bedarf auch auf länger, z.B. 30d für 30 Tage anpassen.

Hier die Anzeige von Google PageSpeed Insights vor der Änderung:

und hier danach:

Der Wert ist also von 80 auf 85 gestiegen…