AWS EB + Nginx,更新 access.log 格式或创建新日志

AWS EB + Nginx, update access.log format or create new log

我是 运行 AWS Elastic Beanstalk 上的一个应用程序,使用配置 Node.js 运行 在 64 位亚马逊 Linux/4.5.0 上使用 Nginx。

我想将请求 header "X-My-Header" 作为字段添加到 access.log。除此之外,我会使用复合默认 nginx 日志 + 我的 header 创建一个新的日志文件。我发现了几个类似的问题,特别是关于使用 nginx 进行日志记录,但是 EB 方面引发了一个额外的曲线球,即如何通过 /.ebextensions 配置文件更新 nginx 配置。

我已经完成创建 日志文件,但它没有填充任何内容。我也试过只更新 access.log 文件,但这似乎也没有发生。我看到其他人添加 headers 会使用格式“$http_”,似乎 "X-Header-Example" 的 http 请求 header 被格式化为“$http_header_example”(请参阅 nginx 复合默认值中的“$http_user_agent”),虽然不想在假设上浪费时间,但请注意我同时添加了“$http_x-my-header”和“$[=72” =]".

尝试 1:更新现有 access.log 格式

files:
  /etc/nginx/conf.d/01_proxy.conf:
      owner: root
      group: root
      content: |
          log_format my_log_format '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" - "$http_x_my_header" - "$http_x-my-header"';
          access_log /var/log/nginx/access.log my_log_format;

结果:access.log 不包括任何附加字段。它甚至没有空的 ""-.

尝试 2:创建新的日志文件

files:
  /etc/nginx/conf.d/01_proxy.conf:
      owner: root
      group: root
      content: |
          log_format my_log_format '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" - "$http_x_my_header" - "$http_x-my-header"';
          access_log /var/log/nginx/new_log.log my_log_format;

结果:当我从 EB 仪表板导出日志时,new_log.log 现在出现在 var/log/nginx 中。然而,它完全是空的。

我阅读了一些其他类似的问题,提到删除文件并重新启动服务器有时会有所帮助。我尝试重新启动应用程序,甚至通过 EB 仪表板完全重建环境,都没有导致不同的结果。

我的解决方案主要基于 this medium article,第 2.1 节。但是,当我尝试将 container_command 添加到我的 .config 文件时,我的整个环境停止工作。我不得不恢复到不同的部署,然后重建环境以再次获取它 运行。

有什么建议吗?

我的目标是将此请求 header 与传入的请求相关联。理想情况下,我可以更新现有的默认值 access.log。我将解决一个单独的文件。或者,如果您对我如何能够访问此信息有任何其他建议,我会洗耳恭听!谢谢。

编辑新尝试:

Here it shows that you can completely replace the default nginx.config, so I tried removing my other file and instead copy/pasting the default from the medium article 从之前到 /.ebextensions/nginx/nginx.config 文件,除了在那里添加我的更改。我更新了 log_format main 以包含我的 "$http_x_my_header" 值。

很遗憾,部署失败并显示此消息:

The configuration file .ebextensions/nginx/nginx.config in application version contains invalid YAML or JSON. YAML exception: Invalid Yaml: expected '', but found Scalar in "", line 7, column 1: include /usr/share/nginx/modules ... ^ , JSON exception: Invalid JSON: Unexpected character (u) at position 0.. Update the configuration file.

有问题的行是 include /usr/share/nginx/modules,它在媒体文章提供的默认设置中存在并且工作正常。

我希望这将是一个肮脏的修复程序,我至少可以从中得到一些结果,但是,唉,它似乎还有另一个障碍。

我已经通过我自己在类似问题中的回答回答了这个问题:

简而言之:对于节点 AWS EB 环境,nginx 配置的服务器指令存在于自动生成的 00_elastic_beanstalk_proxy.conf 文件中。在这里,他们调用 access_log /var/log/nginx/access.log main,因此添加试图更改 access_log 的 ebextension 配置会被覆盖。

我的解决方案是双重的:通过上传基于默认设置的自定义 nginx.conf 来覆盖主 log_format(AWS 说你可以这样做,但建议你拉取默认创建的那个,并在更新环境图像的版本时重新检查它),我还必须对自动生成的文件执行相同的操作以执行一些设置我想要记录的新变量的逻辑。

有关详细信息,请参阅上面链接的答案,其中包含有关该过程的更多信息。

我的解决方案是覆盖 nginx.conf。

nodejs平台的AWS doc是删除已有的/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf,替换成自己的config。我已经测试过它也能正常工作。对于Docker平台,需要删除/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf.

以下代码仅适用于 docker 平台。版本:64 位亚马逊 Docker 运行 Linux/2.16.7

您应该在您的平台中找到 nginx.conf 的默认代码。

将 .ebextensions/nginx/00-my-proxy.config 添加到您的构建文件夹

files:
  /etc/nginx/nginx.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
        # Elastic Beanstalk Nginx Configuration File

        user  nginx;
        worker_processes  auto;

        error_log  /var/log/nginx/error.log;

        pid /var/run/nginx.pid;

        events {
            worker_connections  1024;
        }

        http {
          include /etc/nginx/mime.types;
          default_type application/octet-stream;

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

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

          upstream docker {
              server 172.17.0.2:3000;
              keepalive 256;
          }
          log_format timed_combined '"$http_x_forwarded_for"'
                      '$remote_addr - $remote_user [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent" '
                      '$request_time $upstream_response_time $pipe';


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

          server {
              listen 80;

                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 ;
                    set $month ;
                    set $day ;
                    set $hour ;
                }
                access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;

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

                location / {
                    proxy_pass            http://docker;
                    proxy_http_version    1.1;

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

在EB docker平台中,Nginx config中的服务器块在另一个文件中 /etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf

server {
    listen 80;
     access_log    /var/log/nginx/access.log;
}

入口配置nginx.conf是

    include       /etc/nginx/conf.d/*.conf;
    include       /etc/nginx/sites-enabled/*;

因此添加此自定义配置只会导致此结果 - 空日志文件。

files:
  /etc/nginx/conf.d/01_proxy.conf:
      owner: root
      group: root
      content: |
          log_format my_log_format '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" - "$http_x_my_header" - "$http_x-my-header"';
          access_log /var/log/nginx/new_log.log my_log_format;
   log_format ...
   access_log ...
   server {
       ...
   }

我已经在my github中写下了细节。