Estoy tratando de escribir una demostración del servidor para conectar php-fpm, pero no sé si la conexión entre php-fpm y nginx por fast-cgi es una conexión persistente (mantener viva). Cada vez que http solicite a nginx, ¿nginx conectará php-fpm mediante tcp 3-Way Handshake nuevamente? ¿O la conexión entre nginx y php-fpm es una conexión permanente y nginx intenta reutilizarla?
PHP-FPM es una implementación del protocolo fastCGI y, como tal, cumple con todos los requisitos de la especificación fastCGI.
Uno de esos requisitos se encuentra en la sección 3.5 de la especificación , específicamente sobre las conexiones de cierre:
El servidor web controla la vida útil de las conexiones de transporte. El servidor web puede cerrar una conexión cuando no hay solicitudes activas. O el servidor web puede delegar la autoridad de cierre a la aplicación (ver FCGI_BEGIN_REQUEST). En este caso, la aplicación cierra la conexión al final de una solicitud específica. Esta flexibilidad se adapta a una variedad de estilos de aplicación. Las aplicaciones simples procesarán una solicitud a la vez y aceptarán una nueva conexión de transporte para cada solicitud. Las aplicaciones más complejas procesarán solicitudes simultáneas, en una o varias conexiones de transporte, y mantendrán abiertas las conexiones de transporte durante largos períodos de tiempo.
Una aplicación simple obtiene un aumento de rendimiento significativo al cerrar la conexión de transporte cuando ha terminado de escribir su respuesta. El servidor web necesita controlar la vida útil de la conexión para conexiones de larga duración.
Cuando una aplicación cierra una conexión o descubre que una conexión se ha cerrado, la aplicación inicia una nueva conexión.
Esto significa que depende del servidor web decidir si la conexión persistirá o no. Esto se implementa en nginx a través de la opción fastcgi_keep_conn que establece:
De forma predeterminada, un servidor FastCGI cerrará una conexión justo después de enviar la respuesta. Sin embargo, cuando esta directiva se establece en el valor activado, nginx indicará a un servidor FastCGI que mantenga abiertas las conexiones. Esto es necesario, en particular, para que funcionen las conexiones keepalive a los servidores FastCGI.
Esta declaración es para reflejar el comportamiento de la especificación, así como la capacidad del servidor web que puede servir contenido generado por fastCGI para modificar el comportamiento predeterminado.
Mi suposición aquí es que no tiene sentido mantener vivas las conexiones ya que los hilos de los servidores web se reciclan constantemente. Tal vez haya un número específico de subprocesos estacionados, pero la política habitual de la agrupación de subprocesos es eliminar el subproceso utilizado menos recientemente , por lo general, esto significa que generar un nuevo subproceso garantizará que los subprocesos preexistentes sean los que se eliminen.
Es cierto que no he encontrado ningún recurso para respaldar la afirmación de que la política de recopilación de grupos de nginx es LRU, pero no es improbable que lo sea y, en ese caso, mantener viva la conexión no ahorra mucho.
Después de un año más tarde hice esta pregunta, parece que encontré la respuesta.
(gdb) bt #0 close () at ../sysdeps/unix/syscall-template.S:84 #1 0x0000000000a40dff in fcgi_close (req=0x1dae3c0, force=0, destroy=1) at /home/dinosaur/Downloads/php-7.2.2/main/fastcgi.c:1311 #2 0x0000000000a41a0d in fcgi_finish_request (req=0x1dae3c0, force_close=0) at /home/dinosaur/Downloads/php-7.2.2/main/fastcgi.c:1670 #3 0x0000000000a4d3b3 in sapi_cgi_deactivate () at /home/dinosaur/Downloads/php-7.2.2/sapi/fpm/fpm/fpm_main.c:828 #4 0x00000000008bcf35 in sapi_deactivate () at /home/dinosaur/Downloads/php-7.2.2/main/SAPI.c:532 #5 0x00000000008afa0e in php_request_shutdown (dummy=0x0) at /home/dinosaur/Downloads/php-7.2.2/main/main.c:1913 #6 0x0000000000a50614 in main (argc=1, argv=0x7ffc8b6936e8) at /home/dinosaur/Downloads/php-7.2.2/sapi/fpm/fpm/fpm_main.c:1994cuando se inicia php-fpm, después de init, it while loop para tratar con cada solicitud
while (fcgi_accept_request(request) >= 0) { ... php_execute_script(&file_handle); // zend engine compile and run the opcode ... php_request_shutdown((void *) 0); // close connection } en la función fcgi_accept_request , el socket fd es 4
1411 req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len); (gdb) n 1414 client_sa = sa; Breakpoint 6, fcgi_accept_request (req=0x1dae3c0) at /home/dinosaur/Downloads/php-7.2.2/main/fastcgi.c:1414 1414 client_sa = sa; (gdb) p req->fd $18 = 4 cuando está cerca, cierra el zócalo fd 4
Breakpoint 4, fcgi_close (req=0x1dae3c0, force=0, destroy=1) at /home/dinosaur/Downloads/php-7.2.2/main/fastcgi.c:1272 1272 { (gdb) p req->fd $19 = 4entonces, creo que en php7, el fpm está cerca cuando finaliza la solicitud, ¿entonces no es una conexión persistente?