6 votes

Comment utiliser les variables dans le nom de fichier access_log avec Nginx (healthd)

J'ai une configuration multi-conteneurs dans AWS. J'essaie de suivre cette procédure : http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/health-enhanced-serverlogs.html

Cependant (avec la dernière version de Nginx - 1.9.12), dès que j'essaie d'utiliser des variables dans le nom du fichier, des erreurs apparaissent dans le journal des erreurs et le fichier lui-même n'est pas créé.

error.log :

2016/03/10 05:57:38 [error] 6#6: *1 testing "/etc/nginx/html" existence failed (2: No such file or directory) while logging request, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /v1/service?staus=ok HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8088/v1/service?staus=ok", host: "xxx.xxx.xxx.xxx"

Cette configuration ne fonctionne pas :

upstream app_v1 {
  server app_v1:8088;
}

map $http_upgrade $connection_upgrade {
  default        "upgrade";
  ""            "";
}

log_format healthd '$msec"$uri"'
          '$status"$request_time"$upstream_response_time"'
          '$http_x_forwarded_for';

server {
  listen 80;
  server_name localhost;

  gzip on;
  gzip_comp_level 4;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

  if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
    set $year $1;
    set $month $2;
    set $day $3;
    set $hour $4;
  }

  access_log /var/log/nginx/access.log main;
  access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;

  location ~* ^/ {
    proxy_pass         http://app_v1;
    proxy_redirect     off;

    proxy_set_header   Connection      $connection_upgrade;
    proxy_set_header   Upgrade         $http_upgrade;
    proxy_set_header   Host            $host;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

Et celui-ci fonctionne bien :

upstream app_v1 {
  server app_v1:8088;
}

map $http_upgrade $connection_upgrade {
  default        "upgrade";
  ""            "";
}

log_format healthd '$msec"$uri"'
          '$status"$request_time"$upstream_response_time"'
          '$http_x_forwarded_for';

server {
  listen 80;
  server_name localhost;

  gzip on;
  gzip_comp_level 4;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

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

  location ~* ^/ {
    proxy_pass         http://app_v1;
    proxy_redirect     off;

    proxy_set_header   Connection      $connection_upgrade;
    proxy_set_header   Upgrade         $http_upgrade;
    proxy_set_header   Host            $host;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

Cependant le service healthd (améliorer la santé) recherche un fichier formaté :

/var/log/nginx/healthd/application.log.$year-$month-$day-$hour

Je peux reproduire cela localement en utilisant docker-compose. Je ne suis pas sûr de ce qui me manque ici.

Maxime

0 votes

Même si ça ne résout probablement pas votre cas, mkdir /etc/nginx/html devrait supprimer l'erreur que vous mentionnez.

5voto

Alexey Ten Points 7572

C'est un piège fréquent. Doc sur access_log dit :

Le chemin du fichier peut contenir des variables (0.7.6+), mais ces journaux ont certaines contraintes :

  • ...
  • lors de chaque écriture dans le journal, l'existence de l'objet de la demande. répertoire racine est vérifié, et s'il n'existe pas, le journal est non créé .

Vous n'avez pas défini de répertoire racine, donc nginx se rabat sur celui par défaut qui est /etc/nginx/html et il n'existe pas.

Il suffit d'ajouter root /var/www; (ou un autre chemin existant) ou, comme le suggère zezollo, créer /etc/nginx/html .

0 votes

Je dois dire que le débogage error_log le mode n'aide pas du tout...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X