Kräss – MySQL und WordPress auf SSD

Ui.

Mein Mac läuft ja schon eine „kleine“ Weile mit einer SSD, mir sind also die Vorteile von SSDs durchaus geläufig.

Leider aber auch die Nachteile – Plattenplatz geht so aber mal richtig ins Geld.

Auf dem neuen Server wollte ich dann nicht wirklich mehrere Tausender für ein paar TB Speicher ausgeben. Da schieden SSDs direkt aus. Also mussten WD Red-Platten her, immerhin auch nicht gerade die billigsten, dafür aber ausgelegt auf Dauerbetrieb und Standhaftigkeit (wollen wir mal einfach hoffen, dass das keine reine Werbung ist…).

Auch wenn CPU und Speicher und überhaupt im neuen Server alles eine ganze Klasse besser ausgefallen ist als in der Synology DS415+, die wir bis vor ein paar Tagen als Server eingesetzt haben, so war die Backend-Performance vom WordPress doch immer noch etwas „schwach“.

Also vorhin gestern Nacht im Schweiße meines Angesichts (ich habe unglaubliche Rückenschmerzen *rumjammer*) eine kleine SSD (240GB) reingekabelt und dann rumprobiert.

MySQL

Zunächst mal sollte die Datenbank auf die SSD. Mirko denkt sich, „machst du symbolische Verlinkungen, dann passt dat“. Aber nöööööööööö. AppArmor mag das nicht. Ich hasse AppArmor, schon sehr lange. Uns verbindet eine Hass-Liebe.

Also in mysqld.cnf ein bisschen geändert:

datadir = /mnt/ssd/mysql

Natürlich vorher MariaDB mit „service mysql stop“ runtergefahren – und dann alles rüberkopiert (außer den Log-Dateien, die erstellt MariaDB/MySQL ja beim Starten neu).

Bisschen uffpasse, die Rechte sollten gleich bleiben, also idealerweise so etwas wie rsync -av dafür nehmen. Auch an den neuen „Ordner“ denken (… oh man wie die Zeiten vermisse, als man noch Verzeichnis oder Directory statt Ordner oder Folder sagte…), der braucht ggf. auch die passenden Rechte, damit neue Dateien dort mit dem richtigen Bub angelegt werden (bei mir chown -R mysql:mysql mysql/).

MySQL/MariaDB wieder gestartet und – es läuft.

Apache2

Als nächstes dann die eigentliche Webseite rüber. Unfassbar… wo ich überall echte Pfade in den Bashscripten, PHP-Dateien und sonstigem verwurstet habe. Da rächt sich wieder die frühere Faulheit… also erst mal eine Weile die Pfadangaben geändert (nicht per find und xargs und sed, ich hatte Sorge, dass da was falsches umgeändert wird).

Dann DocumentRoot und ein paar <Directory>-Dinger angepasst.

Läuft.

Fazit

Wenn das jetzt ein echtes Porno-Blog wäre, würde ich sagen, dass ich nen Dauerdicken hatte.. alter Schwede flutscht das jetzt.

Das Backend fühlt sich an wie eine richtige Software (also eine, die lokale auf dem Rechner läuft, nicht mit Java oder sonstiger Scheiße geschraubt wurde, und generell von einem entwickelt wurde, der noch Bock auf optimalen Code hatte und dessen erster Gedanken nicht ist, „wo gibbet da ein Framework zu“ – da wir WordPress einsetzen, fällt mir gerade so ein bisschen die Ironie auf… aber hei, ist hier mein Blog, ich kann hier rumsticheln, wie ich möchte *g*).

Schon nen bisschen geil 😀

P.S.

Ich erwähnte, dass wir natürlich PHP7 mit OpCache einsetzen (hhvm war mir zu frickelig) und jetzt den Redis auch als Object-Cache nutzen?

P.P.S.

Apropos… wenn ihr im WordPress das Plugin Redis Object Cache einsetzen solltet, passt bitte unbedingt WP_REDIS_DATABASE (in wp-config.php) an. Default ist 0 – und die war bei mir schon vom rspamd und seinen Bayes-Dingern belegt… wisst ihr, was passiert, wenn das Plugin seinen Cache löscht? Jaaaaaaaa… der ballert Database 0 einfach leer… OH MAN.

Wie gut, dass ich gerade dabei war, die Backup-Scripte neu zu gestalten/einzusetzen. So war alles notwendige gesichert, ich hätte jetzt eher überschaubare Lust gehabt, noch mal den Bayes-Filter mit Spam zu befüttern.

Zum Thema Backupscripte könnte ich auch noch was schreiben. Später vielleicht.

