Webserver: chrooted PHP gibt beim Versuch, mysql zu erreichen, den Fehler mysql.sock aus

8

Hey Leute, ich habe einen Ubuntu-Webserver mit Nginx + PHP5-FPM konfiguriert. Ich habe eine Chroot-Umgebung (mit Jailkit) erstellt, in die ich meine Entwickler hineinwerfe, von wo aus sie ihre Testanwendungen entwickeln können.

Chroot-Gefängnis: / home / jail

Nginx und PHP5-FPM werden außerhalb der Chroot-Umgebung ausgeführt, sind jedoch so konfiguriert, dass sie mit Websites in der Chroot-Umgebung funktionieren.

Bisher stellen Nginx und PHP5-FPM Dateien ohne Probleme bereit , mit Ausnahme der folgenden: Beim Versuch, eine Verbindung zu MySQL herzustellen, wird folgende Fehlermeldung angezeigt : SQLSTATE [HY000] [2002] Über Socket kann keine Verbindung zum lokalen MySQL-Server hergestellt werden. ' /var/run/mysqld/mysqld.sock '

Ich glaube, das Problem ist darauf zurückzuführen, dass die nicht chrootierte php.ini auf mysqld.sock außerhalb der chroot-Umgebung verweist (derzeit wird tatsächlich die MySQL-Standardeinstellung verwendet).

Meine Frage ist, wie kann ich PHP so konfigurieren, dass es über Loopback oder ähnliches auf MySQL zugreift? (Fand das als Vorschlag in einem Google-Ergebnis, aber ohne Anweisungen)

Oder wenn mir eine andere offensichtliche Einstellung fehlt, lassen Sie es mich wissen. Wenn es eine Option zum Erstellen eines Hardlinks gibt (der auch dann verfügbar bleibt, wenn MySQL neu gestartet wird), wäre dies ebenfalls praktisch.

Jon L.
quelle

Antworten:

9

Ich habe mein eigenes Problem gelöst. Jailkit konnte keinen Hardlink-Verweis auf mysqld.sock erstellen, da Ubuntu / var / run in tmpfs speichert, was dem System als separate Partition erscheint (was die Hardlink-Funktionalität beeinträchtigt). Ich mounte jetzt stattdessen / var / run / mysqld im Gefängnis, wie folgt: mount --bind /var/run/mysqld /home/jail/var/run/mysqld/

Jon L.
quelle
Ist es möglich, dies beim Erstellen des Gefängnisses zu skripten?
gegangen
4

Wie wäre es als hostWert zu verwenden 127.0.0.1? Es wird eine TCP-Verbindung verwendet, die keinen Socket schreibt (im Gegensatz zum localhostWert unter Unix).

pevik
quelle
3
Verschwendung von Systemressourcen ohne Nutzen.
Joó Ádám
1

Das erneute Montieren mit --bindfür die Chroot scheint ein praktikabler Vorschlag zu sein. IMHO-Verbindung mit MySQL über einen TCP-Socket (127.0.0.1) scheint jedoch sauberer, sicherer und weniger fehleranfällig zu sein.

Der Grund, warum ich das sage, ist, dass verschiedene Quellen, einschließlich http://blog.dispatched.ch/postfix-and-mysql-debian/ und /programming/11389214/postfix-cant-connect-with-mysql -table-when-using-unix-socket-postmap-success schlägt vor, der fstab hinzuzufügen:

 /var/run/mysqld /home/jail/var/run/mysqld bind defaults,bind 0 0

Seien Sie vorsichtig damit: Debian bereinigt / var / run zumindest beim Neustart, sodass die Bereitstellung beim Start fehlschlägt, ebenso wie Ihr Dienst. Natürlich könnten Sie stattdessen verwenden:

 /var/run /home/jail/var/run bind defaults,bind 0 0
Cedric Knight
quelle
Klappt wunderbar. Aber wirklich ... gibt es keine einfachere Lösung? Warum braucht MySQL überhaupt einen Socket, wenn die Kommunikation überhaupt über localhost: 3306 läuft?
BurninLeo
Okay, ich habe herausgefunden, dass es einfacher ist ( serverfault.com/a/337844/100194 ). Verwenden Sie stattdessen einfach eine IP-Adresse ( 127.0.0.1) als MySQL-Host in mysqli_connect () localhost. Dies erfordert etwas mehr Ressourcen, aber der Unterschied sollte vernachlässigbar sein.
BurninLeo
0

Sie können den Socket von MySQL über die Socket-Option in Ihrer my.cnf-Datei steuern.

socket = /home/jail/var/run/mysqld/mysqld.sock
Hobodave
quelle
1
Das ist ein gültiger Vorschlag, aber ich mache mir Sorgen, dass / home / jail "volatil" sein könnte. Vorschläge zum Ändern von /etc/jailkit/jk_init.ini, um Jailkit zu zwingen, einen Hardlink zur Datei mysqld.sock zu erstellen, oder zu einer anderen Jailkit-kompatiblen Lösung, die den MySQL-Server nicht gefährdet, wenn sich das Gefängnis befindet (zum Beispiel) komplett gelöscht und neu aufgebaut?
Jon L.