remplacement de la directive nginx access_log - entrées de journal en double

16

J'utilise le package nginx par défaut sur le serveur Ubuntu 14.04. Il utilise /etc/nginx/nginx.confcomme configuration principale, puis inclut les configurations depuis /etc/nginx/conf.d/*.confet /etc/nginx/sites-enabled/*.

La configuration par défaut de nginx a cette directive pour se connecter au journal d'accès

access_log /var/log/nginx/access.log;

Je voudrais ajouter l'en-tête X-Forwarded-For, donc je fais cela à l'intérieur du conf.ddossier:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

Le problème que j'ai est que j'obtiens alors deux enregistrements dans mon fichier access.log - un avec les informations d'en-tête et un autre sans.

Je sais que je peux écraser le nginx.conffichier lui-même, mais je préfère l'éviter si possible. Je voudrais également continuer à utiliser le même fichier journal ( access.log).

Existe-t-il un moyen de dire à nginx de remplacer la directive précédente et de simplement changer le format du journal sans modifier le nginx.conffichier principal ?

Yoav Aner
la source
Nan. Il suffit de le supprimer de nginx.conf
Alexey Ten
1
J'ai ouvert un ticket pour cela; trac.nginx.org/nginx/ticket/1084
cweiske

Réponses:

4

la réponse à votre question est NON, vous ne pouvez pas remplacer un log_format à n'importe quel niveau dans nginx et vous ne pouvez pas remplacer access_log au même niveau, sauf le désactiver. Cependant, vous pouvez réaliser ce que vous vouliez sans changer nginx.conf mais vous devrez le faire au niveau du serveur {}.

Le problème ici est que l'inclusion de conf.d / * est à l'intérieur de http {}, qui est exactement où se trouve la directive access_log. Ce que vous pouvez faire sans toucher nginx.conf, c'est changer le serveur {} que vous utilisez (si vous n'en avez pas configuré un, vous utilisez celui par défaut situé dans / etc / nginx / sites-enabled / default). Donc, pour obtenir le même résultat sans modifier nginx.conf, vous devez modifier votre fichier dans le dossier conf.d en: log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log off;

Et puis à l'intérieur de votre serveur {} mettez: access_log /var/log/nginx/access.log main;

Cela devrait vous donner ce que vous vouliez au début.

Valeur
la source
Merci, ça marche très bien. Sauf qu'il y a généralement déjà un mainlog_format, de sorte que vous devez choisir un autre nom.
Kutzi