Andy's Blog » » Apache, PHP, suexec, FastCGI配置

Apache, PHP, suexec, FastCGI配置

[FASTCGI] Apache, PHP, suexec and FastCGI
Miguel Saturnino mags at oniduo.pt
Mon Mar 7 18:35:34 EST 2005

* Previous message: [FASTCGI] Multi-threaded FastCGI servers
* Next message: [FASTCGI] Apache, PHP, suexec and FastCGI
* Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]

Hi all!

I'm trying to get PHP+SuExec+FastCGI to work with Apache (so that PHP
runs with the user's permissions and not the Web Server's permissions)
with no luck so far...

I've build Apache with suexec support, installed mod_fastgi and built
php as fast-cgi:

root at furao # /usr/local/bin/phpfcgi -v
PHP 4.3.10 (cgi-fcgi) (built: Mar 7 2005 20:49:09)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

My httpd.conf:

(...)
   LoadModule fastcgi_module     libexec/apache/mod_fastcgi.so
   (...)
   AddModule mod_fastcgi.c
   (...)
   <virtualhost test.pt>
      User miguel
      Group miguel
      ServerAdmin mags at oniduo.pt
      DocumentRoot /usr/home/miguel/httpdocs/test.pt
      ServerName test.pt
      ErrorLog logs/test.pt-error_log
      CustomLog logs/test.pt-access_log common
   </virtualhost>

   FastCgiWrapper /usr/local/sbin/suexec
   FastCgiServer /usr/home/miguel/httpdocs/encontra-me.org/cgi-bin/php \
      -user www -group www
   AddHandler php-fastcgi .php
   <location /cgi-bin/php>
      SetHandler fastcgi-script
   </location>
   Action php-fastcgi /cgi-bin/php
   AddType application/x-httpd-php .php
root at furao # ls -l /home/miguel/httpdocs/encontra-me.org/cgi-bin/php
   -rwxr-xr-x  1 miguel  miguel  128  7 Mar 20:27
    /home/miguel/httpdocs/encontra-me.org/cgi-bin/php
root at furao # more /home/miguel/httpdocs/encontra-me.org/cgi-bin/php
   #!/bin/sh
   PHPRC="/usr/local/etc/php.ini"
   export PHPRC
   PHP_FCGI_CHILDREN=4
   export PHP_FCGI_CHILDREN
   exec /usr/local/bin/phpfcgi

Apache error log:

root at furao # tail /var/log/httpd-error.log

(...)
[Mon Mar 7 23:10:45 2005] [notice] SIGUSR1 received. Doing graceful
restart
Warning: User directive in requires SUEXEC wrapper.
Warning: Group directive in
requires SUEXEC wrapper.
[Mon Mar 7 23:10:45 2005] [alert] httpd: Could not determine the server's
fully qualified domain name, using 127.0.0.1 for ServerName
[Mon Mar 7 23:10:45 2005] [notice] FastCGI: wrapper mechanism enabled
(wrapper: /usr/local/sbin/suexec)
[Mon Mar 7 23:10:45 2005] [notice] FastCGI: process manager initialized
(pid 10101)
[Mon Mar 7 23:10:46 2005] [notice] Apache/1.3.33 (Unix) mod_fastcgi/2.4.2
configured -- resuming normal operations
[Mon Mar 7 23:10:46 2005] [notice] Accept mutex: flock (Default: flock)

Now, when I try to access a PHP web page I get a 403 Forbiden Error (even if
the file doesn't exist) and the request URL is changed from abc.php to
/cgi-bin/php/abc.php. For example, if I try to acess http://test.pt/phpinfo.php
I get this error message:
Not Found
The requested URL /cgi-bin/php/phpinfo.php was not found on this
server.
Apache/1.3.33 Server at test.pt Port 80

What am I doing wrong?

TIA!

Regards,

--
Miguel Saturnino

PHP4/PHP5 + mod_fastcgi + suexec + Apache2 auf Debian Sarge utorial/Howto

Ziel ist es PHP Scripte auf auf einem Debian Sarge per suexec2 (mod_suexec) und Fastcgi (mod_fastcgi) im Apachen2 auszuf黨ren. Die meisten Installationen beruhen darauf das PHP als Modul in den Apachen eingebunden wird, das hat allerdings folgende Nachteile:
- alle PHP Scripte werden immer unter dem Nutzer des Apachen ausgef黨rt (bei Debian www-data)
- PHP4 ist nicht Threadsafe und somit nicht mit dem apache2-mpm-worker benutzt werden kann, sondern nur mit dem apache2-mpm-prefork, wodurch man eine wesentliche Erneuerung/Verbesserung des Apache2 verliert.

Jetzt kommt mod_fastcgi ins Spiel, mod_fastcgi ist Threadsafe und somit kann apache2-mpm-worker benutzt werden welches gro遝 Geschwindigkeit/Performance Vorteile f黵 den Apachen verspricht. Per suexec kann f黵 jeden Vhost ein neuer Benutzer angegeben werden unter dem mod_fastcgi laufen soll. D.h. keine Probleme mit dem verschiedenen FTP Nutzern und Dateiberechtigungen. ;-)