CPU 25%, io > Wahrnehmungsgrenze

Oh man.

In den 90ern, als ich mit einem Kumpel gerne mal Hongkong-Filmchen mit englischem Untertitel geschaut habe, gab es einen Film, bei denen einer von Berufes wegen „Cleaner“ genannt wurde.

Das war so einer, der andere Leute ähm „weggemacht“ hat. Also ein Auftragsmörder.

Selbigen hätte ich heute mal gebrauchen können.

Unser neuer Server läuft mit Butter-FS oder btrfs, wie der Profi sagt (und ausspricht *g*).

Dieses Dateisystem hat ein paar richtig fette Features. Unter anderem auch Snapshot – also so etwas wie „Systemwiederherstellungspunkte“, für den Windows-Anwender. Ein punktgenauer Ist-Zustand des zum Zeitpunkt des Snapshots vorgefundenen Datenmülls.

Das möchte man nutzen.

Wieso auch nicht. Auch dafür benutzt man ein modernes Dateisystem. Man möchte die Features gebrauchen – sonst könnte man ja, etwas kätzerisch ausgedrückt, ja gleich bei FAT32 bleiben *flöt*

Zum automatischen Erstellen solcher Snapshots gibt es von SuSE ein Tool, dass sich snapper nennt. Das lötet fröhlich in definierbaren Abständen Snapshots in Dateisystem – funktioniert auch echt richtig zuverlässig.

Und irgendwann räumt das Tool auch alte Snapshots weg.

Und wehe, wehe, WEHE, man hat Quotas angeschaltet. Noch nicht mal wissentlich, denn das fiese Dinge fummelt die möglicherweise sogar automatisch an („um besser informiert zu löschen„).

Leider ist der Zustand der Quotas bei btrfs, sagen wir mal, unterdurchschnittlich ausgeprägt. Macht also haufenweise Probleme, die meisten Leute schalten sie ab – eine sehr verbreitet Nebenwirkung ist „100% Auslastung und unbenutzbares System beim Löschen von Snaphots“.

Jetzt zählen wir mal 1 und 1 zusammen:

  • Ein Tool, was regelmäßig Snaphots erstellt
  • diese ebenso regelmäßig bereinigt

Huch? Ja, richtig. Wenn man Quotas anhat, geht das so richtig in die Hose. Server steht, nur über den süßen Notausknopf noch zu retten (und, wie das bei Linux-Systemen so üblich ist, ein Notfall-USB-Stick zur Hand…).

Mirko hat heute schon etliche Male gesagt, er möchte keine Quotas…

btrfs quota disable /

btrfs quota disable /var/www

btrfs quota disable /srv/projekte

btrfs quota disable $gott_und_die_welt$

Aber.

Snapper ist das scheißegal. Er macht die einfach wieder an – übrigens genau so wie „btrfs-du“ (NICHT verlinkt, weil kaputt, siehe dieser Text hier).

Kann man abschalten.

It actually will if you used quotas before:
# snapper cleanup number
quota not working (preparing quota failed)

# snapper get-config | grep QGROUP
QGROUP                  | 1/0

This fixes it:
# snapper set-config QGROUP=

Wenn ihr also jemals mehrfach eure Server neu gestartet und von außen die Quota abgeschaltet habt und euch gewundert, wieso es das System offenbar einen Scheiß interessiert, guckt doch mal nach snapper 🙂

P.S. Wenn man mit dem Notsystem per USB von außen auf die Platte möchte, findet btrfs die Platten/Raids recht einfach – man muss nur wissen, wie.

P.P.S. Ok, ich verrate es:

btrfs device scan
mount /dev/sda3 /mnt
btrfs quota disable /mnt/@
btrfs quota disable /mnt/@home

Quotas kann man nur bei gemounteten Dingens abschalten, das Reparieren tunlichst nur bei nicht gemounteten.

Manchmal hasse ich es, dass Software von Bastlern zusammengefummelt hochprofessionell verkackt wird.

Wieso funktioniert Quota nicht? Obwohl das doch so hübsch klingt… wenn da nicht folgendes stünde:

Using btrfs subvolume delete will break qgroup unshared space usage. After deleting a subvolume, you must manually delete the associated qgroup. Bugs in accounting code might cause false out of space situations. Combining quota with (too many) snapshots of subvolumes can cause performance problems, for example when deleting snapshots.

F*ck it. Auch andere haben damit Probleme.

Server-Umzug

In den letzten beiden Tagen habe ich unseren aktuellen Server teilweise auf neue Hardware umgezogen.

