lighttpd terheles-elosztott PHP-val

A lighttpd rendkivul kedves teremtes. Gyors, konnyu, nem nagyon bugos :).
Lehet benne PHP alkalmazasokat is futtatni. Vagy akarmit amit be tudsz tomni fastcgi moge.
A fastcgi egy nyilt API ami mogott tulajdonkeppen akarmit lehet futtatni. PHP, perl, ruby a leggyakoribb aldozatok. (Spec: www.fastcgi.com)

Ezek a kornyezetek altalaban CPU intenzivek, gyakran teljes mertekben a CPU sebessege hatarozza meg az alkalmazasok futasi sebesseget.

Amikor tul lassunak erezzuk az alkalmazast, ket lehetosegunk van (lighttpd eseteben):
1. Veszunk meg nagyobb vasat
2. Veszunk meg egy vasat, es terheles-elosztast allitunk be.

A masodik igazabol helybol ket lehetoseg. Ha a webszerveren kivul tesszuk (pl. LVS, Cisco Director, Foundry ServerIron), akkor barmilyen webszerverrel megoldhato. Viszont nagyon nagy a teszteles igenye, es szukseg van meg vasra az uj webszerveren kivul is. A kereskedelmi megoldasok eseteben nem is olcso vasra.

Ha viszont lighttpd a webszerver, fastcgi az alkalmazas es csorok, de okosak vagyunk, itt egy megoldas:

A lighttpdben lehetoseg van tetszoleges szamu fcgi backend beallitasara. Ha egynel tobbet talal a konfig fajlban, magatol elosztja a bejovo kereseket a backendek kozt.

Az alabbi virtualis hostban harom PHP backendet definialtam. Az elso kettovel TCP-n at kommunikal. A harmadik egy helyi, Unix Domain Socketen at beszelgetos valtozat (azt mondjak a domain socketen at beszelgetes kevesebb CPU overheadet eredmenyez).


$HTTP["host"] =~ "tst" {
   server.name = "tst"
   server.document-root = "/var/www/"
   fastcgi.server             =   ( ".php" =>
                                     (
                                     "R1" => ( "host" => "192.168.0.10",
                                        "port" => 1029 ),
                                     "R2" => ( "host" => "192.168.0.11",
                                        "port" => 1029 ),
                                     "S1" => ( "socket" => "/tmp/php-fastcgi.socket",
                                        "bin-path" => "/usr/bin/php5-cgi",
                                        "max-procs" => 1,
                                        "bin-environment" => (
                                           "PHP_FCGI_CHILDREN" => "4",
                                           "PHP_FCGI_MAX_REQUESTS" => "1000"))
                                     )
                                  )
   status.statistics-url = "/server-counters"
   status.status-url          = "/server-status"
   status.config-url          = "/server-config"
}

Ahhoz, hogy ez mukodjon nehany feltetelnek teljesulnie kell:
1. A backend szervereken fenn kell lennie a tartalomnak (PHP scripteknek)
2. Minden adatbazisnak egyeb veszedelemnek elerhetonek kell lenni a backend szerverekrol is (Mivel ott fut a PHP kod)
3. Futnia kell fastcgi processznek a backendeken

A webszerver maga, amennyiben lokalisan nem fut fastcgi processz, a tartalmat csak arra hasznalja, hogy meg tudja hatarozni, letezik-e a kert fajl. Amennyiben nem, a keresre o maga kuldi ki a 404-es hibat, a backend gepek kihagyasaval.

A php fastcgi processzeket az alabbi scripttel is el lehet inditani (randa es trehany, de mukodik.):


#!/bin/bash

# Hany fcgi processzt szeretnenk futtatni
PHP_FCGI_CHILDREN=4
# Hany requestenkent induljanak ujra a gyerekek
PHP_FCGI_MAX_REQUESTS=1000
# Melyik IP cimekrol legyen elerheto az fcgi szerver
FCGI_WEB_SERVER_ADDRS="127.0.0.1,192.168.0.9"
USER=www-data
GROUP=www-data
PHP=/usr/bin/php5-cgi
PORT=1029
PIDF=/var/run/fcgi.pid

#export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS USER GROUP PHP PORT PIDF
#kicsit gyomlalt valtozat hrgy\d\d nyoman (az FCGI, PHP_FCGI kezdetu valtozokat hasznalja a cgi processz):
export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS

case $1 in 
 start)
      /usr/bin/spawn-fcgi -P $PIDF -p $PORT -C $PHP_FCGI_CHILDREN -u $USER -g $GROUP -f $PHP 2>&1
      ;;
 stop)
   kill `cat $PIDF`
esac

Erre a scriptre csak az elso ket backend eseteben van szukseg. A harmadikat maga a helyi lighty vezenyli. A masik ket gepen nem is kell webszervernek futnia.

Egy keves statisztikat lehet latni a "server-counters" oldalon:


fastcgi.active-requests: 5
fastcgi.backend.R1.0.connected: 655
fastcgi.backend.R1.0.died: 0
fastcgi.backend.R1.0.disabled: 0
fastcgi.backend.R1.0.load: 5
fastcgi.backend.R1.0.overloaded: 0
fastcgi.backend.R1.load: 309
fastcgi.backend.R2.0.connected: 4361
fastcgi.backend.R2.0.died: 0
fastcgi.backend.R2.0.disabled: 0
fastcgi.backend.R2.0.load: 0
fastcgi.backend.R2.0.overloaded: 0
fastcgi.backend.R2.load: 53
fastcgi.backend.S1.0.connected: 4989
fastcgi.backend.S1.0.died: 0
fastcgi.backend.S1.0.disabled: 0
fastcgi.backend.S1.0.load: 0
fastcgi.backend.S1.0.overloaded: 6
fastcgi.backend.S1.load: 48
fastcgi.requests: 10005

Hozzászólások

Va nkülönbség, ha a spawn-fcgi processzt start-stop-saemon indítja?

Ha jól látom a környezeti változókat kapcsolókkal adod át, tehát szerintem az export amúgy is felesleges.

start-stop-daemon --start --quiet --exec /usr/bin/spawn-fcgi --pidfile $PIDF -- -P $PIDF -p $PORT -C $PHP_FCGI_CHILDREN -u $USER -g $GROUP -f $PHP

Esetleg:

start-stop-daemon --start --user $USER --group $GROUP --quiet --exec /usr/bin/spawn-fcgi --pidfile $PIDF -- -P $PIDF -p $PORT -C $PHP_FCGI_CHILDREN -u $USER -g $GROUP -f $PHP

wikiben a helye :).
--
1 leszel vagy 0 élő vagy hulla!