web-dev-qa-db-fra.com

Journalisation réelle du corps de requête POST (au lieu de "-") avec nginx

J'essaie de me connecter POST body, et d'ajouter $request_body à la log_format dans http clause, mais le access_log commande affiche simplement "-" comme le corps après avoir envoyé POST en utilisant:

curl -d name=xxxx myip/my_location

Mon format_log (dans la clause http):

log_format client '$remote_addr - $remote_user $request_time $upstream_response_time '
                  '[$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

Ma définition d'emplacement (dans la clause serveur):

location = /c.gif {  
  empty_gif;  
  access_log logs/uaa_access.log client;  
}

Comment puis-je imprimer les données réelles POST de curl?

25
Shawn

Nginx n'analyse pas le corps de la demande du client à moins que cela ne soit vraiment nécessaire, donc il ne remplit généralement pas le $request_body variable.

Les exceptions sont les suivantes:

  • il envoie la demande à un proxy,
  • ou un serveur fastcgi.

Vous devez donc vraiment ajouter le proxy_pass ou fastcgi_pass directives à votre bloc.

Le moyen le plus simple est de l'envoyer à Nginx lui-même en tant que serveur proxy, par exemple avec cette configuration:

location = /c.gif {  
    access_log logs/uaa_access.log client;
    # add the proper port or IP address if Nginx is not on 127.0.0.1:80
    proxy_pass http://127.0.0.1/post_gif; 
}
location = /post_gif {
    # turn off logging here to avoid double logging
    access_log off;
    empty_gif;  
}

Si vous vous attendez à recevoir uniquement des valeurs de paires de clés, il peut être judicieux de limiter la taille du corps de la demande:

client_max_body_size 1k;
client_body_buffer_size 1k;
client_body_in_single_buffer on;

J'ai également reçu des erreurs "405 non autorisées" lors des tests à l'aide de empty_gif; et curl (c'était ok depuis le navigateur), je l'ai changé en return 200; pour tester correctement avec curl.

55
Capilé