NginX : résoudre "upstream sent too big header while reading response header from upstream" photo

NginX : corriger “upstream sent too big header”

Lors de la mise en ligne d’un nouveau site, je suis tombé sur une page qui ne fonctionnait pas. Côté navigateur, j’obtenais une erreur 502 Bad Gateway. Côté logs Nginx, le message était beaucoup plus explicite :

upstream sent too big header while reading response header from upstreamCode language: JavaScript (javascript)

Ce message signifie que Nginx a bien reçu une réponse de l’upstream, par exemple PHP-FPM, mais que les en-têtes HTTP envoyés par cet upstream sont trop gros pour les buffers configurés.

En clair : le backend répond, mais Nginx n’arrive pas à lire tous les headers de réponse dans l’espace mémoire prévu. Il coupe donc court et renvoie souvent une erreur 502.

Comprendre l’erreur “upstream sent too big header”

Dans une configuration PHP classique, Nginx reçoit les réponses depuis PHP-FPM via FastCGI. La réponse contient deux parties :

  • les en-têtes HTTP, par exemple Set-Cookie, Location, Cache-Control ;
  • le corps de la réponse, c’est-à-dire le HTML, JSON, XML, etc.

L’erreur apparaît lorsque la partie “headers” dépasse la taille que Nginx peut lire avec la configuration actuelle.

La documentation Nginx indique que fastcgi_buffer_size définit la taille du buffer utilisé pour lire la première partie de la réponse FastCGI, qui contient généralement une petite réponse avec les headers. Elle indique aussi que fastcgi_buffers définit le nombre et la taille des buffers utilisés pour lire la réponse complète de l’upstream FastCGI.

Dans le cas d’un reverse proxy classique, le même problème peut exister, mais avec les directives proxy_buffer_size et proxy_buffers, pas avec fastcgi_buffer_size.

Lire la suite

Serveur dédié : résoudre l'erreur  'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)' — Missing /var/run/mysqld/mysqld.sock photo

Serveur dédié : résoudre l’erreur “Can’t connect to local MySQL server through socket”

Après une mise à jour du serveur SQL, ou après un redémarrage physique du serveur, il est possible d’obtenir l’erreur suivante :

error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)'
Missing /var/run/mysqld/mysqld.sockCode language: PHP (php)

On peut aussi la rencontrer sous cette forme :

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)Code language: JavaScript (javascript)

Cette erreur signifie que le client MySQL essaie de se connecter à un socket Unix local, mais que le fichier mysqld.sock n’existe pas à l’emplacement attendu.

Le problème peut avoir plusieurs causes : MySQL n’est pas démarré, le serveur écoute sur un autre socket, le répertoire /run/mysqld n’existe pas, ses permissions sont incorrectes, ou le service n’arrive pas à créer son socket au boot.

Comprendre le rôle de mysqld.sock

Sur Linux, une connexion locale à MySQL ou MariaDB peut passer par un socket Unix plutôt que par TCP/IP.

Au lieu de se connecter à :

127.0.0.1:3306Code language: CSS (css)

le client utilise un fichier spécial, souvent situé ici :

/var/run/mysqld/mysqld.sockCode language: JavaScript (javascript)

ou, plus précisément sur les systèmes modernes :

/run/mysqld/mysqld.sock

Sur beaucoup de distributions, /var/run est un lien symbolique vers /run. Le répertoire /run est temporaire : son contenu est recréé à chaque démarrage. C’est précisément pour cela qu’un problème de création du dossier /run/mysqld peut réapparaître après un reboot.

MySQL explique que le chemin du socket peut être défini avec l’option socket dans les fichiers de configuration, aussi bien dans une section serveur comme [mysqld] que dans une section client comme [client].

Lire la suite

HTML5 : corriger l'erreur "The frameborder attribute on the iframe element is obsolete. Use CSS instead." photo

HTML5 : corriger l’erreur “The scrolling attribute on the iframe element is obsolete. Use CSS instead.”

Si, au détour d’une validation HTML de votre page, vous obtenez l’erreur suivante :

The scrolling attribute on the iframe element is obsolete. Use CSS instead.

… c’est que votre code contient un élément <iframe> avec un attribut scrolling.

Exemple classique :

<iframe src="https://example.com" scrolling="no"></iframe>Code language: HTML, XML (xml)

Cet attribut était utilisé pour indiquer si l’iframe devait afficher une barre de défilement. En HTML moderne, il est obsolète. Le standard HTML classe bien scrolling sur iframe parmi les fonctionnalités obsolètes, et les validateurs recommandent d’utiliser CSS à la place.

Le problème : l’attribut scrolling sur iframe

On trouvait souvent ce genre de code dans les anciennes intégrations :

<iframe
  src="https://example.com/embed"
  width="600"
  height="400"
  scrolling="no"
  frameborder="0"
></iframe>Code language: HTML, XML (xml)

Le validateur HTML signale alors une erreur, car scrolling ne fait plus partie des attributs conformes pour <iframe>. En clair, le navigateur peut encore l’interpréter par compatibilité, mais le code n’est plus valide.

La première correction consiste donc à supprimer l’attribut :

<iframe
  src="https://example.com/embed"
  width="600"
  height="400"
></iframe>Code language: HTML, XML (xml)

Mais cela ne suffit pas toujours à reproduire exactement l’ancien comportement. C’est là que CSS entre en scène.

Lire la suite