2013-06-03 3 views
27

Ho più socket pool PHP-FPM UNIX per lo stesso host con separazione logica di codebase/funzionalità & per indirizzare il ridimensionamento futuro dello stesso. Nginx gestisce il routing verso il socket corretto in base ai pattern URI. La distribuzione funziona correttamente.È possibile ricaricare uno dei pool PHP-FPM senza disturbare gli altri

Ogni volta che cambio la configurazione del pool per uno, sto ricaricando/riavvio il processo FPM (dal segnale USR2).

Non ho idea di come funzionino gli interni di FPM, ma presumo che quando riavvio il processo principale, tutti i pool vengano riavviati/ricaricati. Per favore correggimi se sbaglio.

Voglio sapere se posso ricaricare/riavviare solo un pool quando gli altri funzionano come erano (nessun problema nelle transazioni in corso su quei pool).

Vorrei anche apprezzare altri suggerimenti di configurazione che potrebbe mi permette di avere desiderato gestione piscina

risposta

35

php-fpm permette per un riavvio grazioso bambino, di solito con la parola chiave reload anziché restart sul script di init, l'invio del segnale USR2 .

Così facendo un riavvio regolare non si dovrebbe perdere alcuna transazione in esecuzione. I bambini vengono uccisi dopo la fine dell'attuale gestione delle richieste per ciascuno di essi. Questo dovrebbe essere sufficiente se non è necessario un vero riavvio. Ho fatto alcune prove e, per esempio una ricarica è sufficiente per:

  • svuotare la cache APC
  • percorso del file di registro alter
  • Min/Max/Start Impostazioni bambino alter

così ho fatto non trovare un caso in cui un bisogno di un vero riavvio ancora. Tranne che un ricarico non può avviare un servizio arrestato.

Se si desidera assicurarsi che altri pool non vengano mai ricaricati quando si desidera ricaricare uno di questi, sarà necessario gestire diversi daemon php-fpm e un pool per demone. Ciò implica la scrittura di diversi script di inizializzazione e di configurazione principale.

L'utilizzo della parola chiave restart è più pericoloso, soprattutto perché lo script di init sta forse uccidendo bambini con esecuzione prolungata nel passaggio di stop. E con diversi demoni gestiti con diversi PID e file di configurazione si potrebbe anche ottenere un comando start-stop-daemon con l'opzione --exec (questo è il caso in debian) e questo ucciderebbe tutti i daemon che eseguono lo stesso eseguibile php-fpm (inviando in effetti un kill -9 a tutti gli altri daemon paralleli php-fpm dopo aver fermato quello giusto con il PID corretto se si eseguono diversi processi php-fpm, il che è molto brutto).

Quindi utilizzare la parola chiave reload (segnale USR2) è un must.

+0

Grazie per la spiegazione. Ricarico (non ricomincio, scusate la mia ingenuità) i processi inviando USR2. Tuttavia, vorrei conoscere tutti i campioni su come eseguire questa operazione "gestire diversi daemon php-fpm e un pool per demone". Sarei grato se potessi elaborare un po 'su "scrivere diversi script di init e file di configurazione master" – kaychaks

+1

@kaychaks: Ho scritto un esempio qui: http: //regilero.github.io/Drupal/English/2013/05/16/Warning_chrooted_php_fpm_and_apc/ – regilero

+0

Quale versione di PHP stai usando per farlo funzionare? Ho visto problemi con due versioni di Ubuntu '5.5.9 + dfsg-1ubuntu4.4' e' 5.3.10-1ubuntu3.14' che impediscono che ciò accada. Ho provato avviando una lunga richiesta web da nginx a PHP FPM, quindi inviando il PHP master FPM a un segnale USR2, e nginx restituisce immediatamente 502. – ianneub

Problemi correlati