如何使用Nginx的access_log filename中的variables(healthd)

我有一个在AWS的多容器设置。 我试图按照这个: http : //docs.aws.amazon.com/elasticbeanstalk/latest/dg/health-enhanced-serverlogs.html

然而(尽量使用最新的Nginx – 1.9.12),只要我尝试在文件名中使用variables,我就会在错误日志中看到错误,并且不会创build文件本身。

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" 

此configuration不起作用:

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

而这一个工作正常:

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

然而,健康的服务(增强健康)正在寻找一个格式化的文件:

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

我可以用docker-compose在本地重现这个。 我不知道我在这里错过了什么。

马克西姆

这是一个常见的陷阱。 关于access_log文件说:

文件path可以包含variables(0.7.6+),但是这样的日志有一些限制:

  • 在每个日志写入期间检查请求的根目录是否存在,如果不存在则不创build日志。

你没有设置根目录,所以nginx退回到/etc/nginx/html默认目录,并且它不存在。

只需添加root /var/www; (或其他一些现有的path),或者,如zezollobuild议,创build/etc/nginx/html