Die Gründe… ähm sagen wir so, eine Synology NAS in der bezahlbaren Variante leistet für PHP-Interpretation nur überschaubare Leistung und da unsere Homepage ein WordPress-Monster ist, wirkt sich das für uns im Backoffice erheblich aus. Die Besucher haben davon nie etwas mitbekommen, da wir dank aufwändig gebauter Cache-Mechanismen nur noch generierten HTML-Code ausliefern und alle Medien bei Amazon ablegen… alleine das Wartungsscript… jede Nacht lief über eine Stunde das Neuerstellen des Caches 🙂 Bisschen verrückt, ja… nun ja.

Wie auch immer.

Bei Memory PC einen Billigrechner mit anständiger Hardware besorgt. In leer. Also erst mal nach vielen, vielen, vielen Jahren Abstinenz wieder mit dem Thema „welches Kabel gehört wohin“ und „welche Platte muss da eigentlich rein“ befasst.

War gar nicht so schmerzhaft, wie ich es in Erinnerung hatte. Die Dokumentation von Mainboards ist mittlerweile sehenswert -früher gab es zum Mainboard ein versiffter A4-Blatt mit chinesischer Symbolik (und Logik…). Heute… englisches Handbuch mit detaillierten Beschreibungen…

Wie auch immer.

WD Red Platte rein als primäre Platte, Ubuntu Server Edition drauf und dann erst mal die Konfiguration des Webservers und Dovecots rüber auf den neuen Server. Ich hatte schon Getränke kaltgestellt und extra Urlaub eingereicht – man kennt das ja, so etwas zieht sich.

Gestern Nachmittag um 1600 angefangen und irgendwann am frühen Abend (so gegen 0230) das meiste am Laufen gehabt. Linux ist schon ein bisschen geil, geht alles dank Konsole/Terminal ruck zuck und das Internet (zweiter Rechner in brauchbar steht neben dem Server) hilft praktisch immer – wenn man weiß, wonach man suchen muss (was ja jetzt nicht soooooo das Problem ist…).

Datenbanken umzuziehen war übrigens keine große Sache. Früher war das oft SEHR gruselig dank der Encodierungs-Probleme. Heute gibt es die nicht mehr, weil man neue Datenbanken immer mit UTF in irgendeiner Variante aufsetzt und damit die Dumps ganz einfach migrierbar sind… da hab ich blöd geguckt, kein Script mit sed-Magie nötig gewesen 🙁

Naja. Webseite wird jetzt über den neuen Server ausgeliefert (ich liebe IPv6 *g*) und Dovecot läuft…

Also für geeignete Werte von „läuft“…

Alle Mails kommen doppelt an.

Das ist jetzt der Job für heute Nacht 😀

undefined access to undefined

Ich steh ja so wirklich und ganz und gar auf vielsagende Fehlermeldungen. Echt jetzt. Wer möchte nicht, dass man sofort weiß, was das Problem ist.

undefined access http://www.yellowstoneaussies.de/infos/undefined

Fehlersuche

Tja. Wo fängt man an, wenn man so einen Sondermüll in seinen Serverlogs findet?

Am Besten mal dort, wo es immer so ein bisschen stinkt. Im Javascript-Bereich. Und siehe…

Netzwerkanalyse ist dein Freund

Da fällt uns sofort etwas ins Auge, was uns eine Spur zu scheinen ist:

the undefined
the undefined

Wer zum Geier sucht denn da was unter undefined? Und wieso?

Gucken wir mal, wie die Parameter dieser Anfrage aussehen – ist ja bestimmt wieder ein Ajax-Request…

really undefined
really undefined

Öhö. Ok, Verdacht auf das Übliche zu schieben, war wohl zu Unrecht.

Dann schauen wir uns die Kopfzeilen doch noch mal genauer an…

dgd
dgd

Was ist denn „dgd_scrollbox„?

Scrollen wir doch mal einen halben Kilometer in der Netzwerkanalyse nach oben und schauen uns jedes Javascript an, was das Netzwerk passiert hat (Javascript hat man grundsätzlich immer erst mal im Verdacht bei sowas).

And in the tate – there it is

dgdgdg can't you see
dgdgdg can’t you see

Da ist was mit DGD! Ha.

Suchen wir doch einfach mal nach Ajax… und wir werden fündig in einem noch völlig unklaren Zusammenhang – aber kurz nach Ablaufen des Scripts schlagen haufenweise Antworten aus dem Backend ein, die Bilder für ein Grid-Layout darstellen.

Geistesblitz

Analyse wird hier dann abgebrochen, weil wir einen Verdacht haben. Könnte es vielleicht sein, dass da ein Bild nicht gefunden wird?

