Newsgroup: it.comp.os.linux.sys
Titolo: PHP + FastCGI

Mi ritrovo con una configurazione di php+fastcgi sotto apache.
Funziona, ma con un problema davvero fastidioso: la prima volta
che si accede al sito, il caricamento impiega alcuni secondi, 2-3-4
in cui probabilmente apache resta in attesa dell'avvio del processo.
una volta avviato il processo, la navigazione è fulminea fino al
raggiungimento del timeout (240 secondi), ma il primo avvio fa
venire il latte alle ginocchia.
Non ho idea di cosa verificare, stando alla mia configurazione utilizzo
lo scheduler di fastcgi e non quello di php. (quindi niente
PHP_FCGI_PROCESS o una cosa simile nel wrapper php)
Che diavolo posso controllare? Mi fa venire il latte alle ginocchia
questa attesa, è snervante.

 in cui probabilmente apache resta in attesa dell'avvio del processo.
Per quale motivo usi fastcgi?
-- 
g4b0, linux user n. 369000
http://brosulo.net

 Per quale motivo usi fastcgi?
Per non usarlo come modulo ed abbinarlo a suexec.

 latte alle ginocchia.
Mai successo una roba simile.
Non è che hai qualche cosa impostata per la risoluzione dei nomi in 
apache che va in timeout ?
Poi magari se incolli qualcosa di più dettagliato, forse ti si può anche 
aiutare.

 aiutare.
<IfModule mod_fastcgi.c>
    <Directory "/opt/fcgi">
       AllowOverride None
       Options +ExecCGI -Includes
       Order allow,deny
       Allow from all
       SetHandler fastcgi-script
    </Directory>
    AddHandler fastcgi-script .fcgi
    FastCgiIpcDir  /tmp
    FastCgiWrapper /opt/fcgi/suexec
    FastCgiConfig  -listen-queue-depth 150
                   -minProcesses 50
                   -maxProcesses 300
                   -maxClassProcesses 50
                   -singleThreshold 100
                   -killInterval 240
                   -idle-timeout 240
                   -pass-header HTTP_AUTHORIZATION
    AddType application/x-httpd-php5 .inc .php .cphp .phtml .php5
    Action  application/x-httpd-php5 /fcgi5
</IfModule>
Ho volutamente spaccato le righe, nella config non sono così.
Se ho ben capito:
tengo liberi un minimo di 50 processi (minProcesses) fino
ad un massimo di maxProcesses. In caso di esubero, listen-queue-depth
connessioni restano in attesa. Ciascun vhost può usare al massimo
maxClassProcesses contemporanei.
singleThreshold non ho idea di cosa sia, non l'ho capito.
killInterval ammazzo il processo dopo 240 secondi
idle-timeout ammazzo il processo dopo 240 secondi di inattività.
Fin qui ho capito bene? Forse, ma dico forse, potrebbero essere pochi
i processi da tenere "liberi"
<IfModule mpm_prefork_module>
     StartServers          5
     MinSpareServers       5
     MaxSpareServers      10
     ServerLimit         100
     MaxClients          100
     MaxRequestsPerChild   10000
</IfModule>
Sai che credo di aver cannato la configurazione del prefork? Forse 5
spare son pochi. Ma il tempo in attesa è per avviare pagine PHP, pagine
statiche si aprono fulminee anche sotto un carico massiccio del server
quindi il problema dovrebbe essere lato fastcgi.
Questo è il wrapper per il php:
#!/bin/sh
PHPRC="/opt/fcgi/php.ini/php.ini"
export PHPRC
PHP_INI_SCAN_DIR="/opt/fcgi/php.ini/users/username"
export PHP_INI_SCAN_DIR
#PHP_FCGI_CHILDREN=8
#export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=1000
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/php5/bin/php-cgi
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la
salvezza degli anni nei quali viviamo,
sradicando il male dai campi che conosciamo.

 Sai che credo di aver cannato la configurazione del prefork? 
