110 votes

une réponse en amont est mise en mémoire tampon dans un fichier temporaire

J'ai une application web assez grande et lente (données complexes, front-end complexe) construite en RoR et servi par Puma con nginx comme mandataire inverse. En regardant le nginx journal des erreurs, je vois plusieurs entrées comme :

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

Je suis plutôt curieux car il est très peu probable que la page reste la même pour différents utilisateurs et différentes interactions avec eux, et je ne pense pas que la mise en mémoire tampon de la réponse sur le disque soit nécessaire/utile.

Je suis au courant proxy_max_temp_file_size et de le mettre à 0, mais cela me semble un peu maladroit (mon proxy essaie de buffer mais n'a pas de fichier où buffer... comment cela peut-il être plus rapide ?).

Mes questions sont les suivantes :

  1. Comment puis-je supprimer le [warn] et éviter la mise en mémoire tampon des réponses ? Est-il préférable de désactiver proxy_buffering ou pour régler proxy_max_temp_file_size à 0 ? Pourquoi ?

  2. Si nginx met en mémoire tampon une réponse : Quand sert-il la réponse mise en mémoire tampon, à qui, et pourquoi ?

  3. Pourquoi nginx tourne proxy_buffering activé par défaut et qui vous avertit s'il met en mémoire tampon une réponse ?

  4. Quand une réponse déclenche-t-elle cette option ? Lorsqu'il faut > quelques secondes (combien ?) pour servir la réponse ? Est-ce que cela est configurable ?

TIA, ngw.

120voto

VBart Points 8009
  1. Comment puis-je supprimer le [warn] et éviter la mise en mémoire tampon des réponses ? Est-il préférable de désactiver la mise en mémoire tampon du proxy ou de fixer la taille maximale du fichier temporaire du proxy à 0 ? Pourquoi ?

Vous devez définir proxy_max_temp_file_size à 0 afin de le supprimer. Le site proxy_buffering n'est pas directement liée à l'avertissement. Vous pouvez la désactiver pour éviter toute mise en mémoire tampon, mais ce n'est pas recommandé en général (sauf si c'est nécessaire pour Comète ).

  1. Si nginx met en mémoire tampon une réponse, quand sert-il la réponse mise en mémoire tampon, à qui et pourquoi ?

Il sert la réponse immédiatement, mais un client a généralement une connexion beaucoup plus lente et ne peut pas consommer les données de la réponse aussi vite qu'elles sont produites par votre application. Nginx essaie de mettre en mémoire tampon l'ensemble de la réponse afin de libérer votre application dès que possible.

Voir aussi : http://aosabook.org/en/nginx.html

  1. Pourquoi nginx active-t-il par défaut le proxy_buffering et vous avertit-il s'il met effectivement en mémoire tampon une réponse ?

Comme je l'ai déjà mentionné, le proxy_buffering n'est pas directement lié à l'avertissement. Il est généralement nécessaire pour optimiser les opérations du proxy et le fait de le désactiver dégrade les performances et le débit.

Nginx vous avertit uniquement lorsqu'une réponse ne tient pas dans les tampons de mémoire configurés. Vous pouvez ignorer cet avertissement si cela ne vous pose pas de problème.

  1. Quand une réponse déclenche-t-elle cette option ? Lorsqu'il faut plus de quelques secondes (combien ?) pour servir la réponse ? Est-ce que cela est configurable ?

Il se déclenche lorsque les tampons de mémoire sont pleins. S'il vous plaît, regardez les docs, le mécanisme entier est expliqué : http://nginx.org/r/proxy_max_temp_file_size

Vous pouvez augmenter les tampons de mémoire.

32voto

Haluk Points 873

La configuration suivante fonctionne bien sur mon serveur.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X