PHP jako FastCGI pod Apachem

V minulém článku o propojení Apache a PHP jsme dospěli k závěru, že běh interpretu PHP jako FastCGI aplikace je nejlepší možná volba. Dnes se podíváme, jak na to.

Uvedený postup je pro distribuci Ubuntu.

Nainstalujeme balíky php5-cgi a libapache2-mod-fastcgi.

Otevřeme si s právy pro zápis nastavení výchozího VirtualHostu:

gksu gedit /etc/apache2/sites-available/default &

Povolíme podporu pro Actions:

cd /etc/apache2/mods-enabled/
sudo ln -s ../mods-available/actions.load ./
sudo ln -s ../mods-available/actions.conf ./

V otevřeném souboru default někam do kontejneru <VirtualHost> přidáme:

AddType application/fast-php .php
Action application/fast-php /cgi-bin/php5

V kontejneru VirtualHost by měl být kontejner <Directory "/usr/lib/cgi-bin">, do něj přidáme:

SetHandler fastcgi-script

Celý kontejner i s předchozím řádkem tedy bude vypada nějak takto:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
   SetHandler fastcgi-script
   AllowOverride None
   Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
   Order allow,deny
   Allow from all
</Directory>

Výsledek FastCGI je sice lepší než CGI, ale za mod_php výkonnostně velmi pokulhává.

metoda datazů za s
CGI 38
FastCGI 116
Modul 382

Metodika testu: simulace 30 uživatelů a 10000 dotazů celkem pomocí nástroje Apache Bench.

Zrychlení FastCGI

Naštěstí není nijak složité výkon FastCGI podstatně zvýšit. Staší nevolat binárku PHP-CGI přímo, ale pomocí upraveného CGI skriptu, který trochu změní nastavení prostředí.

Otevřeme nový CGI skript:

gksu gedit /usr/lib/cgi-bin/php-fast

A zapíšeme do něj:

#!/bin/sh
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /usr/bin/php-cgi

Upravíme práva skriptu:

sudo chmod 755 /usr/lib/cgi-bin/php-fast

A nakonec změníme akci v default:

Action application/fast-php /cgi-bin/php-fast

Před kontejner VirtualHost ještě přidáme:

FastCgiConfig -autoUpdate

Nyní nám beží FastCGI v dynamickém režimu, kdy se počet procesů mění podle toho, jak je potřeba. PHP můžeme spouštět i ve statickém režimu, kdy si sami navolíme, kolik procesů bude předpřipraveno.

FastCgiServer /usr/lib/cgi-bin/php-fast -idle-timeout 120 -processes 5

Zdrojáky

default, php-fast

Závěrečné testy

Výsledek testu po úpravách je už mnohem příjemnější. FastCGI zaostává za modulem jen o pár procent.

metoda datazů za s
Modul 382
static FastCGI 333
dynamic FastCGI 323

A když trochu změníme parametry testu (100 uživatelů a 10000 dotazů celkem) máme nového vítěze:

metoda datazů za s
dynamic FastCGI 337
static FastCGI s 5 procesy 328
static FastCGI s 10 procesy 320
Modul 308

evaluation

Komentáre

[1] nick
2009-04-11 17:51:06

Výborně, našel jsem tu přesně to co jsem tu hledal.
Akorát bych se zeptal, dá se nějak pro různé
virtualhosty dát různé php.ini? (při této konfiguraci)
(Pokud ano, odpovězte mi prosím na email nick519@seznam.cz, díky)

Na tento komentár odpovedal [2] Dundee
[2] Dundee
2009-04-15 20:35:42

#1 nick: Mělo by to jít direktivou

DefaultInitEnv PHPRC "/etc/php5/cgi"

BTW: místo libapache2-mod-fastcgi doporučuji nainstalovat libapache2-mod-fcgid, který funguje stejně ale má lepší správu prostředků.

[3] POpel
2010-04-15 10:38:22

Nevíte kde sehnat obdobný postup pro Windows XP?
Apache,PHP, FastCGI pod Windows?

[4] Martin
2011-01-24 16:27:00

Díky za srovnání.

comments closed