Red de conocimiento informático - Material del sitio web - ¿Cómo utilizar el supervisor para monitorear el proceso principal de php-fpm y realizar el reinicio automático de php-fpm?

¿Cómo utilizar el supervisor para monitorear el proceso principal de php-fpm y realizar el reinicio automático de php-fpm?

1. Instalar supervisor

El supervisor en sí es una implementación de Python y actualmente se encuentra en la etapa de investigación, así que primero cree un nuevo entorno virtualenv y luego use pip para instalar el paquete de supervisor.

En este punto, se ha establecido el entorno de investigación básica. Por supuesto, los entornos php-fpm y PHP y el front-end Nginx también están listos.

2. Analiza el script php-fpm.sh

Por lo general, después de compilar e instalar PHP, también necesitas compilar e instalar php-fpm (un programa binario en C), que normalmente se coloca en el directorio php_install_path/sbin/.

También hay un script llamado php-fpm.sh en este directorio, que se utiliza para controlar las operaciones de inicio/detención/reinicio/recarga del proceso php-fpm.

La operación "iniciar" en el script ./sbin/php-fpm.sh iniciará el proceso principal de php-fpm, y las operaciones restantes se implementan enviando señales al proceso principal de php-fpm.

## Fragmento de código en php-fpm.sh

caso "$1" en

inicio)

echo -n "Iniciando php-fpm"

## La siguiente línea es el comando de teclado

$php_fpm_BIN --daemonize $php_opts

si ["$?" = 0 ] ; entonces

echo "fallido"

salida 1

fi

wait_for_pid creado $php_fpm_PID

if [ -n "$try" ] ; entonces

echo " falló"<

salida 1

else

echo " done"

fi

;;;

De lo anterior está el tipo de terminal "./sbin/php-fpm.sh

start", puede ver que el parámetro de inicio del proceso php-fpm es -daemonize

$php_opts, y el valor de $php_opts es "-fpm-config $php_fpm_CONF -pid $php_fpm_PID".

Nota: php-fpm.sh inicia el proceso principal de php-fpm pasando el parámetro daemonize, que indica que el proceso principal de php-fpm se inicia como un demonio (proceso de demonio), y de acuerdo con La documentación del supervisor. Cuando se utiliza un demonio supervisor, el proceso que se supervisa no puede ser un proceso demonio. Según la documentación del supervisor, cuando se utiliza un supervisor para supervisar un proceso, el proceso que se supervisa no puede ser un proceso demonio. Esto se debe a que el proceso demonio generalmente permite que el proceso padre "finalice su vida" después de completar el proceso hijo bifurcado. Es decir, después de que sale el proceso padre creado por el supervisor, el programa supervisor ya no puede supervisar los procesos hijo creados por el proceso salido. . Puede consultar el artículo CÓMO sobre escritura de demonios de Linux para comprender el comportamiento del demonio.

Según el análisis anterior, sabemos que siempre que el supervisor inicie el proceso php-fpm sin pasar el parámetro daemonize, el proceso php-fpm saldrá automáticamente.

3. Archivo de configuración del programa de monitoreo que implementa la función del demonio del proceso principal php-fpm

El análisis anterior nos ha dicho cómo resolver el problema, por lo que aquí hay una verificación directa de si. el archivo de configuración es un método disponible. Este archivo se encuentra en el mismo directorio que php-fpm.conf (normalmente php_install_path/etc/).

[inet_mand=bash -c "sleep 1 && /home/slvher/tools/php /5.6 .11/sbin/php-fpm --fpm-config /home/slvher/tools/php/5.6.11/etc/php-fpm.conf --pid /home/slvher/tools/php/5.6.11 /var/run/php-fpm.pid"; Programa (relativo a PATH, parámetros aceptables)

process_name=%(program_name)s; Expresión de nombre de proceso (el valor predeterminado es %(program_name)s)

autostart=true ; iniciar cuando se inicia el supervisor (predeterminado: verdadero)

autorestart=true ; si/cuándo reiniciar (predeterminado: inesperado)

startretries =5; Número máximo de fallas de inicio en serie (predeterminado 3)

exitcodes=0,2,70; códigos de salida "esperados" para el proceso (predeterminado 0,2)

stopsignal=QUIT; La señal utilizada para finalizar el proceso (el valor predeterminado es TERM)

stopwaitsecs=2 El número máximo de segundos que se deben esperar antes de SIGKILL (el valor predeterminado es 10)

La estructura del archivo de configuración se puede comprender fácilmente viendo el documento del supervisor. Hay dos elementos de configuración que requieren atención especial:

1) comando

. Especifica el comando de inicio para que el supervisor supervise el proceso. Como puede ver aquí, no estamos pasando un comando de demonio a php-fpm.fpm, los parámetros restantes son solo expansión de las variables de shell en php-fpm.sh. .

Ha notado que este comando no inicia php-fpm directamente, sino que ejecuta dos comandos a través de bash -c, el primero de los cuales es sleep 1. Esto se debe a que el puerto ocupado por php-fpm generalmente no se libera inmediatamente después de detenerse. En este momento, cuando el programa de monitoreo intenta reiniciar el proceso a una velocidad muy alta, se puede informar el siguiente error

## var/log/ php-fpm.error.log

[18- julio de 2015 21:35:28] ERROR: no se puede vincular el socket de escucha para la dirección '127.0.0.1:9002': la dirección ya está en uso (98)

[18 de julio de 2015 21: 35:28] ERROR: Falló la inicialización de FPM

Y el supervisor actualmente no admite el reinicio retrasado.

-_-

2) reinicio automático

Los documentos relevantes son los siguientes:

< code class="hljs vbscript"& gt;Puede ser falso, inesperado o verdadero. Si es falso, el proceso nunca se reiniciará automáticamente. Si es inesperado, el proceso nunca se reiniciará automáticamente. Si es inesperado, el proceso se reiniciará cuando el programa salga con un código de salida distinto al asociado con esta configuración de proceso (consulte Códigos de salida). Si es verdadero, el proceso se reiniciará incondicionalmente cuando salga, independientemente de su código de salida. /code>

El valor predeterminado es inesperado, lo que significa que la supervisión solo ocurrirá cuando el código de salida del El proceso supervisado es anormal. El programa reiniciará el proceso. Aquí, se establece en verdadero, lo que significa que el proceso se iniciará nuevamente después de salir.

Una vez completada la configuración, en el entorno virtualenv configurado en el paso 1 de este artículo, ejecute el siguiente comando para completar la supervisión del supervisor del proceso principal php-fpm:

shell> supervisord -c etc/sup.php -fpm.conf

Luego, usando ps x | fgrep fpm puedes ver php: se ha llamado al proceso principal de fpm.

Luego, elimine el proceso principal php-fpm y use ps x | fgrep fpm nuevamente para ver si el supervisor crea un nuevo proceso principal php-fpm.

En este punto, se ha resuelto el problema de usar el supervisor para proteger el proceso principal de php-fpm para reiniciar automáticamente php-fpm.