PLESK 9 + FastCGI + php.ini für jeden vhost

Das sieht doch sehr gut aus, dann werd ich das mal probieren und hier ein Feedback geben !

EDIT:

So ich habe es ausprobiert und es funktioniert !
 
Last edited by a moderator:
Das Skript ist ja genial- ich habe hier auch einen Server mit CentOS 5 und dasselbe Problem! Grundsätzlich funktioniert das auch alles ganz prima, so wie von Bierteufel beschrieben.

Ich hätte jetzt gerne die Domain-abhängige php.ini im Verzeichnis
Code:
/var/www/vhosts/meinedomain.de/conf
liegen.
Damit das funktioniert, habe ich den Wrapper um die fett markierten Zeilen erweitert:
Code:
#!/bin/sh
#
# Custom PHP FCGID wrapper for Plesk domains
#
 [B]A=`fgrep "$UID" /etc/passwd|cut --delimiter=: -f6`
 PHPRC=$A/conf/php.ini[/B]
 [ -f ${PHPRC} ] || PHPRC="/etc/php.ini"
 export PHPRC
 exec /usr/bin/php-cgi.app

Leider laufe ich jetzt in ein Berechtigungsproblem: Der User, der zum VHOST gehört (also jener mit der UID $UID) darf nicht in das Verzeichnis "conf" wechseln, also auch seine php.ini nicht lesen.

Den User mit in die Gruppe "psaserv" zu schmeißen, der das Verzeichnis "conf" gehört, halte ich für nicht optimal. Das Verzeichnis für alle lesbar zu machen, auch nicht. Was nun?

Hintergrund ist der, dass ich die User-/VHOST-spezifische php.ini gern mit in ins Domain-Template packen würde, damit Plesk diese Datei beim Anlegen einer neuen Domain automatisch erzeugt.

Wie würdet ihr vorgehen?
 
Ich packe die php.ini bei mir immer ins Verzeichnis "private".
Dieses existiert im Template, der User kann darauf zugreifen und das Verzeichnis ist von ausserhalb nicht erreichbar.

Was will man mehr? :)
 
Ich packe die php.ini bei mir immer ins Verzeichnis "private".
Dieses existiert im Template, der User kann darauf zugreifen und das Verzeichnis ist von ausserhalb nicht erreichbar.

Was will man mehr? :)

Bei mir gab es im Template, also im Verzeichnis
Code:
/var/www/vhost/.skel/0
kein Verzeichnis "private". Komischerweise wurden auch Verzeichnisse, die ich manuell in das Template kopiert hatte, nicht in tatsächlich neu angelegte Websites übernommen. :confused:
Ich habe inzwischen einen anderen Weg gefunden, das Problem (leidlich elegant) zu lösen: Ich kopiere über einen Plesk-Ereignishandler die gewünschten Dateien ins Zielverzeichnis.
Ist jemand an einem genaueren Howto interessiert? Schreibe sowieso gerade die Doku... ;)

Eine Frage dazu hab ich noch: Weiter oben wird ja die Datei php-cgi kopiert und dann ersetzt. Gibts eine Möglichkeit, dass nach PHP-Updates nicht jedesmal das Kopieren und Ersetzen wiederholt werden muss?

Ergänzung:
Ich habe in der vhost.conf der Domain folgendes angegeben, um den PHP-Wrapper (auf "/usr/bin/php-cgi-wrapper") zu ändern, den Apache aufruft. Ich dachte, so könne ich das PHP-Binary unter seinem ursprünglichen Namen benutzen und hätte keine Probleme bei einem Update.
Code:
<Directory /var/www/vhosts/test.meinedomain.de/httpdocs>
        <IfModule mod_fcgid.c>
                <Files ~ (\.fcgi)>
                        SetHandler fcgid-script
                        Options +FollowSymLinks +ExecCGI
                </Files>
        </IfModule>
        <IfModule mod_fcgid.c>
        <Files ~ (\.php)>
                SetHandler fcgid-script
                FCGIWrapper /usr/bin/php-cgi-wrapper .php
                Options +ExecCGI
                allow from all
        </Files>
        </IfModule>
                Options -Includes -ExecCGI
        </Directory>
