La journalisation des données POST à partir de $request_body
J'ai ma config configuration pour gérer un tas de requêtes GET qui rendre des pixels qui fonctionnent bien pour gérer analytics et d'analyser les chaînes de requête pour la journalisation. Avec une troisième partie du flux de données, j'ai besoin de gérer une requête POST vers une url donnée qui a JSON dans un attendu exploitables d'ici format à l'intérieur du corps de la requête. Je ne veux pas utiliser un serveur secondaire avec proxy_pass
et vous voulez juste pour se connecter à l'ensemble de la réponse dans un fichier journal associé, comme ce qu'il fait avec les requêtes GET. Un extrait de code que je suis en utilisant ressemble à ce qui suit:
Requête GET (qui fonctionne très bien):
location ^~ /rl.gif {
set $rl_lcid $arg_lcid;
if ($http_cookie ~* "lcid=(.*\S)")
{
set $rl_lcid $cookie_lcid;
}
empty_gif;
log_format my_tracking '{ "guid" : "$rl_lcid", "data" : "$arg__rlcdnsegs" }';
access_log /mnt/logs/nginx/my.access.log my_tracking;
rewrite ^(.*)$ http://my/url?id=$cookie_lcid? redirect;
}
Ici est un peu ce que je suis en train de faire:
Requête POST (qui ne fonctionne pas):
location /bk {
log_format bk_tracking $request_body;
access_log /mnt/logs/nginx/bk.access.log bk_tracking;
}
Curling curl http://myurl/bk -d name=example
me donne une erreur 404 page non trouvée.
Ensuite, j'ai essayé:
location /bk.gif {
empty_gif;
log_format bk_tracking $request_body;
access_log /mnt/logs/nginx/bk.access.log bk_tracking;
}
Curling curl http://myurl/bk.gif -d name=example
me donne un 405 Not Allowed
.
Ma version actuelle est nginx/0.7.62
. Toute aide dans la bonne direction est très apprécié! Merci!
Mise à JOUR
Alors maintenant, mon post ressemble à ceci:
location /bk {
if ($request_method != POST) {
return 405;
}
proxy_pass $scheme://127.0.0.1:$server_port/dummy;
log_format my_tracking $request_body;
access_log /mnt/logs/nginx/my.access.log my_tracking;
}
location /dummy { set $test 0; }
C'est la journalisation des données post correctement, mais renvoie une erreur 404 sur les demandeurs de la fin. Si je change le code ci-dessus pour retourner un de 200 de la sorte:
location /bk {
if ($request_method != POST) {
return 405;
}
proxy_pass $scheme://127.0.0.1:$server_port/dummy;
log_format my_tracking $request_body;
access_log /mnt/logs/nginx/my.access.log my_tracking;
return 200;
}
location /dummy { set $test 0; }
Puis retourner la 200
correctement, mais n'enregistre plus les données post.
UNE AUTRE MISE À JOUR
Un peu trouvé une solution qui fonctionne. J'espère que cela peut aider les autres sur leur chemin.
- avez-vous obtenir n'importe où avec ça? Je suis face à un problème similaire.
- Au lieu de faire la
set $test 0;
essayer de fairereturn 200;
de la tétine, l'emplacement, pour moi, il retourne alors à 200 comme prévu, et j'ai le corps connecté toujours.
Vous devez vous connecter pour publier un commentaire.
Cette solution fonctionne comme un charme (mis à jour en 2017 pour l'honneur que log_format doit être dans le http cadre de la config nginx):
Je pense que le truc est de faire de nginx croire que vous allez appeler un script cgi.
log_format
partie. Mais dans mon cas, j'ai dû déplacer à l'intérieur de la "http bloc, au lieu de l'intérieur de la "server" bloc, pour que cela fonctionne. Mais cela a fait l'affaire!log_format
ligne au-dessus de la partie serveur. Mais ensuite, il a bien fonctionné. ( nginx/1.9.3 )Essayer echo_read_request_body.
"echo_read_request_body ... Explicitement lit du corps de la requête, de sorte que la somme de request_body variable aura toujours les valeurs non vides (à moins que le corps est tellement grand qu'il a été sauvé par Nginx à un fichier temporaire)."
apt-get install nginx-full
request_body
disparaîtrequest_body
disparaissent, ou, pourquoi ce serait sensés.Ok. Donc, finalement, j'ai été en mesure de se connecter au poste de données et le retour d'un de 200. C'est une sorte de hacky solution que je ne suis pas trop fier de qui, fondamentalement, remplace le comportement naturel pour error_page, mais mon inexpérience de nginx plus échéanciers m'amènent à cette solution:
Maintenant selon cette configuration, il semblerait que le proxy pass serait de retour de 200 tout le temps. Parfois, je voudrais obtenir 500 mais quand je l'ai jeté dans un error_log pour voir ce qui se passait, tous mes request_body de données était là et je ne pouvais pas voir un problème. J'ai donc pris cela et a écrit au même journal. Depuis nginx n'aime pas le même nom pour la variable de suivi, j'ai juste utilisé my_tracking_2 et écrit le même journal que lorsqu'elle retourne un 200. Certainement pas la solution la plus élégante et je souhaite la bienvenue à une meilleure solution. J'ai vu le post de module, mais dans mon scénario, je n'arrivais pas à recompiler à partir de la source.
FWIW, cette configuration a fonctionné pour moi:
nginx
format de journal prises à partir d'ici: http://nginx.org/en/docs/http/ngx_http_log_module.htmlpas besoin d'installer quoi que ce soit extra
a fonctionné pour moi pour
GET
etPOST
demandes:il suffit de changer
upstream_ip
etupstream_port
La solution ci-dessous a été le meilleur format que j'ai trouvé.
Pour cette entrée
Générer ce grand résultat
J'ai eu un problème similaire. Les requêtes GET travaillé et leur (vide) le corps d'une requête ai écrit dans le fichier journal. POST demande a échoué avec une erreur 404. Expérimenter un peu, j'ai trouvé que tous POST demandes ont été un échec. J'ai trouvé un forum de demander à propos des requêtes POST et la solution n'a fonctionné pour moi. Cette solution? Ajouter un
proxy_header
ligne droite avant leproxy_pass
ligne, exactement comme dans l'exemple ci-dessous.(C'est avec nginx 1.2.1 pour ce qu'il vaut.)