nginx - le corps de la demande du client est mis en mémoire tampon dans un fichier temporaire

49

L'erreur suivante apparaît dans mes fichiers journaux chaque fois que j'essaie de télécharger un fichier volumineux.

a client request body is buffered to a temporary file /var/lib/nginx/body/0000000001

Bien que le fichier soit chargé avec succès, j'obtiens toujours l'erreur ci-dessus.

J'ai augmenté la client_body_buffer_sizeà 1000mqui est ce que je pense le plus grand fichier téléchargé pour être. Cependant, c'était juste une supposition et bien que je ne reçois plus cette erreur, je me demande si c'est une valeur appropriée à définir pour le client_body_buffer_size?

J'apprécierais que quiconque puisse nous éclairer sur cette directive et sur la manière dont elle devrait être utilisée.

Abdos
la source
2
J'ai ce n'est pas téléchargé avec succès.
Ben

Réponses:

51

Ceci est un avertissement, pas une erreur. C'est pourquoi il a été préfacé [warn]dans le journal.

Cela signifie que la taille du fichier téléchargé était plus grande que la mémoire tampon réservée aux téléchargements.

La directive client_body_buffer_sizecontrôle la taille de ce tampon.

Si vous pouvez vous permettre d'avoir 1 Go de RAM toujours réservé pour le téléchargement de fichier occasionnel, c'est très bien. Il s'agit d'une optimisation des performances consistant à mettre en mémoire tampon le téléchargement dans la RAM plutôt que dans un fichier temporaire sur disque, bien qu'avec quelques téléchargements aussi importants, quelques secondes de plus n'ont probablement pas beaucoup d'importance. Si la plupart de vos téléchargements sont petits, c'est probablement un gaspillage.

En fin de compte, vous seul pouvez réellement décider de la taille appropriée.

Michael Hampton
la source
5
Votre réponse m'a aidé à prendre une décision. Je vais réduire la valeur à environ 512k à 1m. C'est dommage que je reçoive beaucoup de ces avertissements.
Abs
En raison de la mémoire virtuelle , l'utilisation d'une valeur élevée n'entraînera pas "1 Go de RAM toujours réservé pour le téléchargement occasionnel de fichiers". (Pas plus de RAM que nécessaire pour le téléchargement actuel ne sera utilisé.)
Kirill Bulygin
1
Si je règle ce paramètre à 50 Mo et que 200 personnes regardent une page au même instant, cela occupera-t-il 10 Go de mémoire ou les 50 Mo ne seront-ils alloués qu'aux utilisateurs effectuant un téléchargement de fichier?
Codemonkey
@ Codemonkey Ce tampon n'est utilisé que lorsqu'un corps de requête est en cours de téléchargement. Une fois le téléchargement terminé, la mémoire est libre d’être utilisée pour une autre demande. Et comme l’a souligné l’autre intervenant, aucun téléchargement n’est utilisé, même si un téléchargement n’est pas en cours. Cela dépend donc du nombre de téléchargements simultanés que vous effectuez à un moment donné.
Michael Hampton
Souvent dix, probablement jamais plus de 20. Boîte de 128 Go donc j'ai beaucoup de mémoire ..! Honnêtement, je le ferais simplement pour me débarrasser de ces lignes [avertir] dans mon journal des erreurs - je devrais probablement les ignorer!
Codemonkey
18

Si vous ne voulez pas que NginX stocke le contenu du corps dans un fichier temporaire, vous pouvez définir votre configuration. comme ça:

    client_body_buffer_size     10M;
    client_max_body_size        10M;

Si vous définissez ces deux configurations au même maximum. taille (en k, M ou G pour kB, Mo ou Go, respectivement), vous éviterez que NginX crée une temp. fichier.

Pour plus d'informations: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size et http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

Eddy85br
la source
8
Mais avec cette configuration, vous empêcherez également tous les téléchargements supérieurs à 10 Mo
Josef
@Josef: Pas prévenir par aucun moyen. La requête doit simplement être mise en mémoire tampon sur le disque et vous recevrez l'avertissement. Vérifiez la réponse acceptée.
OmarOthman
9
@OmarOthman, Josef a raison à cause du client_max_body_sizeparamètre. Voir l'info sur ce lien: client_max_body_size doc. : Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.
eddy85br