Jaaaaa jetzt fragt man sich, woher diese Eingebung gekommen ist. Keine Ahnung. Kam einfach. Kennt ihr doch sicher, irgendwie „ahnt“ man was.

Und – wenn ich die Augen vorher für die Realität geöffnet hätte, wäre mir das wohl schon vorher aufgefallen – was sehen meine mittlerweile genervten und müden Augen:

white planes
white planes

Das weiße Loch da mittendrin gehört doch da nicht hin… oder… habe ich einfach kein Sinn für Ästhetik?

Falls sich jemand über das „oh oh da stimmt was mit SSL nicht“-Symbol in der Adressleiste wundert: So sieht das aus, wenn eine Seite das erste Mal nach dem Cachelöschen angezeigt wird. Ihr solltet die Seiten so niemals sehen.

Hintergrund ist, dass wir die Seiten beim erstmaligen Abruf sofort Netto anzeigen ohne die durch die Parserorgie diverser Funktionen zu jagen. Mein nächtlicher Precacher (Stichwort „Wartungsscript“) kümmert sich darum üblicherweise, wenn ich nicht grad untertägig eine Seite aus dem Cache ballern muss/möchte.

Realitätsabgleich

Looken wir doch mal im Backend nach.

Und was fällt uns da mit der Tür ins Haus?

beitragsbild not found
beitragsbild not found

Und da wir von vorherigen Recherchen wissen, dass ein Postgrid mit Bildanzeige irgendwoher sein Bild beziehen möchte, sind wir uns sicher, dass das das Corpus Delicti ist. Also setzen wir das doch mal.

suffkopp
suffkopp

Dann testen wir noch mal die Seite…

suffkopp in da info
suffkopp in da info

Und im Log… nada 🙂

Naja. Doch mehr als „nada“ – aber „undefined“ ist weg.

Fazit

Manchmal muss man sich echt einen Knoten denken und die Spurensuche aufgeben und sich einfach auf das Gefühl verlassen – dann findet man die Lösung schon.

Deshalb ist es so wichtig, dass wir stundenlang am Rechner hocken und uns die Nächte um die Ohren hauen, ohne, dass man „was sieht“ (wie meine Frau so schön sagt zum Thema nutzloses Herumgammeln).

Da habt ihr noch ein Argument, wieso das, was wir tun, gut & richtig ist.

Gern geschehen 🙂

 

SSL Verschlüsselung aktivieren – Fehlschlag

Wie es halt so läuft, ich möchte den nerdporn-blog auch per https abrufbar machen – dazu braucht es dann ein Zertifikat.

Let’s Encrypt It

Die Webseite der Yellowstones hat seit mehreren Wochen eine passende Absicherung bekommen – zusammen mit einem globalen Zusammenbruch unseres Rankings, dass sich erst nach gut einer Woche wieder erholt hatte. Bis Google eben mitbekommen wurde, dass das nur ein klitzekleiner Umzug auf einen anderen Prefix gewesen ist – „mitbekommen wurde“, weil ich über drei Ecken Google die Umleitungen von der „alten“ http-Domain auf die „neue“ https-Domain beibringen musste. Offenkundig und entgegen aller menschlichen Denkweisen sind „http://“ und „https://“ zwei völlig verschiedene Dinge 🙁

Wie dem auch sei. Ich möchte jetzt ein weiteres Zertifikat bei Let’s Encrypt anfordern und zwar über das dazu gehörende Interface unserer Synology. Da gibt es einen netten „Assistenten“, der sich um alles kümmert.

Leider schade

Tja. Leider möchte mir diesmal Let’s Encrypt ums Verreckten noch eins kein weiteres Zertifikat ausstellen. Ständig irgendwelche Fehler beim acme-Abruf – und keine Hilfe oder ein paar mehr näheres Infos weit und breit.

acme
acme

Auch in einem anderen Log tauchen nur Fehler auf, zu denen ich noch keine funktionierende Lösung finden konnte:

let's encrypt part 2
let’s encrypt part 2

Noch ohne Lösung

Diesmal kein sehr hilfreicher Beitrag: Ich habe noch keine Lösung dafür gefunden… das erste Zertifikat ging ohne Probleme aber das zweite trotz aller Iterationen diverser Dinge (Domainnamen, Anmelde-Emailadresse, Portfreigaben/-weiterleitungen etc. pp.) will es einfach nicht klappen… selbst die Fehlermeldungen sind sich nicht einig, die wechseln auch immer wieder mal.

Bisschen frustrierend…

Nachtrag

Öhmmm… peinlich… geht alles, man muss nur mal RTFM ernstnehmen…