Jetzt muss ich natürlich noch im Wrapper sagen, dass er das originale PHP aufrufen soll. Anschließend Plesk die Konfiguration neu einlesen lassen und sicherheitshalber den Apachen mal neu gestartet.
Leider bekomme ich beim Aufruf einer Seite nun einen "500 internal server error", und im Logfile von suexec /var/log/httpd/suexec_log folgende Meldungen:
Code:
[2009-11-06 17:13:16]: uid: (10002/test02) gid: (2523/2523) cmd: php-cgi-wrapper
[2009-11-06 17:13:16]: command not in docroot (/usr/bin/php-cgi-wrapper)
Inzwischen habe ich herausbekommen, woher die Fehlermeldung kommt: Der Pfad zu php-cgi und der Name "php-cgi" werden aus der Plesk-Konfigurationsdatei
Code:
 /etc/psa/psa.conf
gelesen.
Ein Ändern der passenden Direktive in der Datei in ein
Code:
CGI_PHP_BIN /usr/bin/php-cgi-wrapper
und ein anschließender Neustart von Plesk bestätigte meine Vermutung: Der "500 Internal Server Error" war sofort Vergangenheit! :)
Jetzt stellt sich die nächste Frage: Habe ich jetzt den Teufel mit dem Beezlebub ausgetrieben, weil bei einem Plesk-Update /etc/psa/psa.conf wieder überschrieben wird?
 
Last edited by a moderator:
Hallo Leute,

ich möchte Euch eine neue kleine Erkenntnis nicht vorenthalten.

Hier wurde ja auch danach gefragt:

http://www.sebastian.himberger.de/b...ni-and-url-rewriting-in-plesk-9-with-fastcgi/

Code:
So, do you know how to upgrade Plesk 9.2.1 to have a version greater than “psa-mod_fcgid-1.10-3″

1. Von http://www.atomicorp.com/channels/atomic/centos/5EL/x86_64/RPMS/mod_fcgid-2.3.4-2.el5.art.x86_64.rpm das mod_fcgid-2.3.4-2.el5.art.x86_64.rpm für CENTOS 5.4 gezogen
2. Mittels rpm -Uvh --force installiert & das von PSA ersetzt
3. entsprechende conf angepasst
4. Das neue mod_fcgid.so wird geladen & verwendet
5. Apache nochmal neu gestartet
 
Also, ich glaub, ich bin zu blöd.

Ich habe ein openSuse 11.1 mit Plesk 9.2.3 im Einsatz.

Ich habe folgende Varianten probiert:

Code:
<Directory "/var/www/vhosts/${yourvhost}/httpdocs>"
        <IfModule mod_fcgid.c>
                <Files ~ (\.fcgi)>
                        SetHandler fcgid-script
                        Options +FollowSymLinks +ExecCGI
                </Files>
        </IfModule>
        <IfModule mod_fcgid.c>
        <Files ~ (\.php)>
                SetHandler fcgid-script
                FCGIWrapper "/usr/bin/php-cgi5 -c /var/www/vhosts/${yourvhost}/conf" .php
                Options +ExecCGI
                allow from all
        </Files>
        </IfModule>
                Options -Includes -ExecCGI
</Directory>

sowie

Code:
<Directory "/var/www/vhosts/${yourvhost}/httpdocs">
  <Files ~ (\.php)>
    FCGIWrapper "/usr/bin/php-cgi5 -c /var/www/vhosts/${yourvhost}/conf"  .php
    Options All
  </Files>
</Directory>

ein reload per
Code:
/usr/local/psa/admin/sbin/websrvmng -a -v
und ein anschließender Restart per
Code:
/etc/init.d/apache2 restart

bringt keine Fehlermeldungen.

