FastCGI: Comm with server / Incomplete headers

Si vous êtes tombé ici, c’est que vos logs contiennent d’affreux

[Sun Jul 05 12:19:44 2015] [error] [client 1.2.3.4] FastCGI: comm with server “/usr/lib/cgi-bin/www.whatever.com.external” aborted: idle timeout (240 sec)

[Sun Jul 05 12:19:44 2015] [error] [client 1.2.3.4] FastCGI: incomplete headers (0 bytes) received from server “/usr/lib/cgi-bin/www.whatever.com.external”

Et pire, que votre Php-fpm plante lamentablement, entraînant par ailleurs avec lui tous les VHOST du pool en question sur votre serveur, et ce pendant quelques secondes ou quelques minutes.

Cette erreur est due à plusieurs choses et nécessite une vision claire de votre situation : si vous utilisez Apache, Nginx, php-fpm, Fastcgi ; un script qui met très longtemps à s’exécuter est soumis à plusieurs timeouts :

  1. Un timeout Apache/Nginx lui même ( niveau socket )
  2. Un timeout FastCGI (le cas échéant)
  3. Un timeout PHP-FPM
  4. Et enfin, un timeout “max execution time” de PHP lui même.
  5. Qui peut même être parfois modifié par ini_set !

Il est primordial de configurer ces timeouts dans un ordre logique.

Le problème est généralement dû a un script très lent, que l’utilisateur tue avant la fin, ou qui se fait “tuer” par la “memory_limit” de PHP.ini. (Il se peut également que vous soyez à court de process fpm – c’est peu probable car le défault est à 1000 – ou que vous tombiez au moment ou FastCGI veut recycler son process php via PHP_FCGI_MAX_REQUESTS)
Bref quelque chose dure plus longtemps que le timeout php-fpm, ou celui-ci est tué, et tout ceci dure beaucoup moins longtemps que le timeout FastCGI. FastCGI essaye dès lors de parler à un php-fpm qui est mort.

Donc, premier Timeout a garder à l’œil ; celui qui va décider de combien de temps votre site sera “down” si le process php-fpm disparaît. Dans le cas ci-dessous, qui est un cas de figure Apache-FastCGI tous les sites PHP seront down pendant 600 secondes maximum, c’est déjà beaucoup si ce qui mène à la mort de php-fpm se reproduit souvent.

FastCgiExternalServer /var/www/www.whatever.com.php5 -fcgi-idle-timeout 600 -socket /tmp/php-fpm/php-www.whatever.com.socket -pass-header Authorization

Exemple de configuration FPM, ou vous pourrez spécifier un idle_timeout :

; ondemand - no children are created at startup. Children will be forked when
; new requests will connect. The following parameter are used:
; pm.max_children - the maximum number of children that
; can be alive at the same time.
; pm.process_idle_timeout - The number of seconds after which
; an idle process will be killed.

Pour le reste de la configuration ; tout doit être analysé. Impossible de donner une solution à tous les cas… J’espère vous avoir donné les pistes pour commencer à debugger 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *