Cómo sintonizar Apache en el servidor Ubuntu 14.04

18

Actualmente en mi Apache 2 (Apache 2.4.7 para ser exactos) en Ubuntu 14.04, tengo esta configuración:

/etc/apache2/mods-enabled/mpm_prefork.conf

<IfModule mpm_prefork_module>
StartServers                    20
MinSpareServers                 100
MaxSpareServers                 250
MaxRequestWorkers               150
MaxConnectionsPerChild          0
</IfModule>

El servidor es un servidor de Amazon de 8GB (RAM) que no hace más que cargar un formulario de registro de tres páginas para algunas campañas publicitarias de Google.

Encontré un script llamado apachetuneit.sh en la web, pero luego de un tiempo Apache informaba este error:

[Mar 21 de abril 16: 45: 42.227935 2015] [mpm_prefork: error] [pid 1134] AH00161: el servidor alcanzó la configuración MaxRequestWorkers, considere aumentar la configuración MaxRequestWorkers

¿Cómo puedo juzgar cómo establecer esta configuración?

Estoy preguntando específicamente solo cómo ajustar Apache 2.4 y nada más. Es por eso que esta pregunta es diferente de esta pregunta .

ServerChecker
fuente
@ JennyD Ese artículo es demasiado amplio para esta necesidad específica.
ServerChecker
La forma en que juzga estas configuraciones específicas es haciendo pruebas de carga.
Jenny D
@ JennyD Es aún más fácil que eso. Simplemente use la secuencia de comandos ap.sh bajo carga regular varias veces en el día y en promedio, haga los cálculos matemáticos según el enlace de servicio en la nube a continuación y establezca MaxRequestWorkers en ese valor. Luego, mire los registros de Apache en busca de problemas con MaxRequestWorkers y aumente, agregue más RAM, agregue CloudFlare o agregue otro nodo web. No es necesario realizar pruebas de carga extremadamente intensas.
ServerChecker
Puede escribir una respuesta que contenga información sobre ese guión, y cosas relevantes de los enlaces que incluyó en su propia respuesta, a la pregunta que señalé como un posible duplicado.
Jenny D

Respuestas:

45
  1. Reconozca que Ubuntu 14.04 usa Apache 2 con PHP ejecutándose a través de un módulo mpm_prefork , del cual hay un archivo editable en /etc/apache2/mods-enabled/mpm_prefork.conf. Además, reconozca que a partir de Apache 2.4, MaxClients ahora se renombra como MaxRequestWorkers , por lo que cualquier documentación relacionada con MaxClients debe cambiarse a MaxRequestWorkers.

  2. Detenga el servicio web Apache con el siguiente comando, temporalmente:

    servicio de sudo apache2 stop
  1. Espere 5 segundos y luego ejecute el siguiente comando para averiguar cuánta memoria virtual tiene en el servidor que es libre:
    sudo free -ht

Lea la línea Mem: y mire la columna libre. Considere esto como la cantidad de RAM que puede dedicar a Apache, aunque generalmente me gusta deducir 2GB en un servidor más robusto (como en> 4GB), o 1GB en un servidor más ligero. Entonces, si la columna gratuita dice que tengo 13GB gratis, recomendaría darle a Apache 11GB. Esa es una línea de base. Si encontramos algún problema con la base de datos en los registros ocasionalmente (como 3 veces en los registros durante un período de 3 días) que necesita más memoria, entonces podríamos considerar que solo teníamos 10 GB para jugar en lugar de 11 GB (en este caso ) Si encontramos en los registros de Apache que el servidor necesita más MaxRequestWorkers, entonces ese es un problema separado que abordaré a continuación.

  1. Inicie el servidor web Apache.
    servicio sudo apache2 inicio
  1. Abra como 10 pestañas del navegador, conéctese a algunas de sus páginas más largas o de carga más lenta desde su sitio web, y actualice como 3-4 veces en cada pestaña.

  2. Después de hacer eso, rápidamente ahora ejecuta el siguiente comando:

    sudo ps -ylC apache2 | awk '{x + = $ 8; y + = 1} END {print "Apache Memory Usage (MB):" x / 1024; imprima "Tamaño de proceso promedio (MB):" x / ((y-1) * 1024)} '

Ejecútalo como 5 veces rápidamente.

Mire el valor de Tamaño de proceso promedio y promedie ese valor entre las 5 veces que lo ejecutó.