Allerdings wird mir per phpinfo() immer noch
Code:
Server API 	                                CGI/FastCGI
Virtual Directory Support 	                disabled
Configuration File (php.ini) Path 	        /etc/php5/fastcgi
Loaded Configuration File 	                /etc/php5/fastcgi/php.ini
Scan this dir for additional .ini files 	/etc/php5/conf.d
ausgespuckt.

In den Webhostingeinstellungen wird php als FastCGI geladen.

Meine httpd.include

Code:
# /srv/www/vhosts/${yourvhost}/conf/vhost.conf
# /srv/www/vhosts/${yourvhost}/conf/vhost_ssl.conf
# /srv/www/vhosts/${yourvhost}/subdomains/<subdomain-name>/conf/vhost.conf

<IfModule mod_ssl.c>

<VirtualHost 11.111.111.11:443>
	ServerName   ${yourvhost}:443
	ServerAlias  www.${yourvhost}
	UseCanonicalName Off
		SuexecUserGroup         ${yourvhost} psacln
	ServerAdmin  xxxx
	DocumentRoot /srv/www/vhosts/${yourvhost}/httpsdocs
	CustomLog  /srv/www/vhosts/${yourvhost}/statistics/logs/access_ssl_log plesklog
	ErrorLog  /srv/www/vhosts/${yourvhost}/statistics/logs/error_log
<IfModule mod_userdir.c>
	UserDir /srv/www/vhosts/${yourvhost}/web_users
</IfModule>
	ScriptAlias  /cgi-bin/ /srv/www/vhosts/${yourvhost}/cgi-bin/
	Alias  /plesk-stat /srv/www/vhosts/${yourvhost}/statistics/
	<Location  /plesk-stat/>
		Options +Indexes
	</Location>
	<Location  /plesk-stat/logs/>
		Require valid-user
	</Location>
	Alias  /webstat /srv/www/vhosts/${yourvhost}/statistics/webstat
	Alias  /webstat-ssl /srv/www/vhosts/${yourvhost}/statistics/webstat-ssl
	Alias  /ftpstat /srv/www/vhosts/${yourvhost}/statistics/ftpstat
	Alias  /anon_ftpstat /srv/www/vhosts/${yourvhost}/statistics/anon_ftpstat
	Alias  /awstats-icon /usr/share/apache2/icons/awstats
	SSLEngine on
	SSLVerifyClient none
	SSLCertificateFile /usr/local/psa/var/certificates/certKH0YhHh
	<Directory /srv/www/vhosts/${yourvhost}/httpsdocs>
	<IfModule mod_perl.c>
	<Files ~ (\.pl$)>
		SetHandler perl-script
		PerlHandler ModPerl::Registry
		Options ExecCGI
		allow from all
		PerlSendHeader On
	</Files>
	</IfModule>
	<IfModule mod_python.c>
	<Files ~ (\.py$)>
		SetHandler python-program
		PythonHandler	mod_python.cgihandler
	</Files>
	</IfModule>
	<IfModule mod_fcgid.c>
		<Files ~ (\.fcgi)>
			SetHandler fcgid-script
			Options +FollowSymLinks +ExecCGI
		</Files>
	</IfModule>
	<IfModule mod_fcgid.c>
	<Files ~ (\.php)>
		SetHandler fcgid-script
		FCGIWrapper /usr/bin/php-cgi5 .php
		Options +ExecCGI
		allow from all
	</Files>
	</IfModule>
		SSLRequireSSL
		Options -Includes +ExecCGI
	</Directory>
	<Directory "/srv/www/vhosts/${yourvhost}/statistics">
		AuthType Basic
		AuthName "Domainstatistiken"
		AuthUserFile /srv/www/vhosts/${yourvhost}/pd/d..httpsdocs@plesk-stat
		require  valid-user
	</Directory>
	Alias "/error_docs" "/srv/www/vhosts/${yourvhost}/error_docs"
	ErrorDocument 400 /error_docs/bad_request.html
	ErrorDocument 401 /error_docs/unauthorized.html
	ErrorDocument 403 /error_docs/forbidden.html
	ErrorDocument 404 /error_docs/not_found.html
	ErrorDocument 500 /error_docs/internal_server_error.html
	ErrorDocument 405 /error_docs/method_not_allowed.html
	ErrorDocument 406 /error_docs/not_acceptable.html
	ErrorDocument 407 /error_docs/proxy_authentication_required.html
	ErrorDocument 412 /error_docs/precondition_failed.html
	ErrorDocument 415 /error_docs/unsupported_media_type.html
	ErrorDocument 501 /error_docs/not_implemented.html
	ErrorDocument 502 /error_docs/bad_gateway.html
