web-dev-qa-db-fra.com

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

J'ai une application web plutôt grande et lente (données complexes, interface complexe) dans RoR et servie par Puma avec nginx comme proxy inverse. En regardant le journal des erreurs nginx, je vois pas mal d'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 utilisateur, et je ne pense pas que la mise en mémoire tampon de la réponse sur le disque soit nécessaire/utile.

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

Mes questions sont:

  1. Comment puis-je supprimer le [avertir] 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-elle la réponse mise en mémoire tampon, à qui et pourquoi?

  3. Pourquoi nginx tourne proxy_buffering activé par défaut, puis [vous avertir] s'il tamponne réellement une réponse?

  4. Quand une réponse déclenche-t-elle cette option? Quand cela prend> quelques secondes (combien?) Pour répondre? Est-ce configurable?

TIA, ngw.

71
ngw

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

Vous devez définir proxy_max_temp_file_size à 0 pour le supprimer. Le proxy_buffering la directive n'est pas directement liée à l'avertissement. Vous pouvez le désactiver pour arrêter toute mise en mémoire tampon, mais ce n'est pas recommandé en général (sauf si cela est nécessaire pour Comet ).

2) Si nginx met en mémoire tampon une réponse, quand la sert-elle, à qui et pourquoi?

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

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

3) Pourquoi nginx active proxy_buffering par défaut, puis vous [prévient] s'il tamponne réellement 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 des opérations de proxy optimisées et sa désactivation dégrade les performances et le débit.

Nginx vous avertit uniquement lorsqu'une réponse ne rentre pas dans les tampons de mémoire configurés. Vous pouvez ignorer l'avertissement si cela vous convient.

4) Quand une réponse déclenche-t-elle cette option? Quand il faut plus de quelques secondes (combien?) Pour répondre? Est-ce configurable?

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

Vous souhaiterez peut-être augmenter la mémoire tampon.

88
VBart

La configuration suivante fonctionne bien sur mon serveur.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
16
Haluk