gallery blog

Apache2 suExec/fastcgi nach Lighttpd Teil 2

bestehende fast-cgi/suExec Konfiguration übernehmen

Als erstes: in der Konfiguration den Port auf 81 setzen.. dann können wir schonmal parallel arbeiten. Um nicht zuviel umstellen zu müßen, nehme ich keine simple-vhosts und Conditionals sondern setze die vhosts wie beim Apache in eigene Dateien. Eine Anleitung gibt es auf der gut sortierten Lighttpd Blog. Die Fastcgi-per User geht nach Anleitung
FastCGI Starter
Angepasst um unsere vorhandene Struktur möglichst weiter zu nutzen bedeutet das folgendes: Wir erzeugen eine Struktur unter /var/www/ die innerhalb eines fastcgi-Directorys Verzeichnisse
 
/var/www/ersteDomain.tld/
/var/www/ersteDomain.tld/docs
/var/www/ersteDomain.tld/logs
/var/www/zweiteDomain.tld/
/var/www/zweiteDomain.tld/docs
/var/www/zweiteDomain.tld/logs
...
/var/www/fastcgi/ersteDomain.tld
/var/www/fastcgi/zweiteDomain.tld
/var/www/fastcgi/startup
Jede Domain hat (mit php.ini und später den Sockets und pids zu den zugehörigen php-fcgi Prozessen) einen Ordner innerhalb des fastcgi Ordners und es gibt einen globalen startup Ordner, der alle startscripte für die php Prozesse beinhaltet. Diese werden undabhängig vom lighttpd gestartet. Das hat den Vorteil, das ein restart des Webservers nicht alle php-prozesse mitbeendet und neustartet(schneller!), Verzeichnissenamen und Usernamen sind natürlich egal und müssen an die eigene Struktur angepasst werden. Bei der vorliegenden Installation sind die entsrpechen die Usernamen dem Domainnamen nur werden "." durch "_" substituiert meineDomain.tld hat den zugehörigen Usernamen . Eine Anpassung an die Eigene Struktur ist vermutlich nötig.
  mkdir -p /var/www/fastcgi/startup