</VirtualHost>

</IfModule>

<VirtualHost 11.111.111.11:80>
	ServerName   ${yourvhost}:80
	ServerAlias  www.${yourvhost}
	UseCanonicalName Off
	SuexecUserGroup         ${yourvhost} psacln
	ServerAdmin  "xxx"
	DocumentRoot /srv/www/vhosts/${yourvhost}/httpdocs
	CustomLog  /srv/www/vhosts/${yourvhost}/statistics/logs/access_log plesklog
	ErrorLog  /srv/www/vhosts/${yourvhost}/statistics/logs/error_log
<IfModule mod_userdir.c>
	UserDir /srv/www/vhosts/${yourvhost}/web_users
</IfModule>
	ScriptAlias  /cgi-bin/ /srv/www/vhosts/${yourvhost}/cgi-bin/
	Redirect permanent /plesk-stat https://${yourvhost}/plesk-stat
	Redirect permanent /webstat https://${yourvhost}/webstat
	Redirect permanent /webstat-ssl https://${yourvhost}/webstat-ssl
	Redirect permanent /ftpstat https://${yourvhost}/ftpstat
	Redirect permanent /anon_ftpstat https://${yourvhost}/anon_ftpstat
	Redirect permanent /awstats-icon https://${yourvhost}/awstats-icon
	<IfModule mod_ssl.c>
		SSLEngine off
	</IfModule>
	<Directory /srv/www/vhosts/${yourvhost}/httpdocs>
	<IfModule mod_perl.c>
	<Files ~ (\.pl$)>
		SetHandler perl-script
		PerlHandler ModPerl::Registry
		Options ExecCGI
		allow from all
		PerlSendHeader On
	</Files>
	</IfModule>
	<IfModule mod_python.c>
	<Files ~ (\.py$)>
		SetHandler python-program
		PythonHandler	mod_python.cgihandler
	</Files>
	</IfModule>
	<IfModule mod_fcgid.c>
		<Files ~ (\.fcgi)>
			SetHandler fcgid-script
			Options +FollowSymLinks +ExecCGI
		</Files>
	</IfModule>
	<IfModule mod_fcgid.c>
	<Files ~ (\.php)>
		SetHandler fcgid-script
		FCGIWrapper /usr/bin/php-cgi5 .php
		Options +ExecCGI
		allow from all
	</Files>
	</IfModule>
		Options -Includes +ExecCGI
	</Directory>
	Alias "/error_docs" "/srv/www/vhosts/${yourvhost}/error_docs"
	ErrorDocument 400 /error_docs/bad_request.html
	ErrorDocument 401 /error_docs/unauthorized.html
	ErrorDocument 403 /error_docs/forbidden.html
	ErrorDocument 404 /error_docs/not_found.html
	ErrorDocument 500 /error_docs/internal_server_error.html
	ErrorDocument 405 /error_docs/method_not_allowed.html
	ErrorDocument 406 /error_docs/not_acceptable.html
	ErrorDocument 407 /error_docs/proxy_authentication_required.html
	ErrorDocument 412 /error_docs/precondition_failed.html
	ErrorDocument 415 /error_docs/unsupported_media_type.html
	ErrorDocument 501 /error_docs/not_implemented.html
	ErrorDocument 502 /error_docs/bad_gateway.html
	Include /srv/www/vhosts/${yourvhost}/conf/vhost.conf
</VirtualHost>

Was nun? Jemand ne Idee?