usare fastcgi ti fornisce un altro *grande* vantaggio sul php come modulo:
puoi utilizzare mpm-worker che usa i thread e che è prestazionalmente 
molto meglio, soprattutto sotto carico.
Una botta di APT e l'hai installato.
Max

 Una botta di APT e l'hai installato.
No, c'è un pannello di controllo di mezzo, quindi niente apt.
devo ricompilare a mano apache, appena ho una mezzora provo.

 Elimina il KillInterval per fare la prova.
Ho rimosso il KillInterval lasciando solo IdleInterval.
Apparentemente non cambia niente. Il primo accesso
al sito è comunque stralento.


 al sito è comunque stralento.
Aggiungo una cosa.
Sia dopo che prima della rimozione del KillInterval, nei log
vedo sempre un sacco di processi che vengono avviati:
[Fri Jun 11 15:22:27 2010] [warn] FastCGI: (dynamic) server 
"/opt/fcgi/wrapperdelmioutente.fcgi" (uid 1060, gid 1062) started (pid 
12665)
[Fri Jun 11 15:22:30 2010] [warn] FastCGI: (dynamic) server 
"/opt/fcgi/wrapperdelmioutente.fcgi" (uid 1060, gid 1062) started (pid 
12668)
[Fri Jun 11 15:22:33 2010] [warn] FastCGI: (dynamic) server 
"/opt/fcgi/wrapperdelmioutente.fcgi" (uid 1060, gid 1062) started (pid 
12669)
[Fri Jun 11 15:22:36 2010] [warn] FastCGI: (dynamic) server 
"/opt/fcgi/wrapperdelmioutente.fcgi" (uid 1060, gid 1062) started (pid 
12671)
Sembra che non funzioni lo scheduler. Viene infatti avviata un wrapper
(e di conseguenza una istanza php) per ogni accesso.
Ma FastCGI non dovrebbe evitare proprio questo problema rispetto ad una
configurazione standard con CGI ?
Però tiene correttamente il conto dei processi avviati, tant'è che ogni
tanto scrive:
"scheduled the start of the last (dynamic) server 
"/opt/fcgi/wrapperdelmioutente.fcgi" process: reached 
dynamicMaxClassProcs (50)"
Ribadisco che è lento solo il primissimo accesso al sito.
Una volta aperto, riesco a caricare le pagine a scheggia quindi
in qualche modo apache e fastcgi riutilizzano le connessioni da
parte dello stesso client altrimenti sarebbe avviato un processo
fastcgi/php per ogni elemento dinamico della pagina.
In pratica fa una mappatura di questo tipo:
client1 => apache => fastcgi1
client1 => apache => fastcgi1
client1 => apache => fastcgi1
client2 => apache => fastcgi2
client3 => apache => fastcgi3
La prima volta che si avvia fastcgi per un dato utente, ci
mette 5 secondi.
Come faccia apache a mappare le istanze fastcgi ad un utente
lo ignoro, stando alla documentazione, apache apre una istanza
per ogni connessione, senza alcuna mappatura.



Io uso suphp per questo scopo, mi trovo decisamente bene. Avevo
Avevo letto da qualche parte di problemi di prestazioni, ma ad oggi non 
me ne sono accorto. Devo dire che non ospito siti high-traffic...


 connessione, senza alcuna mappatura.
Se vuoi tagliare la testa al toro, passare a fcgid (non fastcgi) posso 
girarti le mie config.
Almeno parti da qualcosa che per qualcuno funziona.

 Almeno parti da qualcosa che per qualcuno funziona.
Volentieri, se per te non è un problema.
Alla fin fine, dovrei cambiare solo il modo in cui
Apache richiama il PHP, giusto?
suexec, il wrapper e quant'altro dovrebbero restare
invariati, spero, altrimenti dovrei cambiare qualcosa
tipo 300 wrapper.