Ahora haga los siguientes cálculos y asegúrese de convertir GB a MB según sea necesario para que todos los números estén en valores MB. Por lo tanto, multiplique por 1024 o divida por 1024, según el camino que deba seguir.

MaxRequestWorkers = Línea de base libre (con espacio de almacenamiento intermedio) / Tamaño de proceso promedio

Por ejemplo, tenía un servidor de 14 GB, pero cuando Apache se detuvo, el servidor mostró que usaba 1 GB de RAM en inactivo. Luego proporciono otro 1GB en algún espacio de búfer adicional para el sistema operativo en caso de que lo necesite. Eso significa que tendría una línea de base libre de 12 GB. Ahora debo convertirlo de GB a MB, por lo que multiplico 12 x 1024 y obtengo 12288. El 12288 MB es mi valor libre de referencia. En mi caso, vi que el tamaño promedio del proceso era de 21 MB. Entonces, tomo 12288/21 y obtengo aproximadamente 585. Ahora, es común que los sysops redondeen este valor, y obtuve 580.

  1. Edite el archivo /etc/apache2/mods-enabled/mpm_prefork.conf y considere configurarlo con los siguientes valores predeterminados, reemplazando XXX con su cálculo MaxRequestWorkers:


`<IfModule mpm_prefork_module>`
  StartServers                    2
  MinSpareServers                 2
  MaxSpareServers                 5
  MaxRequestWorkers               XXX
  ServerLimit                     XXX
  MaxConnectionsPerChild          0
</IfModule>

Tenga en cuenta que es posible que no vea el parámetro ServerLimit allí. Añádelo. Este parámetro predeterminado es 256 si no está presente, pero debe ser el mismo valor que MaxRequestWorkers o obtendrá un error.

  1. Otro factor crítico en su configuración de Apache es el archivo /etc/apache2/apache2.conf con la variable Timeout y se mide en segundos. Este es el tiempo que puede enviar o recibir del servidor antes de que se agote el tiempo de espera. También debe tener en cuenta la carga o descarga de un archivo, como si tiene un sitio web donde las personas pueden cargar o descargar CSV u otros archivos grandes, por ejemplo. Y debe tener en cuenta un servidor de base de datos ocupado y dónde podría necesitar proporcionar algo de tiempo antes del tiempo de espera de las páginas. Cuanto más pequeña sea esa variable de Tiempo de espera, más disponible estará el servidor web para recibir nuevas conexiones. Sin embargo, tenga en cuenta que establecer este valor demasiado bajo puede causar estragos en las variables de sesión de PHP, aunque no con las cookies basadas en sesión del navegador. Entonces, por ejemplo, un valor de 300 (5 minutos) podría ser bueno para un servidor web que se basa en variables de sesión PHP para el flujo de trabajo de la aplicación web en lugar de las cookies de sesión del navegador. Un valor de 45 podría ser bueno para un servidor web que no sirve más que páginas estáticas de publicidad, pero sería terrible para un servidor que necesita utilizar mucho las variables de sesión PHP. Por lo tanto, edite el parámetro Timeout en este archivo a la cantidad que necesita. Esto puede tomar algunas pruebas con todas sus páginas web para ver si el valor es demasiado bajo. Sin embargo, probablemente sea una buena idea no establecerlo por encima de 300 a menos que tenga problemas al cargar o descargar archivos de gran tamaño. pero sería terrible para un servidor que necesita utilizar las variables de sesión PHP en gran medida. Por lo tanto, edite el parámetro Timeout en este archivo a la cantidad que necesita. Esto puede tomar algunas pruebas con todas sus páginas web para ver si el valor es demasiado bajo. Sin embargo, probablemente sea una buena idea no establecerlo por encima de 300 a menos que tenga problemas al cargar o descargar archivos de gran tamaño. pero sería terrible para un servidor que necesita utilizar las variables de sesión PHP en gran medida. Por lo tanto, edite el parámetro Timeout en este archivo a la cantidad que necesita. Esto puede tomar algunas pruebas con todas sus páginas web para ver si el valor es demasiado bajo. Sin embargo, probablemente sea una buena idea no establecerlo por encima de 300 a menos que tenga problemas al cargar o descargar archivos de gran tamaño.

  2. Ahora reinicie su servicio web Apache. Si hizo algo mal, Apache probablemente le informará al respecto en el momento en que lo inicie nuevamente, y puede rectificarlo.

    servicio sudo apache2 reiniciar
  1. Ahora repita el truco del navegador de 10 pestañas que hizo anteriormente, y vea si encuentra errores de configuración de Apache en el registro de errores del servidor web Apache:
    sudo tail -f /var/log/apache2/error.log

