Mi servidor, que ejecuta Ubuntu 14/Apache2.4.7, tiene una redirección htaccess para forzar que todas las solicitudes utilicen HTTPS. Generalmente responde rápidamente. Sin embargo, recientemente modifiqué mi configuración SSL para restringir los cifrados utilizados a configuraciones más modernas para evitar ataques de heartbleed, bestias y otros, y garantizar el uso de métodos de cifrado modernos.
Últimamente he recibido algunas quejas, que parecen no estar relacionadas con estos cambios (ver más abajo), de que mi máquina puede funcionar lenta a veces. Estas quejas sugieren que podría estar relacionado con un apretón de manos o una conexión:
He estado recibiendo cargas lentas e intermitentes de páginas con varios mensajes de estado del navegador dependiendo del navegador utilizado; todo en el sentido de esperar para establecer una conexión segura.
Escribí un script PHP que usa cURL para conectarse mil veces. Lo ejecuté anoche y la lentitud no parecía ser un problema. Intenté conectarme a https y también a http y seguir la redirección anterior. Todas las solicitudes se completaron en 3,5 segundos o menos, y la gran mayoría (96-98%) se completaron en menos de 1,5 segundos.
Ejecuté el mismo script a las 10:30 esta mañana, hora de Cali, y aproximadamente el 10 % de las solicitudes tardaron más de 1,5 segundos y muchas tardaron mucho más. Los tiempos más largos rondaron los 17 segundos.
Mi investigación y mi intuición me dicen que, si bien el protocolo de enlace https es más complejo que las conexiones http, este problema probablemente pueda solucionarse modificando mi configuración de Apache (por ejemplo,Trabajador de solicitud máxima) ajustes. El servidor casi nunca excede un promedio de carga de aproximadamente 1,5 y parece que hay mucha memoria disponible.
¿Alguien puede sugerir cómo podría reducir el cuello de botella aquí y qué pasos podría seguir para solucionarlo? Cualquier ayuda sería muy apreciada.
EDITAR: Visité el canal IRC #apache y pregunté por allí y la gente amigable me llamó la atención sobre el hecho de que este servidor está enprehorquillaEl modo y MinSpareServers, MaxSpareServers, StartServers y MaxRequestWorkers son predeterminados o están ajustados, pero aún son bastante bajos.
Fueron bastante firmes en que un servidor de producción no debería usar el modo prefork y me remitieron a algunos enlaces:
- Evento Apache MPM- describe el modo de evento de Apache
- Ejecutando PHP en Apache httpd- una lista de opciones para ejecutar php en apache
- Una historia de openssl_seal(), PHP y Apache2handle- descripción de exploits en php que hay que tener en cuenta
Tengo entendido que la solución de corrección para estos problemas de rendimiento probablemente sea instalar Apache para que se ejecute en modo evento, pero mi sitio web es complejo y utiliza algunos procesos de bifurcación y demás. Espero que, como solución provisional, algunos puedan sugerir ajustes aminSpareServers,maxSpareServers,iniciarServidores,maxRequestWorker
EDITAR 2: Un desglose de una solicitud lenta típica, según lo informado por curl_getinfo
la función en PHP:
elapsed: 17.6722049713
ssl_verify_result: 0
total_time: 17.671187
namelookup_time: 0.000051
connect_time: 0.065855
pretransfer_time: 16.787012
starttransfer_time: 17.340403
redirect_time: 0.261569
Respuesta1
Resulta que los paquetes de Ubuntu para instalar apache y php7 no parecen ofrecer nada más que prefork, queRealmente apesta.Siendo ese el caso, tuve que conformarme con prefork, que no es la solución ideal en absoluto, pero hasta que tenga más información sobre cómo obtener uno de losconfiguraciones recomendadastrabajando, es mi única opción.
Edité el archivo /etc/apache2/mods-available/mpm_prefork.conf:
sudo nano /etc/apache2/mods-available/mpm_prefork.conf
Y aumentó la configuración de MaxRequestWorkers a 300.NOTAque para poder hacer esto, también tengo que agregar una configuración de ServerLimit de 300 o MaxRequestWorkers está restringido al valor predeterminado de ServerLimit, que es 256:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
# changed in response to slow connect/handshaking time complaints
ServerLimit 300
# note this value is constrained by ServerLimit, which defaults to 256
MaxRequestWorkers 300
MaxConnectionsPerChild 0
Estas configuraciones parecen haber aliviado la lentitud. Utilicé mi script de prueba PHP durante una hora ocupada del día y todas las solicitudes se completaron en 3,5 segundos o menos, y la gran mayoría se completó en menos de 1,5 segundos. También probé con Apache Bench y un alto valor de concurrencia y pude ver que el servidor respondía generando trabajadores, pero todavía tenía mucha RAM libre:
ab -n 1000 -c 100 "https://example.com/"
Revisé la RAM con:
free -h
Esto parece estar funcionando por ahora, aunque es extremadamente decepcionante que no pueda hacer que Apache use fastCGI usando los instaladores de ubuntu.