Als erstes updaten wir mal unsere "/etc/apt/sources.list", da Debian Sarge offiziell keine PHP5 Pakete enth鋖t. Aber Vorsicht, dies sind keine offiziellen Debian Quellen auch wenn von einem Debian Entwickler vertrieben....

deb http://people.debian.org/~dexter all sarge
deb-src http://people.debian.org/~dexter all sarge

Jetzt geht es ans Installieren, ich benutze PHP5.1 allerdings kann auch jede andere Version noch zus鋞zlich dazu Installiert werden, da per Vhost und Dateiendung jeweils ein anderes PHP-Binary benutzt werden kann.

apt-get install libapache2-mod-fastcgi apache2-mpm-worker

Achtung, das entfernt libapache2-mod-php?, da wie schon geschrieben PHP nicht Threadsafe ist.

apt-get install php5.1 php5.1-common php5.1-fcgi php5.1-curl php5.1-exif php5.1-ftp php5.1-gd php5.1-gettext php5.1-mysql php5.1-sqlite php5.1-mbstring php5.1-openssl php5.1-pdo php5.1-session

Welche PHP Module man ben鰐igt ist nat黵lich jedem selbst 黚erlassen, wichtig ist php5.1-fcgi php5.1 und php5.1-common.

Da suexec nicht mit UID und GID unter 100 klar kommt und richtige Benutzer/Gruppen Namen ben鰐igt legen wir jetzt eine Benutzer und eine Gruppe an. Alternativ kann auch libnss-mysql zu Rate gezogen werden, wenn z.B. die Nutzer und Gruppen aus einer mySQL Datenbank bezogen werden (wie bei Syscp). Ich benutze als Beispiel jetzt den Benutzer web der, der Gruppe web angeh鰎t. F黵 jeden Vhost sollte sp鋞er ein anderer Benutzer angelegt werden.

addgroup --gid 9000 web
adduser --no-create-home --uid 9000 --ingroup web --shell /bin/false --disabled-password web

Soweit zu gut, jetzt werden die ben鰐igten Apache Module Konfiguriert und eingeschaltet.

a2enmod suexec
a2enmod actions
a2enmod fastcgi

Jetzt geht es an die Konfiguration von mod_fastcgi. Die Datei "/etc/apache2/mods-available/fastcgi.conf" sollte diesen Inhalt aufweisen...


FastCgiIpcDir /var/lib/apache2/fastcgi
FastCgiWrapper /usr/lib/apache2/suexec2

AddHandler php5-fastcgi .php


SetHandler fastcgi-script
Options +ExecCGI

Action php5-fastcgi /cgi-bin/php5-fcgi-starter
AddType application/x-httpd-php .php5

Ich denke die Konfiguration ist f黵 einigerma遝n erfahrene Apache Benutzer nicht schwer zu Verstehen. Jetzt Konfigurieren wir unseren ersten VHOST.

<virtualhost IP:80>
        ServerAdmin [email protected]
        ServerName domain.de
        ServerAlias www.domain.de

        DocumentRoot /var/www/test.m2studio.de/htdocs
        DirectoryIndex index.php

        SuexecUserGroup web web

        <directory /var/www/domain.de/htdocs>
                Options FollowSymLinks
                AllowOverride AuthConfig
                Order allow,deny
                allow from all
        </directory>

        ScriptAlias /cgi-bin/ /var/www/php-fcgi-scripts/domain.de/
        <directory "/var/www/php-fcgi-scripts/domain.de">
                AllowOverride None
                Options +ExecCGI -MultiViews -Indexes
                Order allow,deny
                Allow from all
        </directory>
      
        LogLevel warn
        CustomLog /var/log/apache2/domain.de.log
</virtualhost>

