Nur Ärger mit WordPress Cron

WordPress, fast jeder Blog benutzt es. Dabei ist es eigentlich kein gutes Stück Software, was die Qualität angeht. Das habe ich spätestens bemerkt, als das Cron System von WordPress bei Jezaja und mir versagt hat.

So ein dämliches System habe ich schon lange nicht mehr gesehen. Und die erhöhte Sicherheit durch das Docker-Backend macht es nicht leichter.

Alles fing damit an, dass geplante Posts von WordPress nicht mehr veröffentlicht wurden. Ich habe einen Post eingeplant und nachdem der geplante Zeitpunkt verstrichen war, stand in WordPress einfach nur: Verpasst.

Die Suche

Ich musste mich also auf die Suche machen, woran das geplante Posten scheitert. Die erste Vermutung: Ich habe zu wenige Besucher. Das Cron-System von WordPress baut darauf auf, dass jemand den Blog besucht und dadurch das System ausgeführt werden kann. Keine Besucher, kein Cron-Systemstart.

Also auf dem Server einen (Linux) Cron eingerichtet, welcher im 15 Minuten Abstand den WordPress Cron startet. Laut dem Plugin Cron Protokoll klappte das auch prima. Also der Aufruf. Gepostet wurde trotzdem nichts nach Plan.

Die Ursache

Ich musste weiterforschen und stellte fest – curl macht Probleme. Curl kann keine Verbindung zu den auszuführenden Scripten herstellen. Die Ursache? WordPress kommt nicht auf die Idee das Script einfach direkt aufzurufen – also script.php – sondern den Aufruf einmal durch das komplette Internet zu jagen – https://eXeler0n.de/script.php.

Diese Variante funktioniert sicher bei vielen DAUs besser, als die direkte, bei meiner Serverkonfiguration mit Docker und nginx Proxy mit Let’s encrypt ist es aber suboptimal. Der nginx Proxy war nicht so begeistert, dass etwas aus dem Container von außen mit sich selbst kommunizieren will und hat die Anfrage blockiert.

Die Lösung

Die Lösung? WordPress anzupassen ist hier etwas schwierig, also passe ich den Container an. Anfragen, welche aus dem Container an die Domain des Containers gestellt werden, biege ich nun einfach intern wieder auf den Container zurück. Dadurch gehen sie gar nicht erst durch den Proxy und können nicht blockiert werden.

Sollte jemand das Problem auch haben, fügt einfach in die docker-compose.yml folgende Konfiguration im wordpress Teil ein:

extra_hosts:
    - "domain.tdl:172.8.0.x"

Die IP ist die IP deines nginx Proxys. domain.tdl logischerweise deine Domain. Dann noch den Container neu starten und es sollte gehen.

Fazit

Das Cron-System von WordPress ist nicht gerade die beste Art der Implementierung. Das zieht sich auch durch das ganze WordPress System. WordPress ist so programmiert, dass es auf den gängigen Konfigurationen problemlos funktioniert und dabei flexibel bleibt. Dadurch ist es leider auch sehr anfällig, da die Sicherheit etwas zurückstehen muss.

Eventuell probiere ich mich doch mal an Ghost aus…

Bleibt fluffig!

Schreibe einen Kommentar