... presione CTRL + C para salir de eso, si lo desea.

Busque una queja sobre la necesidad de MaxRequestWorkers (y recientemente desde que reinició el servidor web). Si ve eso incluso con una configuración óptima de MaxRequestWorkers, es probable que necesite más potencia de fuego para sus sitios web o aplicaciones web. Considere estas opciones:

  • Usar un CDN para descargas de archivos grandes, imágenes y scripts.
  • Usar un servicio de almacenamiento en caché como CloudFlare u otros.
  • Rehacer la estrategia de su sitio web o aplicación web para utilizar varios servidores web que actúen como una "aplicación web" detrás de un equilibrador de carga.
  • Agregar más RAM al servidor y, por lo tanto, hacer este cálculo nuevamente.

  1. Ahora que el servidor Apache está sintonizado, es una especie de línea de base sintonizada. Deberá verificarlo en el transcurso de 2-3 semanas y buscar problemas de MaxRequestWorker en los registros de errores de Apache. A partir de eso, puede tomar una decisión sobre la optimización (consulte el paso 10). También puede instalar Munin con apt en Ubuntu y observar el rendimiento de Apache a lo largo del tiempo y trazar una idea de crecimiento antes de decidir que necesita hacer algo con respecto a la cantidad de tráfico que maneja el servidor web.
ServerChecker
fuente
"Si bien estos enlaces pueden responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. ”
Jenny D
@ JennyD Buen punto! Yo haré eso.
ServerChecker
@ Moderador Necesito ayuda para formatear esta respuesta. Se suponía que el paso 7 era un archivo conf con sangría. Se suponía que el paso 11 no tenía sangría. Los comandos de código que comienzan con sudodeben mostrarse como código, no como texto normal. Seguí la documentación sobre el formato, pero aún lucho aquí.
ServerChecker
1
Hice lo que pude: Markdown realmente no hace muy bien las listas mixtas y el código, pero creo que logré mejorar un poco de todos modos.
Jenny D
para centos novatos como yo: ps -lyU apache en lugar de ps -ylC apache2
user1928596
3

Lo que puede aumentar a MaxRequestWorkers depende de la cantidad de RAM que ocupa cada uno de sus procesos httpd / apache. Si cada uno ocupa 50 MB (solo elige un número aleatorio), cada 20 trabajadores de solicitud que tenga en uso a la vez (es decir, conexiones concurrentes) ocuparán 1 GB. Entonces, en ese ejemplo, podría tener como máximo 8GB * 20 = 160 MaxRequestWorkers. Sin embargo, no puede usar toda la RAM para apache, debe reservar algo para otras cosas que se ejecutan allí. También dejar algo de RAM adicional puede ser útil para el rendimiento, ya que el sistema operativo lo usará para almacenar cosas en caché y acelerar el rendimiento (aunque puede ser preferible no quedarse sin conexiones en lugar de que el servidor sea más rápido ya que el sitio parecerá lento mientras los navegadores de los usuarios esperan que haya una conexión disponible si se agotan).

g491
fuente
¿Cuál es una buena manera de perfilar esto? ¿Qué comandos puedo escribir para ver cuánta RAM usa cada proceso de Apache bajo carga? También necesitamos espacio RAM para MySQL (un sitio de WordPress) y procesos normales del sistema también.
ServerChecker
Vea cuántos procesos se están ejecutando y ejecute el freecomando para obtener una línea base de memoria. Luego aumente la cantidad de procesos que se ejecutan aumentando MinSpareServers, reiniciando apache, ejecutándose freenuevamente y haciendo los cálculos. Consulte moreofless.co.uk/apache-memory-usage para obtener más detalles y explicaciones.
g491
Ahora aprendí que hay una manera súper rápida de hacer esto. Se describe en el enlace cloudinservice.com en mi respuesta a continuación. El comando es ap.sh que alguien descubrió. Además, supe que MaxClients ahora se ha renombrado como MaxRequestWorkers en Apache 2.4+.
ServerChecker