Greetz

fluse
 
deiner http.include nach zu urteilen, sieht deine Verzeichnisstruktur so aus:
/srv/www/vhosts/...

und nicht /var/www/vhosts/.... wie du es in deinen angepassten Dateien verwendet hast
 
Ich muss mich leider selbst zitieren, denn...

Jetzt stellt sich die nächste Frage: Habe ich jetzt den Teufel mit dem Beezlebub ausgetrieben, weil bei einem Plesk-Update /etc/psa/psa.conf wieder überschrieben wird?

...leider ist die fettgeschriebene Befürchtung wahrgeworden: Meine /etc/psa/psa.conf wurde beim Update auf Plesk 9.3.0 "schön" überschrieben, und ich durfte den PHP-Wrapper wieder von Hand eintragen/ändern.

Hat jemand eine Ahnung, woher die Inhalte von /etc/psa/psa.conf stammen?
Das wird doch wohl nicht ernsthaft beim Update einfach so überschrieben, ohne dass man darauf Einfluß nehmen könnte..? :confused:
 
ich mache es recht ähnlich. Da bei einem Update von Plesk etliche Tests nötig sind, sehe ich keine Problem die eine Zeile zurückzusetzen. Man könnte sich auch ein Script schreiben, welches als cron mittels diff vergleicht und die Zeile ändert. Halte ich aber für unnötig.
 
Wie übernehme ich das nun fürs skel?

Zumindest bei meinen Systemen (CentOS 5) wurden Dateien und Verzeichnisse nur dann vom Skeleton in neu erzeugte Domains übernommen, wenn sie unterhalb von von "httpdocs" lagen. Also nur Elemente, die im "Skel-Verzeichnis" unterhalb von
Code:
/var/www/vhost/.skel/0/httpdocs
lagen.
Ich habe das Problem über einen Plesk-Ereignishandler gelöst, siehe meinen Beitrag weiter oben.
 
unter Plesk 9.5.2 gibt es nun eine eigene wrapper Datei unter
Code:
/var/www/cgi-bin/cgi_wrapper/cgri_wrapper
welche nun modifiziert werden kann.
Damit entfallen die Anpassungen mit der vhost.conf
und die psa.conf bleibt ebenfalls gleich.
 
Kleine Korrektur:

Der Pfad & Datei sind:

Code:
/var/www/cgi-bin/cgi_wrapper/cgi_wrapper

Die Datei dann einfach auf:

Code:
#!/bin/sh
PHPRC="/etc/php-ini.d/php-${UID}.ini"
[ -f ${PHPRC} ] || PHPRC="/etc/php.ini"
export PHPRC 
exec /usr/bin/php-cgi

ändern.

Und dann wie gehabt unter

/etc/php-ini.d/

die passende PHP.INI (z.B.: php-10001.ini)

anlegen.
 
@Bierteufel

wenn man die cgi_wrapper datei verändert gilt es dann nicht fuer ein vhost?

hatte es damals noch ueber der vhost.conf aber seit dem update auf plesk. 9.5.2 kommt ein erro 500

laut log also "(communication error)"

da ich mehere (sub)domains besitze sollte es auch wieder so sein das jede domain wieder über seine php.ini läuft.

Wie stelle ich es am besten an?

Ich hoffe ihr könnt helfen.
 
@Bierteufel

wenn man die cgi_wrapper datei verändert gilt es dann nicht fuer ein vhost?

hatte es damals noch ueber der vhost.conf aber seit dem update auf plesk. 9.5.2 kommt ein erro 500

Kleiner Hinweis:
Die cgi_wrapper Datei liegt jetzt an anderer Stelle, siehe ein paar Posts weiter oben. Und diese gilt natürlich für alle Domains!
Ich vermute, der Error 500 kommt daher, dass Du in den vhost.conf-Dateien der bisherigen Domains ja eine Referenz auf den alten PHP-Wrapper hast, den es ja (an der alten Stelle im Dateisystem) nicht mehr gibt.
 
Back
Top