Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

700
Visualizações
¿La conexión entre php-fpm y nginx por fast-cgi es una conexión persistente (mantener viva)?

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?

about 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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.

about 4 years ago · Santiago Trujillo Relatório

0

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:1994

cuando 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 = 4

conclusión

entonces, creo que en php7, el fpm está cerca cuando finaliza la solicitud, ¿entonces no es una conexión persistente?

about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda