Zentraler Library-Ordner mit Zugriff über Symlink von jedem VHost

shredder01

New Member
Hallo,

ich habe einen dedizierten Server mit Suse 10.2 und Plesk 8.6.
Ich würde nun gerne an zentraler Stelle (/usr/share/php5) das Zend Framework in einem Ordner Zend deponieren und ihn von jedem VHost (die alle unter /srv/www/vhosts liegen) aus über einen Symlink erreichbar machen.
Der Symlink soll im aktuellen Fall in einem Ordner /srv/www/vhosts/meinedomain.de/library liegen.
Dem zentralen Ordner hab' ich jetzt die gleiche Gruppe zugeteilt wie sie der Ordner mit dem Symlink hat (psaserv).
Trotzdem bekomme ich beim Aufruf meiner index.php, die auf das Framework zugreift, folgende Fehlermeldung:
Code:
PHP Fatal error: require_once(): Failed opening required 'Zend/Loader.php' (include_path='/srv/www/vhosts/meinedomain.de/application:/srv/www/vhosts/meinedomain.de/library:.:.:/usr/share/php5:/usr/share/php5/PEAR:/usr/share/php5/Zend') in /srv/www/vhosts/meinedomain.de/httpdocs/index.php on line 15
Packe ich das Framework direkt in den Ordner in dem jetzt der Symlink ist funktioniert es.
Irgendwie ist da im Moment mein Blick vernebelt, um zu sehen was da das Problem ist.
Vielleicht kann mich ja jemand in die richtige Richtung stoßen.
Danke.

P.S.: Anfangs hatte ich noch ein open_basedir restriction Problem, das ich aber durch Eintragung der entsprechenden Ordner, die außerhalb des DOCUMENT_ROOT liegen, unter open_basedir in der vhost.conf beheben konnte. Also sollte es daran auch nicht mehr liegen.
 
Hm, aber das heißt ja, das es egal ob ich den Symlink drin habe oder nicht funktionieren müßte, denn im include_path hab ich den zentralen Library-Ordner ja auch schon drin. Was mir ja lustigerweise auch in der Fehlermeldung (in meinem ersten Post) bestätigt wird.
Verstehe ich nicht. Und Du meinst ein Rechte- bzw. Besitzproblem sollte es nicht sein?
 
Nicht ganz, den wenn FollowSymlinks aus ist geht die ganze Sache nämlich nicht. Außerdem spart man sich das haufenweise Setzen von Symlinks. Es ist so einfach eleganter :-)
 
Hm, ich hab in der vhost.conf folgendes zu stehen:
Code:
<Directory /srv/www/vhosts/meinedomain.de/httpdocs>
<IfModule sapi_apache2.c>
php_admin_value open_basedir "/srv/www/vhosts/meinedomain.de:/usr/share/php5/Zend"
</IfModule>
<IfModule mod_php5.c>
php_admin_value open_basedir "/srv/www/vhosts/meinedomain.de:/usr/share/php5/Zend"
</IfModule>
Options +Includes +FollowSymLinks
</Directory>

Aber wozu ist das FollowSymLinks denn überhaupt nötig, wenn den entsprechenden Ordner schon im include_path hab?
Wo liegt mein Denkfehler?
 
Steht vielleicht in der globalen conf
Code:
# forbid access to the entire filesystem by default
<Directory />
   Options None
   AllowOverride None
   Order deny,allow
   Deny from all
</Directory>
und die Freigabe des Library-Ordners nur im Kontext eines anderen vHosts?
 
Danke für die Hilfe bisher.
Allerdings bin ich im Moment noch kein Stück weitergekommen ... warum auch immer.
Ich hab jetzt noch die entsprechende vhost.conf um die Zeile "AllowOverride All" erweitert (vor meinen Options nach dem IfModule).
Außerdem hab ich jetzt den Symlink, da er ja wie ihr gesagt habt eigentlich nicht nötig ist, entfernt. Und der Ordner Zend in /usr/share/php5 hat jetzt wieder als Besitzer und Gruppe root und die Rechte 755.
Ich bekomme aber immer noch dieselbe Fehlermeldung (siehe erstes Post).
Um noch mal aufzuzählen was schon gesetzt ist:
1. /usr/share/php5/Zend steht in der php.ini im include_path
2. außerdem hab ich zur Probe (keine Ahnung ob es nötig wäre) denselben Pfad auch mit in open_basedir in der vhost.conf angegeben
3. AllowOverride All ist in der vhost.conf gesetzt
4. nach jeder Änderung der vhost.conf hab ich
Code:
/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=meinedomain.de
und
Code:
/etc/init.d/apache2 reload
aufgerufen

