Como usar variáveis em access_log filename com Nginx (healthd)

4

Eu tenho uma configuração de vários contêineres na AWS. Estou tentando seguir isso: link

No entanto (usando o último Nginx - 1.9.12), assim que eu tento usar variáveis no nome do arquivo eu começo a ver erros no log de erros, e o próprio arquivo não é criado.

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"

Esta configuração não está funcionando:

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;
  }
}

E este está funcionando bem:

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;
  }
}

No entanto, o serviço healthd (melhorar a integridade) está procurando por um arquivo formatado:

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

Eu posso reproduzir isso localmente usando o docker-compose. Não tenho certeza do que sinto falta aqui.

Maxime

    
por maxwell2022 10.03.2016 / 07:01

1 resposta

3

Essa é uma armadilha comum. Doc em access_log diz:

The file path can contain variables (0.7.6+), but such logs have some constraints:

  • ...
  • during each log write the existence of the request’s root directory is checked, and if it does not exist the log is not created.

Você não definiu o diretório raiz para que o nginx retorne ao padrão um que seja /etc/nginx/html e não exista.

Basta adicionar root /var/www; (ou algum outro caminho existente) ou, como zezollo sugeriu, criar /etc/nginx/html .

    
por 10.03.2016 / 08:26