Jetzt geht es an das anlegen und vergeben der Berechtigungen f黵 die ben鰐igten Verzeichnisse und Dateien.

cd /var/www/
mkdir domain.de
chown root:root domain.de
cd domain.de
mkdir htdocs
chown web:www-data htdocs
mkdir conf
chown root:root conf

Im htdocs Verzeichniss legen wir am besten einen index.php Datei mit dem Aufruf der Funktion "phpinfo" zum sp鋞eren Testen an. Ich lasse das htdocs Verzeichniss und alle Dateien/Verzeichnisse darin dem Benutzer web und der Gruppe www-data geh鰎en. Damit k鰊nen Dateien die Dateirechte 640 haben und Verzeichnisse die Dateirechte 750. Im conf Verzeichniss werden wir sp鋞er die php.ini anlegen, darum sollte das Verzeichnis und die Dateien darin root geh鰎en damit niemand anderes diese Dateien ver鋘dern kann.

cd /var/www
mkdir php-fcgi-scripts
chown root:root php-fcgi-scripts
cd php-fcgi-scripts
mkdir domain.de
chown web:web domain.de
cd domain.de
touch php5-fcgi-starter
chown web:web php-fcgi-starter
chmod 755 php5-fcgi-starter

Jetzt bearbeiten wir die Datei "/var/www/php-fcgi-scripts/php5-fcgi-starter", da wir dieser Datei sp鋞er das immutable Bit geben werden. Da die Datei den Benutzer und der Gruppe web geh鰎en m黶sen, sonst verweigert suexec seinen Dienst.

#!/bin/sh
PHPRC="/var/www/domain.de/conf/"
export PHPRC
PHP_FCGI_CHILDREN=2
export PHP_FCGI_CHILDREN
exec /usr/bin/php5.1-fcgi

PHPRC ist der Pfad zur "php.ini", PHP_FCGI_CHILDREN ist der Wert der zu startenen php-fcgi Prozesse. Die Zahl kann je nach beliebtheit der Domain also Hits der Domain zwischen 2-20 variieren. Hinter "exec" ist der Pfad zum PHP Binary... so k鰊nte man z.B. f黵 jeden Vhost ein anderes PHP Binary benutzen.

Jetzt setzten wir das immutable Bit, damit niemand mehr die Datei ver鋘dern kann (nicht einmal root, solange das -i Bit gesetzt ist).

chattr -V +i php-fcgi-starter

Jetzt m黶sen wir noch die php.ini Datei in dem conf Verzeichniss erstellen und am besten auch gleich das "/etc/php5.1/conf.d" Verzeichnis Symbolisch in das conf Verzeichniss linken. Damit werden dann auch die installierten PHP Module geladen, alternativ kann man nat黵lich auch die Module auf die klassiche Weise 黚er die php.ini laden. Meiner Meinung nach sollten folgende Punkte in der php.ini beachtet werden.
- openbase_dir setzen und safe_mode einschalten um den Nutzer in sein Document Root einzuschr鋘ken
- session.save_path und upload_tmp_dir richtig setzen
- disable_functions = exec, passthru, proc_open,shell_exec, system,popen evtl. hier noch phpinfo hinzuf黦en.
- register_globals off und magic_quotes_gpc aktiviert

Jetzt kann es endlich los gehen, apache neu starten und es sollte alles funktionieren. Bei Fehlern bieten folgende Dateien Anhaltspunkte "/var/log/apache2/suexec.log" und "/var/log/apache2/error.log".

Per Vhost k鰊nen jetzt beliebig verschiedene PHP Versionen und Konfigurationen benutzt werden. Vieleicht schreibe ich sp鋞er noch einmal einen Blog Eintrag dazu.

Ein Nachteil dieser Konfiguration ist das die bequeme PHP Konfiguration pro Verzeichniss per .htaccess oder Apache Conf Datei mit php_* Flags nicht mehr funktioniert. Abhifle soll das folgende PHP Modul schaffen, htscanner. Bei mir hat es leider nicht geklappt, hatte aber auf die schnelle auch keine Zeit auf Fehlersuche zu gehen.

Beim erstellen dieses Tutorials/Howtos habe ich folgende Quellen verwendet.
- http://www.debianhowto.de/doku.php/de:howtos:sarge:apache2_php-fcgi
- http://www.syscp.org/wiki/contrib/PHP-FCGI-ger

Incoming search terms:

Tags: PHP, apache, FastCGI, suexec

本文地址: http://blog.21andy.com/20071123/688.html