Trotzdem ist der Zend Ordner nur erreichbar, wenn ich ihn direkt unter /srv/www/vhosts/meinedomain.de/library deponiere. Wenn er da nichts findet bekomme ich die Fehlermeldung. Dabei werden bei Aufruf der index.php der Standard-include_path sowie zwei zusätzliche Pfade (/srv/www/vhosts/meinedomain.de/application und /srv/www/vhosts/meinedomain.de/library) bekannt gemacht. Der Standardpfad wird mit get_include_path geholt und dann zusammen mit den anderen beiden mit set_include_path gesetzt.
Und wie gesagt die Fehlermeldung bestätigt ja auch das diese Pfade alle bekannt sind.
Hat noch jemand 'ne Idee was ich noch übersehen haben könnte?
 
Hallo Shredder01,

die Berechtigungen wirken nur in dem Kontext, in dem sie gesetzt sind, im konkreten Fall also in Deinem vHost "meinedomain.de".

Entweder Du gestattest dort (und in allen anderen relevanten vHosts) den Zugriff auf das Verzeichnis - oder eben global (d.H. außerhalb aller vHost-Container).
 
Hm, irgendwie stehe ich grad auf'm Schlauch. Im Augenblick kann ich irgendwie nicht folgen was das jetzt bedeutet.
Den include_path zu /usr/share/php5/Zend hab ich in der php.ini gesetzt ... der mußte also global, für alle VHosts gelten ... richtig?
Bestimmte include_path Erweiterungen, die ich im Script setze gelten nur für die Application ... was ja auch so gewünscht ist.
Open_basedir hab ich in der vhost.conf von meinedomain.de gesetzt ... gilt also nur für meinedomain.de ... was ja auch beabsichtigt ist.
"AllowOverride All" hab ich auch in der vhost.conf von meinedomain.de gesetzt, d.h. es gilt auch nur für diesen VHost. Is' ja auch soweit richtig.
Aber was sagt das jetzt für die Benutzung von Dateien, die außerhalb des DOCUMENT_ROOT liegen.
Gelten die Regeln aus der vhost.conf nur für alle Ordner unterhalb des VHost-Ordners?
Mein Problem ist, das ich immer noch nicht so wirklich verstehe warum es nicht läuft. Eigentlich ist das doch ein ganz normales Szenario: Ich will von einem VHost-Ordner aus auf etwas zugreifen was im include_path liegt.
Was eigentlich möglich sein sollte. Nur im Moment bei mir nicht :rolleyes:.
 
Last edited by a moderator:
P.S.: Hm, ich hab' mir eben noch mal die Beschreibung zu safe_mode_include_dir, was Spin-Doc erwähnt hatte, durchgelesen. Sollte ich etwa den entsprechenden Pfad/Ordner hier eintragen müssen, da safe_mode bei mir ja auf "On" steht?
Tja gesagt, getan ... ich hab jetzt in der entsprechenden vhost.conf die Einträge für die beiden Module noch jeweils um die Zeile
Code:
php_admin_value safe_mode_include_dir "/usr/share/php5/Zend"
ergänzt und siehe da es funktioniert :).
Kleine Ursache, große Wirkung bzw. so kann man sich selber ein Bein stellen :D.
Vielen Dank nochmal für alle Tipps.

P.P.S.: Ich hab' eben grad gelesen, das safe_mode=On nicht mehr sinnvoll wäre. Ist das so und welche Maßnahmen sollte man stattdessen treffen?
 
Siehste mal, der Fehler wird die nicht mehr passieren. Ein Wink in die richtige Richtung, und wenn das klappt, ist das Erfolgserlebnis groß. Besser als wenn man es vorgekaut serviert bekommt :-)
 
Ja auf alle Fälle ist das befriedigender. Allerdings würde ich nicht unbedingt unterschreiben wollen, das es mir nicht nochmal passiert ;). Denn das Problem ist, das ich mich viel zu selten bzw. in zu großen Abständen mit Serverfragen beschäftigen muß. Tja und nach einiger Zeit der Beschäftigung mit anderen Dingen verdrängt man leider auch viel.
Aber z.Z. beschäftigt mich grad die Frage wie ich eine zentrale Lagerung von verschiedenen Zend Framework Versionen plus individuellem Zugang zu jeweils bloß einer Version von einem VHost aus nur mit der include_path Sache lösen kann. Ich befürchte irgendwie das er dann in allen Versionsordnern sucht, weil ja noch der Standard-include_path /usr/share/php5 (worin ja alle Versionsordner liegen würden) besteht.
Na mal schauen.
 
Back
Top