我正在使用Nginx在64位Amazon Linux / 4.5.0上运行的配置Node.js在AWS的Elastic Beanstalk上运行应用程序。

我想将请求标题“X-My-Header”作为字段添加到access.log。除非如此,否则我将使用复合的默认nginx日志+我的 header 创建一个新的日志文件。我已经找到了几个专门有关使用nginx进行日志记录的类似问题,但是EB方面引发了一个额外的问题,即如何通过/.ebextensions配置文件更新nginx配置。

我已经完成了创建日志文件的工作,但其中没有任何内容。我也尝试过仅更新access.log文件,但这似乎也没有。我看到其他人添加 header 会使用格式“$ http_”,并且似乎HTTP请求 header “X-Header-Example”的格式设置为“$ http_header_example”(请参见nginx复合默认值中的“$ http_user_agent”) ,尽管不想浪费时间,但请注意,我同时添加了“$ http_x-my-header”和“$ http_x_my_header”。

尝试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 dashbaord导出日志时,new_log.log现在出现在var/log/nginx中。但是,它完全是空的。

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

我的解决方案主要基于this medium article 2.1节。但是,当我尝试将container_command添加到我的.config文件时,我的整个环境都停止了工作。我必须还原到其他部署,然后重建环境以使其再次运行。

有小费吗?

我的目标是将此请求 header 与传入的请求关联。理想情况下,我可以更新现有的默认access.log。我将准备一个单独的文件。或者,如果您对我如何能够获得此信息有任何其他建议,我无所不能!谢谢。

编辑新尝试:

Here表明您可以完全替换默认的nginx.config,因此我尝试删除其他文件,而是从以前的medium article复制/粘贴默认文件到/.ebextensions/nginx/nginx.config文件,除了在此处添加更改。我更新了log_format main以包括我的"$http_x_my_header"值。

不幸的是,部署失败并显示以下消息:

应用程序版本中的配置文件.ebextensions / nginx / nginx.config包含无效的YAML或JSON。 YAML异常:无效的Yaml:预期为”,但在“”的第7行第1列中找到了标量:include / usr / share / nginx / modules ... ^,JSON异常:无效的JSON:位置处的字符(u)为意外字符0 ..更新配置文件。

令人反感的行是include /usr/share/nginx/modules,该行存在并且在中型文章提供的默认设置下工作正常。

我希望这是一个肮脏的解决方法,至少可以从中得到一些结果,但是,las,这似乎还有另一个障碍。

最佳答案

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

AWS EB + nginx: Update access.log format to obfuscate sensitive get request parameters

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

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

有关更多详细信息,请参见上面链接的答案,其中提供了有关该过程的更多信息。

07-26 09:41