cd /var/www/fastcgi
mkdir ersteDomain.tld
chown ersteDomain_tld:ersteDomain_tld ersteDomain.tld/
mkdir zweiteDomain.tld
chown zweiteDomain_tld:zweiteDomain_tld zweiteDomain.tld/
...
chmod 750 *
Ein kleines Script was die alte in die neue Struktur übersetzt:

  cp -R ../php-fcgi-scripts/* .  
rm */php-fcgi-starter
for i in $(ls);
do USERNAME=$(echo $i | tr '.' '_');chown $USERNAME:$USERNAME $i;
done;
chmod 750 *
Kopieren der php.inis (die vorher nur von root schreibbar unter /var/www/domain.tld/conf lag
  cd /var/www/
for i in $(ls);
do cp $i/conf/php.ini /var/www/fastcgi/$i;
done;
Log-Ordner
LogOrdner müßen ggfr angepasst werden und sollten www-data:domain_tld_de gehören (damit lighty schreiben kann):
  for i in $(ls); do \  
USERNAME=$(echo $i | tr '.' '_');\
chown www-data:$USERNAME $i/logs;\
done;
Startup-Skript
Das startup-Skript startet einen PHP Prozesse für jeden vhost und wird hier domain_tld-startup.sh benammt z.B. ersteDomain_tld-startup.sh hat folgenden Inhalt:
  #!/bin/bash  
## ABSOLUTE path to the spawn-fcgi binary
SPAWNFCGI="/usr/bin/spawn-fcgi"
## ABSOLUTE path to the PHP binary
FCGIPROGRAM="/home/unserPfad/zum/php-fcgi/binary/php-fcgi"
## bind to tcp-port on localhost
FCGISOCKET="/var/www/fastcgi/ersteDomain_tld/ersteDomain_tld.socket"
## uncomment the PHPRC line, if you want to have an extra php.ini for this user
## store your custom php.ini in /var/www/fastcgi/fred/php.ini
## with an custom php.ini you can improve your security
## just set the open_basedir to the users webfolder
## Example: (add this line in you custom php.ini)
## open_basedir = /var/www/vhosts/fred/html
PHPRC="/var/www/fastcgi/ersteDomain_tld/"
## number of PHP childs to spawn in addition to the default. Minimum of 2.
## Actual childs = PHP_FCGI_CHILDREN + 1
PHP_FCGI_CHILDREN=5
## number of request server by a single php-process until is will be restarted
PHP_FCGI_MAX_REQUESTS=1000
## IP adresses where PHP should access server connections from
FCGI_WEB_SERVER_ADDRS="127.0.0.1"
# allowed environment variables sperated by spaces
ALLOWED_ENV="PATH USER"
## if this script is run as root switch to the following user
USERID=ersteDomain_tld
GROUPID=ersteDomain_tld
################## no config below this line
if test x$PHP_FCGI_CHILDREN = x; then
PHP_FCGI_CHILDREN=5 fi
export PHP_FCGI_MAX_REQUESTS
export FCGI_WEB_SERVER_ADDRS
export PHPRC
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS PHPRC"

# copy the allowed environment variables E=
for i in $ALLOWED_ENV; do
E="$E $i=${!i}"
done
# clean environment and set up a new one
env - $E $SPAWNFCGI -s $FCGISOCKET -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN
chmod 770 $FCGISOCKET
Zu ändern ist also: FCGIPROGRAM, FCGISOCKET,PHPRC, USERID und GROUPID Auch hier wieder mein ls-Freund:
  for i in $(ls); 
do \
cat startup.sh | sed -s "s/%%DOMAIN%%/${i}/g" \
sed -s "s/%%DOMAINUSER%%/$(echo $i | tr '.' '_')/g" \
> startup/${i}-startup.sh; \
done;

Start der FastCGIs
Danach startet man die fcgi-Prozesse mittels dem Script: /var/www/fastcgi/startup/ersteDomain_tld-startup.sh spawn-fcgi.c.170: child spawned successfully: PID: xxxxx Das bedeutet, wir brauchen hier ein Konstrukt, um die FastCGIs zu starten/stoppen! Das steht auf der ToDo Liste

Konfiguration

Jetzt passt man noch die Lighty Konfiguration an (/etc/lightttpd): Dafür definieren wir uns erstmal ein paar Template Dateien um die Config klein zu halten:
Templates
'''incl-docroot.conf''' um Document-root und Logfiles anzupassen
  ## set the docroot based on basedir and servername  
## both have to be defined before
server.document-root = basedir + servername + "/docs/"
accesslog.filename = basedir + servername + "/logs/lighty_access.log"
# Es gibt bisher leider keine Möglichkeit mehr als ein Server Errorlog zu definieren
# server.errorlog = basedir + servername + "/logs/lighty_error.log"
'''incl-fastcgi-php-peruser.conf''' um jeden vhost mit seinem php Socket zu binden:
  fastcgi.server = ( ".php" =>
(
( "socket" => "/var/www/fastcgi/" + servername + "/" + servername + ".socket",
"check-local" => "disable",
"broken-scriptfilename" => "enable"
)
)
)
ToDo: Vhosts like Apache
Hier fehlt noch eine externe Konfiguration wie beim Apache durch sites-[enabled,available] Ist schon im Einsatz, muß ich hier noch einpflegen.
lighttpd.conf
Nun zur richtigen Config. Die allgemeinen Einstellungen sind gut dokumentiert, generell gilt Variablen gültigkeit wie bei Programmiersprachen: innerhalb eines Blocks aus { } definierte Werte gelten nur dort und nicht global. Globale Variablen können in so genannten Conditionals überschrieben werden. Folgende Sachen sollten geändert werden: # Access.log Format wie beim Apache:
  accesslog.format = "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""  
# zum Test
server.port = 81
# Wie bei Apache:
## change uid to (default: don't care)
server.username = "www-data"
## change uid to (default: don't care)
server.groupname = "www-data"
# mod-fastcgi muß aktiviert sein also

#
var.basedir = "/var/www/" $HTTP["host"] =~ "^(www\.)?ersteDomain\.tld:81$"
{
var.servername = "
ersteDomain.de"
var.username = "
ersteDomain_de"
include "incl-docroot.conf"
include "incl-fastcgi-php-peruser.conf"
}

 für jeden vhost das und gut ist.. aber auch das kann man auslagern.. mehr davon später.

Aenderungen


Was muß man ändern oder was geht nicht mit Lighttpd wie es jetzt ist:
- Es sind keine Errorlogs pro vhost möglich. Man kann sie zwar in den Conditionals definieren, aber der letzt Eintrag gewinnt. (Für mich bisher ein Showstopper)
- Lighttpd unterstützt keine .htaccess in Verzeichnissen. Für Verzeichnisschutz bemüht man mod_auth und macht die Einträge direkt in der lighttpd.conf. Für pro Verzeichniss Einstellungen kann man mal mit einem Ruby Script herumspielen.
- mod_rewrite hat eine andere Syntax als bei Apache -> da ist Anpassung nötig.

© 2007 Jan Scholten | Webhosting by rootsvr.de | Design by Flavia Schoenleber | Stand 03/2007