
Estoy alojando varios (~30) sitios diferentes en un servidor con apache2+fastcgi+suexec+php5. Los sitios tienen diferentes cargas y diferentes tiempos de ejecución de sus scripts (algunos procesan la solicitud durante 5 a 7 segundos, otros <1sek).
A veces, cuando un solo sitio recibe una carga muy alta (se crean y utilizan todas las instancias de PHP de este sitio), todo el servidor Apache se bloquea. Apache (worker mpm) crea nuevos procesos hasta el límite superior. Parece que está comenzando a poner en cola TODAS las solicitudes nuevas para CADA sitio, no solo el que tiene una carga alta y alcanza rápidamente los límites del proceso... reiniciar Apache resuelve el problema...
configuración: FastCgiConfig -singleThreshold 1 -multiThreshold 10 -listen-queue-profundidad 30 -maxProcesses 80 -maxClassProcesses 12 -idle-timeout 30 -pass-header HTTP_AUTHORIZATION -pass-header If-Modified-Since -pass-header If-None-Match
(anteriormente tenía el valor predeterminado -listen-queue-profundidad = 100, pero no cambió nada...)
¿Alguna sugerencia?
Otra pregunta: ¿cómo se implementa esta cola de escucha? ¿Es una cola para Apache completo o una cola única para cada aplicación PHP definida (sitio suexec)?
Me gustaría lograr algo como esto: cuando un sitio recibe una carga alta y su cola está llena, el servidor rebota la siguiente solicitud, pero solo para este sitio. Otros sitios deberían funcionar correctamente...
Respuesta1
Apache 2.4 ofrece un nuevo módulo proxy fastcgi (mod_proxy_fcgi) que puede enviar solicitudes a php-fpm. Usar mod_proxy como intermediario significa que tiene acceso a todas las opciones de mod_proxy, incluidos los parámetros de cola y agotamiento separados del servidor principal.
Le aconsejaría que lo configure en un servidor de prueba con el evento MPM y php-fpm de Apache 2.4; También puedes ajustar cada grupo de php para diferentes aplicaciones.
Respuesta2
¿Has probado mod_fcgid en su lugar? Es mucho mejor para manejar una carga elevada en su servidor.
Respuesta3
Si fastcgi está activando los scripts php como un proceso de usuario, entonces el sistema operativo debe aplicar las definiciones de /etc/security/limits.conf (específicamente nproc).
es decir: Apache intentará iniciar el proceso como ese usuario y el sistema operativo finalizará el proceso porque excedió el límite del proceso.
Sin embargo, esto es una especie de chapuza; Si la máquina está inactiva, seguirás eliminando conexiones.
¿Por qué no simplemente transfieres tu cliente más grande a una máquina dedicada? ¿O activar un Apache secundario, escuchando en un puerto alto, con un espacio asignado/tiempo de ejecución establecido? podrías usar mod_proxy para pasar solicitudes de forma transparente.
Dicho esto, no estoy muy familiarizado con fastcgi, por lo que es posible que ya haya algún sistema de cuotas disponible; Sin embargo, la lectura rápida de los documentos no produjo nada.
Respuesta4
Puedes ver una serie de tutoriales web aquí: http://blog.stuartherbert.com/php/category/the-web-platform/
¡Personalmente los encuentro muy reveladores! Este tutorial posiblemente sea igual de útil: http://blog.stuartherbert.com/php/2008/10/07/can-you-secure-a-shared-server-with-php-fastcgi/
Sinceramente, recomendaría mover el sitio de alto tráfico a su propia máquina si está utilizando tantos recursos.